gsl-2.6/0000755016036000116100000000000013527016564007157 500000000000000gsl-2.6/INSTALL0000644016036000116100000003661013373111454010127 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.6/NEWS0000644016036000116100000021477413521374775007622 00000000000000* What is 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.6/README0000644016036000116100000000501413373111454007750 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.6/AUTHORS0000644016036000116100000000356113373111454010145 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, 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.6/ChangeLog0000644016036000116100000007432613373111454010656 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.6/Makefile.in0000644016036000116100000015600513527016360011145 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # AUTOMAKE_OPTIONS = readme-alpha VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = gsl-randist$(EXEEXT) gsl-histogram$(EXEEXT) subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs $(srcdir)/gsl_version.h.in \ $(srcdir)/gsl.spec.in depcomp $(noinst_HEADERS) \ $(pkginclude_HEADERS) test-driver COPYING THANKS TODO \ config.guess config.sub install-sh mdate-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gsl_version.h gsl.spec CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libgsl_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(SUBLIBS) am_libgsl_la_OBJECTS = version.lo libgsl_la_OBJECTS = $(am_libgsl_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgsl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgsl_la_LDFLAGS) $(LDFLAGS) -o $@ PROGRAMS = $(bin_PROGRAMS) am_gsl_histogram_OBJECTS = gsl-histogram.$(OBJEXT) gsl_histogram_OBJECTS = $(am_gsl_histogram_OBJECTS) gsl_histogram_DEPENDENCIES = libgsl.la cblas/libgslcblas.la am_gsl_randist_OBJECTS = gsl-randist.$(OBJEXT) gsl_randist_OBJECTS = $(am_gsl_randist_OBJECTS) gsl_randist_DEPENDENCIES = libgsl.la cblas/libgslcblas.la SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsl_la_SOURCES) $(gsl_histogram_SOURCES) \ $(gsl_randist_SOURCES) DIST_SOURCES = $(libgsl_la_SOURCES) $(gsl_histogram_SOURCES) \ $(gsl_randist_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(m4data_DATA) $(pkgconfig_DATA) HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = gsl utils sys test err 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 gsl_version.h: $(top_builddir)/config.status $(srcdir)/gsl_version.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ gsl.spec: $(top_builddir)/config.status $(srcdir)/gsl.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsl.la: $(libgsl_la_OBJECTS) $(libgsl_la_DEPENDENCIES) $(EXTRA_libgsl_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsl_la_LINK) -rpath $(libdir) $(libgsl_la_OBJECTS) $(libgsl_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list gsl-histogram$(EXEEXT): $(gsl_histogram_OBJECTS) $(gsl_histogram_DEPENDENCIES) $(EXTRA_gsl_histogram_DEPENDENCIES) @rm -f gsl-histogram$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gsl_histogram_OBJECTS) $(gsl_histogram_LDADD) $(LIBS) gsl-randist$(EXEEXT): $(gsl_randist_OBJECTS) $(gsl_randist_DEPENDENCIES) $(EXTRA_gsl_randist_DEPENDENCIES) @rm -f gsl-randist$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gsl_randist_OBJECTS) $(gsl_randist_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsl-histogram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsl-randist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-m4dataDATA: $(m4data_DATA) @$(NORMAL_INSTALL) @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(m4datadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(m4datadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \ done uninstall-m4dataDATA: @$(NORMAL_UNINSTALL) @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_SCRIPTS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test_gsl_histogram.sh.log: test_gsl_histogram.sh @p='test_gsl_histogram.sh'; \ b='test_gsl_histogram.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ $(HEADERS) config.h install-binPROGRAMS: install-libLTLIBRARIES installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-m4dataDATA install-pkgconfigDATA \ install-pkgincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS \ install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-libLTLIBRARIES uninstall-m4dataDATA \ uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS .MAKE: $(am__recursive_targets) all check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-TESTS check-am clean clean-binPROGRAMS \ clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-binPROGRAMS \ install-binSCRIPTS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-m4dataDATA install-man \ install-pdf install-pdf-am install-pkgconfigDATA \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-binSCRIPTS uninstall-libLTLIBRARIES \ uninstall-m4dataDATA uninstall-pkgconfigDATA \ uninstall-pkgincludeHEADERS gsl-config gsl.pc: Makefile @rm -f $@ $@.tmp @$(edit) '$(srcdir)/$@.in' >>$@.tmp @chmod a-w $@.tmp @mv $@.tmp $@ @echo creating $@ gsl-config: $(srcdir)/gsl-config.in gsl.pc: $(srcdir)/gsl.pc.in # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/Makefile.am0000644016036000116100000000676213377336121011143 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.6/configure0000755016036000116100000157301413527016356011020 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for gsl 2.6. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsl' PACKAGE_TARNAME='gsl' PACKAGE_VERSION='2.6' PACKAGE_STRING='gsl 2.6' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gsl_math.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS HAVE_DARWIN86_IEEE_INTERFACE HAVE_DARWIN_IEEE_INTERFACE HAVE_OPENBSD_IEEE_INTERFACE HAVE_NETBSD_IEEE_INTERFACE HAVE_OS2EMX_IEEE_INTERFACE HAVE_FREEBSD_IEEE_INTERFACE HAVE_AIX_IEEE_INTERFACE HAVE_IRIX_IEEE_INTERFACE HAVE_TRU64_IEEE_INTERFACE HAVE_HPUX_IEEE_INTERFACE HAVE_HPUX11_IEEE_INTERFACE HAVE_SOLARIS_IEEE_INTERFACE HAVE_SUNOS4_IEEE_INTERFACE HAVE_GNUX86_IEEE_INTERFACE HAVE_GNUPPC_IEEE_INTERFACE HAVE_GNUM68K_IEEE_INTERFACE HAVE_GNUSPARC_IEEE_INTERFACE LIBOBJS GSL_LIBADD GSL_LDFLAGS GSLCBLAS_LDFLAGS GSL_LIBM GSL_LIBS GSL_CFLAGS LIBM OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP LIBTOOL OBJDUMP DLLTOOL AS LN_S CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build GSL_MINOR_VERSION GSL_MAJOR_VERSION SED GSL_LT_CBLAS_VERSION GSL_LT_VERSION MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsl 2.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gsl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsl 2.6:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsl configure 2.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsl $as_me 2.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.13' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsl' VERSION='2.6' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE GSL_CURRENT=25 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 *+) ;; *) $as_echo "#define RELEASED /**/" >>confdefs.h ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed GSL_MAJOR_VERSION=`echo "$VERSION" | $SED 's/\([^.][^.]*\).*/\1/'` GSL_MINOR_VERSION=`echo "$VERSION" | $SED 's/[^.][^.]*.\([^.][^.]*\).*/\1/'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 $as_echo_n "checking whether char is unsigned... " >&6; } if ${ac_cv_c_char_unsigned+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(((char) -1) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_char_unsigned=no else ac_cv_c_char_unsigned=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 $as_echo "$ac_cv_c_char_unsigned" >&6; } if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h fi GSL_CFLAGS="-I$includedir" GSL_LIBS="-L$libdir -lgsl" LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 $as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _mwvalidcheckl (); int main () { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mw__mwvalidcheckl=yes else ac_cv_lib_mw__mwvalidcheckl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 $as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : LIBM="-lmw" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="$LIBM -lm" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="-lm" fi ;; esac GSL_LIBM=$LIBM if test "$ac_cv_c_inline" != no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU-style extern inline" >&5 $as_echo_n "checking for GNU-style extern inline... " >&6; } if ${ac_cv_c_extern_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_extern_inline=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern $ac_cv_c_inline double foo(double x); extern $ac_cv_c_inline double foo(double x) { return x + 1.0 ; } ; double foo (double x) { return x + 1.0 ; }; int main () { foo(1.0) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_extern_inline="yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_extern_inline" >&5 $as_echo "$ac_cv_c_extern_inline" >&6; } if test "$ac_cv_c_extern_inline" != no ; then $as_echo "#define HAVE_INLINE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99-style inline" >&5 $as_echo_n "checking for C99-style inline... " >&6; } if ${ac_cv_c_c99inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_c99inline=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern inline void* foo() { foo(); return &foo ; }; int main () { return foo() != 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_c99inline="yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_cv_c_c99inline" != no ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ inline void* foo() { foo(); return &foo ; }; int main () { return foo() != 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_cv_c_c99inline="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_c99inline" >&5 $as_echo "$ac_cv_c_c99inline" >&6; } if test "$ac_cv_c_c99inline" != no ; then $as_echo "#define HAVE_INLINE 1" >>confdefs.h $as_echo "#define HAVE_C99_INLINE 1" >>confdefs.h fi fi fi for ac_header in ieeefp.h do : ac_fn_c_check_header_mongrel "$LINENO" "ieeefp.h" "ac_cv_header_ieeefp_h" "$ac_includes_default" if test "x$ac_cv_header_ieeefp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_IEEEFP_H 1 _ACEOF fi done case $host in *-*-cygwin* | *-*-mingw* ) if test "$enable_shared" = yes; then GSLCBLAS_LDFLAGS="$GSLCBLAS_LDFLAGS -no-undefined" GSL_LDFLAGS="$GSL_LDFLAGS -no-undefined" GSL_LIBADD="cblas/libgslcblas.la" fi ;; esac for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" if test "x$ac_cv_func_memcpy" = xyes; then : $as_echo "#define HAVE_MEMCPY 1" >>confdefs.h else case " $LIBOBJS " in *" memcpy.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcpy.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" if test "x$ac_cv_func_memmove" = xyes; then : $as_echo "#define HAVE_MEMMOVE 1" >>confdefs.h else case " $LIBOBJS " in *" memmove.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memmove.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" if test "x$ac_cv_func_strdup" = xyes; then : $as_echo "#define HAVE_STRDUP 1" >>confdefs.h else case " $LIBOBJS " in *" strdup.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strdup.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" if test "x$ac_cv_func_strtol" = xyes; then : $as_echo "#define HAVE_STRTOL 1" >>confdefs.h else case " $LIBOBJS " in *" strtol.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtol.$ac_objext" ;; esac fi ac_fn_c_check_func "$LINENO" "strtoul" "ac_cv_func_strtoul" if test "x$ac_cv_func_strtoul" = xyes; then : $as_echo "#define HAVE_STRTOUL 1" >>confdefs.h else case " $LIBOBJS " in *" strtoul.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtoul.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXIT_SUCCESS and EXIT_FAILURE" >&5 $as_echo_n "checking for EXIT_SUCCESS and EXIT_FAILURE... " >&6; } if ${ac_cv_decl_exit_success_and_failure+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef EXIT_SUCCESS yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_decl_exit_success_and_failure=yes else ac_cv_decl_exit_success_and_failure=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_exit_success_and_failure" >&5 $as_echo "$ac_cv_decl_exit_success_and_failure" >&6; } if test "$ac_cv_decl_exit_success_and_failure" = yes ; then $as_echo "#define HAVE_EXIT_SUCCESS_AND_FAILURE 1" >>confdefs.h fi ; if test "x$LIBS" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi fi ac_fn_c_check_decl "$LINENO" "feenableexcept" "ac_cv_have_decl_feenableexcept" "#define _GNU_SOURCE 1 #include " if test "x$ac_cv_have_decl_feenableexcept" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEENABLEEXCEPT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fesettrapenable" "ac_cv_have_decl_fesettrapenable" "#define _GNU_SOURCE 1 #include " if test "x$ac_cv_have_decl_fesettrapenable" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FESETTRAPENABLE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "hypot" "ac_cv_have_decl_hypot" "#include " if test "x$ac_cv_have_decl_hypot" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_HYPOT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "expm1" "ac_cv_have_decl_expm1" "#include " if test "x$ac_cv_have_decl_expm1" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_EXPM1 $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "acosh" "ac_cv_have_decl_acosh" "#include " if test "x$ac_cv_have_decl_acosh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ACOSH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "asinh" "ac_cv_have_decl_asinh" "#include " if test "x$ac_cv_have_decl_asinh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ASINH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "atanh" "ac_cv_have_decl_atanh" "#include " if test "x$ac_cv_have_decl_atanh" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ATANH $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "ldexp" "ac_cv_have_decl_ldexp" "#include " if test "x$ac_cv_have_decl_ldexp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LDEXP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "frexp" "ac_cv_have_decl_frexp" "#include " if test "x$ac_cv_have_decl_frexp" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FREXP $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "fprnd_t" "ac_cv_have_decl_fprnd_t" "#include " if test "x$ac_cv_have_decl_fprnd_t" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPRND_T $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "isinf" "ac_cv_have_decl_isinf" "#include " if test "x$ac_cv_have_decl_isinf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISINF $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include " if test "x$ac_cv_have_decl_isfinite" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISFINITE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "finite" "ac_cv_have_decl_finite" "#include #if HAVE_IEEEFP_H #include #endif " if test "x$ac_cv_have_decl_finite" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FINITE $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "#include " if test "x$ac_cv_have_decl_isnan" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ISNAN $ac_have_decl _ACEOF case "$host" in *-*-*openbsd*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: avoiding OpenBSD system log1p - using gsl version" >&5 $as_echo "avoiding OpenBSD system log1p - using gsl version" >&6; } ;; *) ac_fn_c_check_decl "$LINENO" "log1p" "ac_cv_have_decl_log1p" "#include " if test "x$ac_cv_have_decl_log1p" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_LOG1P $ac_have_decl _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double stdio" >&5 $as_echo_n "checking for long double stdio... " >&6; } if ${ac_cv_func_printf_longdouble+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_printf_longdouble="no" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { const char * s = "5678.25"; long double x = 1.234 ; fprintf(stderr,"%Lg\n",x) ; sscanf(s, "%Lg", &x); if (x == 5678.25) {exit (0);} else {exit(1); }; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_printf_longdouble="yes" else ac_cv_func_printf_longdouble="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_printf_longdouble" >&5 $as_echo "$ac_cv_func_printf_longdouble" >&6; } if test "$ac_cv_func_printf_longdouble" != no; then $as_echo "#define HAVE_PRINTF_LONGDOUBLE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extended floating point registers" >&5 $as_echo_n "checking for extended floating point registers... " >&6; } if ${ac_cv_c_extended_fp+:} false; then : $as_echo_n "(cached) " >&6 else case "$host" in *sparc*-*-*) ac_cv_c_extended_fp=no ;; *powerpc*-*-*) ac_cv_c_extended_fp=no ;; *hppa*-*-*) ac_cv_c_extended_fp=no ;; *alpha*-*-*) ac_cv_c_extended_fp=no ;; *68k*-*-*) ac_cv_c_extended_fp=yes ;; *86-*-*) ac_cv_c_extended_fp=yes ;; x86_64-*-*) ac_cv_c_extended_fp=yes ;; *) ac_cv_c_extended_fp=unknown ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_extended_fp" >&5 $as_echo "$ac_cv_c_extended_fp" >&6; } if test $ac_cv_c_extended_fp != "no" ; then $as_echo "#define HAVE_EXTENDED_PRECISION_REGISTERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE arithmetic interface type" >&5 $as_echo_n "checking for IEEE arithmetic interface type... " >&6; } if ${ac_cv_c_ieee_interface+:} false; then : $as_echo_n "(cached) " >&6 else case "$host" in sparc-*-linux*) ac_cv_c_ieee_interface=gnusparc ;; m68k-*-linux*) ac_cv_c_ieee_interface=gnum68k ;; powerpc-*-linux*) ac_cv_c_ieee_interface=gnuppc ;; *86-*-gnu | *86_64-*-gnu | *86-*-linux* | *86_64-*-linux*) ac_cv_c_ieee_interface=gnux86 ;; *-*-sunos4*) ac_cv_c_ieee_interface=sunos4 ;; *-*-solaris*) ac_cv_c_ieee_interface=solaris ;; *-*-hpux11*) ac_cv_c_ieee_interface=hpux11 ;; *-*-hpux*) ac_cv_c_ieee_interface=hpux ;; *-*-osf*) ac_cv_c_ieee_interface=tru64 ;; *-*-aix*) ac_cv_c_ieee_interface=aix ;; *-*-irix*) ac_cv_c_ieee_interface=irix ;; powerpc-*-*darwin*) ac_cv_c_ieee_interface=darwin ;; *86-*-*darwin*) ac_cv_c_ieee_interface=darwin86 ;; *-*-*netbsd*) ac_cv_c_ieee_interface=netbsd ;; *-*-*openbsd*) ac_cv_c_ieee_interface=openbsd ;; *-*-*bsd*) ac_cv_c_ieee_interface=freebsd ;; *-*-os2*) ac_cv_c_ieee_interface=os2emx ;; *) ac_cv_c_ieee_interface=unknown ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_interface" >&5 $as_echo "$ac_cv_c_ieee_interface" >&6; } if test "$ac_cv_c_ieee_interface" = "gnux86" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FPU_SETCW" >&5 $as_echo_n "checking for FPU_SETCW... " >&6; } if ${ac_cv_c_fpu_setcw+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_fpu_setcw=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef _FPU_SETCW #include #define _FPU_SETCW(cw) __setfpucw(cw) #endif int main () { unsigned short mode = 0 ; _FPU_SETCW(mode); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_fpu_setcw="yes" else ac_cv_c_ieee_interface=unknown fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_setcw" >&5 $as_echo "$ac_cv_c_fpu_setcw" >&6; } fi if test "$ac_cv_c_ieee_interface" = "gnux86" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSE extensions" >&5 $as_echo_n "checking for SSE extensions... " >&6; } if ${ac_cv_c_fpu_sse+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_fpu_sse=no if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) int main () { unsigned int mode = 0x1f80 ; _FPU_SETMXCSR(mode); exit(0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_fpu_sse="yes" else ac_cv_c_fpu_sse="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #define _FPU_SETMXCSR(cw_sse) asm volatile ("ldmxcsr %0" : : "m" (*&cw_sse)) int main () { unsigned int mode = 0x1f80 ; _FPU_SETMXCSR(mode); exit(0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_fpu_sse="yes" else ac_cv_c_fpu_sse="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_sse" >&5 $as_echo "$ac_cv_c_fpu_sse" >&6; } if test $ac_cv_c_fpu_sse = yes; then $as_echo "#define HAVE_FPU_X86_SSE 1" >>confdefs.h fi fi ac_tr_ieee_interface=HAVE_`echo $ac_cv_c_ieee_interface | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_IEEE_INTERFACE cat >>confdefs.h <<_ACEOF #define $ac_tr_ieee_interface 1 _ACEOF save_cflags="$CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE compiler flags" >&5 $as_echo_n "checking for IEEE compiler flags... " >&6; } if ${ac_cv_c_ieee_flags+:} false; then : $as_echo_n "(cached) " >&6 else case "$host" in alpha*-*-*) if test X"$GCC" = Xyes ; then ieee_flags='-mieee -mfp-rounding-mode=d' else # This assumes Compaq's C compiler. ieee_flags='-ieee -fprm d' fi ;; esac if test X"$ieee_flags" != X ; then CFLAGS="$ieee_flags $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int foo; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_ieee_flags="$ieee_flags" else ac_cv_c_ieee_flags="none" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else ac_cv_c_ieee_flags="none" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_flags" >&5 $as_echo "$ac_cv_c_ieee_flags" >&6; } if test "$ac_cv_c_ieee_flags" != "none" ; then CFLAGS="$ac_cv_c_ieee_flags $save_cflags" else CFLAGS="$save_cflags" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE comparisons" >&5 $as_echo_n "checking for IEEE comparisons... " >&6; } if ${ac_cv_c_ieee_comparisons+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_ieee_comparisons="yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int status; double inf, nan; inf = exp(1.0e10); nan = inf / inf ; status = (nan == nan); exit (status); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_ieee_comparisons="yes" else ac_cv_c_ieee_comparisons="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_comparisons" >&5 $as_echo "$ac_cv_c_ieee_comparisons" >&6; } if test "$ac_cv_c_ieee_comparisons" != no ; then $as_echo "#define HAVE_IEEE_COMPARISONS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEEE denormalized values" >&5 $as_echo_n "checking for IEEE denormalized values... " >&6; } if ${ac_cv_c_ieee_denormals+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_ieee_denormals="yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int i, status; volatile double z = 1e-308; for (i = 0; i < 5; i++) { z = z / 10.0 ; }; for (i = 0; i < 5; i++) { z = z * 10.0 ; }; status = (z == 0.0); exit (status); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_ieee_denormals="yes" else ac_cv_c_ieee_denormals="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ieee_denormals" >&5 $as_echo "$ac_cv_c_ieee_denormals" >&6; } if test "$ac_cv_c_ieee_denormals" != no ; then $as_echo "#define HAVE_IEEE_DENORMALS 1" >>confdefs.h fi ac_config_files="$ac_config_files Makefile gsl_version.h gsl.spec blas/Makefile block/Makefile bspline/Makefile 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsl $as_me 2.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsl config.status 2.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gsl_version.h") CONFIG_FILES="$CONFIG_FILES gsl_version.h" ;; "gsl.spec") CONFIG_FILES="$CONFIG_FILES gsl.spec" ;; "blas/Makefile") CONFIG_FILES="$CONFIG_FILES blas/Makefile" ;; "block/Makefile") CONFIG_FILES="$CONFIG_FILES block/Makefile" ;; "bspline/Makefile") CONFIG_FILES="$CONFIG_FILES bspline/Makefile" ;; "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+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gsl-2.6/configure.ac0000644016036000116100000004612213527016322011362 00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT([gsl],[2.6]) 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 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 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=25 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) 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.6/aclocal.m40000644016036000116100000125013213527016356010742 00000000000000# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR gsl-2.6/config.h.in0000644016036000116100000002000313526016114011103 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 declaration of `acosh', and to 0 if you don't. */ #undef HAVE_DECL_ACOSH /* Define to 1 if you have the declaration of `asinh', and to 0 if you don't. */ #undef HAVE_DECL_ASINH /* Define to 1 if you have the declaration of `atanh', and to 0 if you don't. */ #undef HAVE_DECL_ATANH /* Define to 1 if you have the declaration of `expm1', and to 0 if you don't. */ #undef HAVE_DECL_EXPM1 /* Define to 1 if you have the declaration of `feenableexcept', and to 0 if you don't. */ #undef HAVE_DECL_FEENABLEEXCEPT /* Define to 1 if you have the declaration of `fesettrapenable', and to 0 if you don't. */ #undef HAVE_DECL_FESETTRAPENABLE /* Define to 1 if you have the declaration of `finite', and to 0 if you don't. */ #undef HAVE_DECL_FINITE /* Define to 1 if you have the declaration of `fprnd_t', and to 0 if you don't. */ #undef HAVE_DECL_FPRND_T /* Define to 1 if you have the declaration of `frexp', and to 0 if you don't. */ #undef HAVE_DECL_FREXP /* Define to 1 if you have the declaration of `hypot', and to 0 if you don't. */ #undef HAVE_DECL_HYPOT /* Define to 1 if you have the declaration of `isfinite', and to 0 if you don't. */ #undef HAVE_DECL_ISFINITE /* Define to 1 if you have the declaration of `isinf', and to 0 if you don't. */ #undef HAVE_DECL_ISINF /* Define to 1 if you have the declaration of `isnan', and to 0 if you don't. */ #undef HAVE_DECL_ISNAN /* Define to 1 if you have the declaration of `ldexp', and to 0 if you don't. */ #undef HAVE_DECL_LDEXP /* Define to 1 if you have the declaration of `log1p', and to 0 if you don't. */ #undef HAVE_DECL_LOG1P /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Defined if you have ansi EXIT_SUCCESS and EXIT_FAILURE in stdlib.h */ #undef HAVE_EXIT_SUCCESS_AND_FAILURE /* Defined on architectures with excess floating-point precision */ #undef HAVE_EXTENDED_PRECISION_REGISTERS /* Define if x86 processor has sse extensions. */ #undef HAVE_FPU_X86_SSE /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H /* Define this if IEEE comparisons work correctly (e.g. NaN != NaN) */ #undef HAVE_IEEE_COMPARISONS /* Define this if IEEE denormalized numbers are available */ #undef HAVE_IEEE_DENORMALS /* Define if you have inline */ #undef HAVE_INLINE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `memcpy' function. */ #undef HAVE_MEMCPY /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define this if printf can handle %Lf for long double */ #undef HAVE_PRINTF_LONGDOUBLE /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define if you need to hide the static definitions of inline functions */ #undef HIDE_INLINE_STATIC /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Defined if this is an official release */ #undef RELEASED /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if type `char' is unsigned and you are not using gcc. */ #ifndef __CHAR_UNSIGNED__ # undef __CHAR_UNSIGNED__ #endif /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile /* Use 0 and 1 for EXIT_SUCCESS and EXIT_FAILURE if we don't have them */ #if !HAVE_EXIT_SUCCESS_AND_FAILURE #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #endif /* Define one of these if you have a known IEEE arithmetic interface */ #undef HAVE_GNUSPARC_IEEE_INTERFACE #undef HAVE_GNUM68K_IEEE_INTERFACE #undef HAVE_GNUPPC_IEEE_INTERFACE #undef HAVE_GNUX86_IEEE_INTERFACE #undef HAVE_SUNOS4_IEEE_INTERFACE #undef HAVE_SOLARIS_IEEE_INTERFACE #undef HAVE_HPUX11_IEEE_INTERFACE #undef HAVE_HPUX_IEEE_INTERFACE #undef HAVE_TRU64_IEEE_INTERFACE #undef HAVE_IRIX_IEEE_INTERFACE #undef HAVE_AIX_IEEE_INTERFACE #undef HAVE_FREEBSD_IEEE_INTERFACE #undef HAVE_OS2EMX_IEEE_INTERFACE #undef HAVE_NETBSD_IEEE_INTERFACE #undef HAVE_OPENBSD_IEEE_INTERFACE #undef HAVE_DARWIN_IEEE_INTERFACE #undef HAVE_DARWIN86_IEEE_INTERFACE /* Define a rounding function which moves extended precision values out of registers and rounds them to double-precision. This should be used *sparingly*, in places where it is necessary to keep double-precision rounding for critical expressions while running in extended precision. For example, the following code should ensure exact equality, even when extended precision registers are in use, double q = GSL_COERCE_DBL(3.0/7.0) ; if (q == GSL_COERCE_DBL(3.0/7.0)) { ... } ; It carries a penalty even when the program is running in double precision mode unless you compile a separate version of the library with HAVE_EXTENDED_PRECISION_REGISTERS turned off. */ #if HAVE_EXTENDED_PRECISION_REGISTERS #define GSL_COERCE_DBL(x) (gsl_coerce_double(x)) #else #define GSL_COERCE_DBL(x) (x) #endif /* Substitute gsl functions for missing system functions */ #if !HAVE_DECL_HYPOT #define hypot gsl_hypot #endif #if !HAVE_DECL_LOG1P #define log1p gsl_log1p #endif #if !HAVE_DECL_EXPM1 #define expm1 gsl_expm1 #endif #if !HAVE_DECL_ACOSH #define acosh gsl_acosh #endif #if !HAVE_DECL_ASINH #define asinh gsl_asinh #endif #if !HAVE_DECL_ATANH #define atanh gsl_atanh #endif #if !HAVE_DECL_LDEXP #define ldexp gsl_ldexp #endif #if !HAVE_DECL_FREXP #define frexp gsl_frexp #endif #if !HAVE_DECL_ISINF #define isinf gsl_isinf #endif #if !HAVE_DECL_ISFINITE #define isfinite gsl_finite #endif #if !HAVE_DECL_FINITE #define finite gsl_finite #endif #if !HAVE_DECL_ISNAN #define isnan gsl_isnan #endif #ifdef __GNUC__ #define DISCARD_POINTER(p) do { ; } while(p ? 0 : 0); #else #define DISCARD_POINTER(p) /* ignoring discarded pointer */ #endif #if defined(GSL_RANGE_CHECK_OFF) || !defined(GSL_RANGE_CHECK) #define GSL_RANGE_CHECK 0 /* turn off range checking by default internally */ #endif #define RETURN_IF_NULL(x) if (!x) { return ; } gsl-2.6/mkinstalldirs0000755016036000116100000000672213373111455011706 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.6/gsl_version.h.in0000644016036000116100000000076413373111455012210 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.6/gsl.spec.in0000644016036000116100000000510613135126237011141 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.6/depcomp0000755016036000116100000005601613135126273010456 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.6/templates_on.h0000644016036000116100000001443713373111456011746 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.6/templates_off.h0000644016036000116100000000204113135126237012067 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.6/build.h0000644016036000116100000000175713373111454010352 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.6/gsl_math.h0000644016036000116100000001037113373111455011042 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.6/gsl_pow_int.h0000644016036000116100000000437513373111455011577 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.6/gsl_nan.h0000644016036000116100000000246713373111455010674 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.6/gsl_machine.h0000644016036000116100000000733513135145630011521 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.6/gsl_mode.h0000644016036000116100000000454513373111455011043 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.6/gsl_precision.h0000644016036000116100000000336413135126237012110 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.6/gsl_types.h0000644016036000116100000000217513135126237011260 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.6/gsl_version.h0000644016036000116100000000071213527016421011572 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.6" #define GSL_MAJOR_VERSION 2 #define GSL_MINOR_VERSION 6 GSL_VAR const char * gsl_version; __END_DECLS #endif /* __GSL_VERSION_H__ */ gsl-2.6/gsl_minmax.h0000644016036000116100000000511013373111455011375 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.6/gsl_inline.h0000644016036000116100000000463713373111455011377 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.6/test-driver0000755016036000116100000000761113135126273011274 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.6/COPYING0000644016036000116100000010451313135126236010127 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.6/THANKS0000644016036000116100000004163313373111454010012 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.6/TODO0000644016036000116100000001730513373111454007566 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.6/config.guess0000755016036000116100000013036113135126273011415 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.6/config.sub0000755016036000116100000010531513135126273011061 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.6/install-sh0000755016036000116100000003325513373111455011105 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.6/mdate-sh0000644016036000116100000000500313373111455010514 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.6/missing0000755016036000116100000001533113373111455010473 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.6/ltmain.sh0000644016036000116100000105152213135126270010714 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 gsl-2.6/version.c0000644016036000116100000000217113135126237010723 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.6/gsl-histogram.c0000644016036000116100000000364013377336115012026 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.6/gsl-randist.c0000644016036000116100000002330713373111455011471 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.6/autogen.sh0000755016036000116100000000042213373111454011067 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.6/gsl-config.in0000755016036000116100000000233313373111455011455 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.6/test_gsl_histogram.sh0000755016036000116100000000034513135126237013333 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.6/pkgconfig.test0000755016036000116100000000036313373111456011747 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.6/gsl/0000755016036000116100000000000013527016555007744 500000000000000gsl-2.6/gsl/Makefile.in0000644016036000116100000003201113527016362011722 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = gsl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gsl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu gsl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distclean-local distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am header-links: remove-links HEADERLIST="$(top_srcdir)/gsl*.h $(top_srcdir)/*/gsl*.h"; \ for h in $$HEADERLIST; do \ BASENAME=`basename $$h`; \ test -r $$BASENAME || $(LN_S) $$h $$BASENAME; \ done remove-links: rm -f gsl*.h all: all-am header-links clean-local: remove-links distclean-local: remove-links # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/gsl/Makefile.am0000644016036000116100000000047713373111455011722 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.6/utils/0000755016036000116100000000000013527016555010317 500000000000000gsl-2.6/utils/Makefile.in0000644016036000116100000004506013527016364012307 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = utils DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs strtoul.c strdup.c memmove.c \ memcpy.c strtol.c $(top_srcdir)/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libutils_la_DEPENDENCIES = @LIBOBJS@ am_libutils_la_OBJECTS = placeholder.lo libutils_la_OBJECTS = $(am_libutils_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libutils_la_SOURCES) DIST_SOURCES = $(libutils_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libutils.la # Don't need to list alloca.c, etc., Automake includes them. libutils_la_SOURCES = system.h placeholder.c libutils_la_LIBADD = @LIBOBJS@ EXTRA_DIST = README all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libutils.la: $(libutils_la_OBJECTS) $(libutils_la_DEPENDENCIES) $(EXTRA_libutils_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libutils_la_OBJECTS) $(libutils_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memcpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoul.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/placeholder.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/utils/Makefile.am0000644016036000116100000000030113135126237012257 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.6/utils/strtoul.c0000644016036000116100000000155513135126237012117 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.6/utils/strdup.c0000644016036000116100000000226713135126237011725 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.6/utils/memmove.c0000644016036000116100000000133113373111456012041 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.6/utils/memcpy.c0000644016036000116100000000065013373111456011671 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.6/utils/strtol.c0000644016036000116100000000744413135126237011735 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.6/utils/README0000644016036000116100000000027013135126237011110 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.6/utils/system.h0000644016036000116100000000463313373111456011735 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.6/utils/placeholder.c0000644016036000116100000000014013135126237012652 00000000000000void gsl_utils_placeholder (void); void gsl_utils_placeholder (void) { int i = 0; i++ ; } gsl-2.6/sys/0000755016036000116100000000000013527016555007775 500000000000000gsl-2.6/sys/Makefile.in0000644016036000116100000010514713527016364011770 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = sys DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsys_la_LIBADD = am_libgslsys_la_OBJECTS = minmax.lo prec.lo hypot.lo log1p.lo expm1.lo \ coerce.lo invhyp.lo pow_int.lo infnan.lo fdiv.lo fcmp.lo \ ldfrexp.lo libgslsys_la_OBJECTS = $(am_libgslsys_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslsys.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsys_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsys_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsys.la pkginclude_HEADERS = gsl_sys.h libgslsys_la_SOURCES = minmax.c prec.c hypot.c log1p.c expm1.c coerce.c invhyp.c pow_int.c infnan.c fdiv.c fcmp.c ldfrexp.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslsys.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sys/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsys.la: $(libgslsys_la_OBJECTS) $(libgslsys_la_DEPENDENCIES) $(EXTRA_libgslsys_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsys_la_OBJECTS) $(libgslsys_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coerce.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expm1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdiv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infnan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invhyp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldfrexp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log1p.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow_int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/sys/Makefile.am0000644016036000116100000000065513373111456011752 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.6/sys/gsl_sys.h0000644016036000116100000000364213135126237011550 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.6/sys/ChangeLog0000644016036000116100000001216413373111456011466 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.6/sys/minmax.c0000644016036000116100000000221313373111456011343 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.6/sys/prec.c0000644016036000116100000000342713373111456011013 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.6/sys/hypot.c0000644016036000116100000000367713373111456011234 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.6/sys/log1p.c0000644016036000116100000000203313373111456011074 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.6/sys/expm1.c0000644016036000116100000000253713135126237011114 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.6/sys/coerce.c0000644016036000116100000000233113373111456011313 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.6/sys/invhyp.c0000644016036000116100000000417213135126237011374 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.6/sys/pow_int.c0000644016036000116100000000256213373111456011540 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.6/sys/infnan.c0000644016036000116100000000527213373111456011333 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.6/sys/fdiv.c0000644016036000116100000000163113373111456011005 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.6/sys/fcmp.c0000644016036000116100000000320713135126237011002 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.6/sys/ldfrexp.c0000644016036000116100000000436113373111456011524 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.6/sys/test.c0000644016036000116100000004436013373111456011042 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.6/test/0000755016036000116100000000000013527016555010136 500000000000000gsl-2.6/test/Makefile.in0000644016036000116100000005077713527016364012141 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsltest_la_LIBADD = am_libgsltest_la_OBJECTS = results.lo libgsltest_la_OBJECTS = $(am_libgsltest_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsltest_la_SOURCES) DIST_SOURCES = $(libgsltest_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsltest.la pkginclude_HEADERS = gsl_test.h libgsltest_la_SOURCES = results.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsltest.la: $(libgsltest_la_OBJECTS) $(libgsltest_la_DEPENDENCIES) $(EXTRA_libgsltest_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsltest_la_OBJECTS) $(libgsltest_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/results.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #check_PROGRAMS = test #TESTS = test #test_SOURCES = test_errnos.c #test_LDADD = libgsltest.la ../sys/libgslsys.la ../utils/libutils.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/test/Makefile.am0000644016036000116100000000036113135126237012104 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.6/test/gsl_test.h0000644016036000116100000000347213135126237012053 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.6/test/ChangeLog0000644016036000116100000000214513135126237011624 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.6/test/results.c0000644016036000116100000002215013135126237011715 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.6/err/0000755016036000116100000000000013527016555007747 500000000000000gsl-2.6/err/Makefile.in0000644016036000116100000010350313527016362011732 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = err DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslerr_la_LIBADD = am_libgslerr_la_OBJECTS = error.lo stream.lo message.lo strerror.lo libgslerr_la_OBJECTS = $(am_libgslerr_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslerr.la ../test/libgsltest.la \ ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslerr_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslerr_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslerr.la pkginclude_HEADERS = gsl_errno.h gsl_message.h libgslerr_la_SOURCES = error.c stream.c message.c strerror.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu err/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu err/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslerr.la: $(libgslerr_la_OBJECTS) $(libgslerr_la_DEPENDENCIES) $(EXTRA_libgslerr_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslerr_la_OBJECTS) $(libgslerr_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/err/Makefile.am0000644016036000116100000000046213135126237011717 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.6/err/gsl_errno.h0000644016036000116100000001351513135126237012031 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.6/err/gsl_message.h0000644016036000116100000000456413135126237012334 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.6/err/ChangeLog0000644016036000116100000001251413135126237011436 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.6/err/TODO0000644016036000116100000000017213373111455010351 00000000000000# -*- org -*- #+CATEGORY: err * Add a GSL_ERROR_MODE environment variable for choosing error behavior at runtime (???). gsl-2.6/err/error.c0000644016036000116100000000400613135126237011156 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.6/err/stream.c0000644016036000116100000000345713135126237011331 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.6/err/message.c0000644016036000116100000000230713135126237011453 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.6/err/strerror.c0000644016036000116100000000651213135126237011713 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.6/err/test.c0000644016036000116100000000532013135126237011004 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.6/bst/0000755016036000116100000000000013527016555007747 500000000000000gsl-2.6/bst/Makefile.in0000644016036000116100000010363113527016361011733 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = bst DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(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` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslbst.la: $(libgslbst_la_OBJECTS) $(libgslbst_la_DEPENDENCIES) $(EXTRA_libgslbst_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslbst_la_OBJECTS) $(libgslbst_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trav.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/bst/Makefile.am0000644016036000116100000000061013521440113011701 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.6/bst/gsl_bst.h0000644016036000116100000000776313521377041011504 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 #undef __BEGIN_DECLS #undef __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.6/bst/gsl_bst_types.h0000644016036000116100000000251013521376626012721 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__ #undef __BEGIN_DECLS #undef __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.6/bst/gsl_bst_avl.h0000644016036000116100000000464213521376741012345 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 #undef __BEGIN_DECLS #undef __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.6/bst/gsl_bst_rb.h0000644016036000116100000000444513521377004012160 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 #undef __BEGIN_DECLS #undef __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.6/bst/avl.c0000644016036000116100000006267713377341665010645 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.6/bst/bst.c0000644016036000116100000000703313377341702010624 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.6/bst/rb.c0000644016036000116100000006326013377341712010444 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.6/bst/trav.c0000644016036000116100000000772513377341724011024 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.6/bst/test.c0000644016036000116100000002257113377341754011026 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.6/const/0000755016036000116100000000000013527016555010305 500000000000000gsl-2.6/const/Makefile.in0000644016036000116100000010153713527016361012274 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = const DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(test_SOURCES) DIST_SOURCES = $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkginclude_HEADERS = gsl_const.h gsl_const_cgs.h gsl_const_mks.h gsl_const_cgsm.h gsl_const_mksa.h gsl_const_num.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu const/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu const/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/const/Makefile.am0000644016036000116100000000054213373111454012253 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.6/const/gsl_const.h0000644016036000116100000000204013135126237012357 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.6/const/gsl_const_cgs.h0000644016036000116100000001413013373111454013215 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.6/const/gsl_const_mks.h0000644016036000116100000001542113373111454013237 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.6/const/gsl_const_cgsm.h0000644016036000116100000001517313373111454013402 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.6/const/gsl_const_mksa.h0000644016036000116100000001557213373111454013407 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.6/const/gsl_const_num.h0000644016036000116100000000334113373111454013242 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.6/const/ChangeLog0000644016036000116100000000511013373111454011765 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 Kpper * 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.6/const/TODO0000644016036000116100000000014413373111454010705 00000000000000# -*- org -*- #+CATEGORY: const could add RADIATION_DENSITY_CONSTANT (7.56591e-16) /* J m-3 K-4 */ gsl-2.6/const/test.c0000644016036000116100000000525513135126237011351 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.6/complex/0000755016036000116100000000000013527016555010626 500000000000000gsl-2.6/complex/Makefile.in0000644016036000116100000010446513527016361012620 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = complex DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslcomplex_la_LIBADD = am_libgslcomplex_la_OBJECTS = math.lo inline.lo libgslcomplex_la_OBJECTS = $(am_libgslcomplex_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslcomplex.la ../err/libgslerr.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcomplex_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcomplex.la pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h AM_CPPFLAGS = -I$(top_srcdir) libgslcomplex_la_SOURCES = math.c inline.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c results.h results1.h results2.h results_real.h results_zreal.h test_LDADD = libgslcomplex.la ../err/libgslerr.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu complex/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu complex/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcomplex.la: $(libgslcomplex_la_OBJECTS) $(libgslcomplex_la_DEPENDENCIES) $(EXTRA_libgslcomplex_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcomplex_la_OBJECTS) $(libgslcomplex_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/math.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS results: emacs -batch -l test.el -f test1 | sed 's/00\+e/0e/g' > results1.h emacs -batch -l test.el -f test2 | sed 's/00\+e/0e/g' > results.h emacs -batch -l test.el -f test3 | sed 's/00\+e/0e/g' > results_real.h emacs -batch -l test.el -f test4 | sed 's/00\+e/0e/g' > results2.h emacs -batch -l test.el -f test5 | sed 's/00\+e/0e/g' > results_zreal.h # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/complex/Makefile.am0000644016036000116100000000150213373111454012571 00000000000000noinst_LTLIBRARIES = libgslcomplex.la pkginclude_HEADERS = gsl_complex.h gsl_complex_math.h AM_CPPFLAGS = -I$(top_srcdir) libgslcomplex_la_SOURCES = math.c inline.c TESTS = $(check_PROGRAMS) check_PROGRAMS = test test_SOURCES = test.c results.h results1.h results2.h results_real.h results_zreal.h test_LDADD = libgslcomplex.la ../err/libgslerr.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la results: emacs -batch -l test.el -f test1 | sed 's/00\+e/0e/g' > results1.h emacs -batch -l test.el -f test2 | sed 's/00\+e/0e/g' > results.h emacs -batch -l test.el -f test3 | sed 's/00\+e/0e/g' > results_real.h emacs -batch -l test.el -f test4 | sed 's/00\+e/0e/g' > results2.h emacs -batch -l test.el -f test5 | sed 's/00\+e/0e/g' > results_zreal.h gsl-2.6/complex/gsl_complex.h0000644016036000116100000000645613135126237013240 00000000000000/* complex/gsl_complex.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __GSL_COMPLEX_H__ #define __GSL_COMPLEX_H__ #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # define __END_DECLS } #else # define __BEGIN_DECLS /* empty */ # define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* two consecutive built-in types as a complex number */ typedef double * gsl_complex_packed ; typedef float * gsl_complex_packed_float ; typedef long double * gsl_complex_packed_long_double ; typedef const double * gsl_const_complex_packed ; typedef const float * gsl_const_complex_packed_float ; typedef const long double * gsl_const_complex_packed_long_double ; /* 2N consecutive built-in types as N complex numbers */ typedef double * gsl_complex_packed_array ; typedef float * gsl_complex_packed_array_float ; typedef long double * gsl_complex_packed_array_long_double ; typedef const double * gsl_const_complex_packed_array ; typedef const float * gsl_const_complex_packed_array_float ; typedef const long double * gsl_const_complex_packed_array_long_double ; /* Yes... this seems weird. Trust us. The point is just that sometimes you want to make it obvious that something is an output value. The fact that it lacks a 'const' may not be enough of a clue for people in some contexts. */ typedef double * gsl_complex_packed_ptr ; typedef float * gsl_complex_packed_float_ptr ; typedef long double * gsl_complex_packed_long_double_ptr ; typedef const double * gsl_const_complex_packed_ptr ; typedef const float * gsl_const_complex_packed_float_ptr ; typedef const long double * gsl_const_complex_packed_long_double_ptr ; typedef struct { long double dat[2]; } gsl_complex_long_double; typedef struct { double dat[2]; } gsl_complex; typedef struct { float dat[2]; } gsl_complex_float; #define GSL_REAL(z) ((z).dat[0]) #define GSL_IMAG(z) ((z).dat[1]) #define GSL_COMPLEX_P(zp) ((zp)->dat) #define GSL_COMPLEX_P_REAL(zp) ((zp)->dat[0]) #define GSL_COMPLEX_P_IMAG(zp) ((zp)->dat[1]) #define GSL_COMPLEX_EQ(z1,z2) (((z1).dat[0] == (z2).dat[0]) && ((z1).dat[1] == (z2).dat[1])) #define GSL_SET_COMPLEX(zp,x,y) do {(zp)->dat[0]=(x); (zp)->dat[1]=(y);} while(0) #define GSL_SET_REAL(zp,x) do {(zp)->dat[0]=(x);} while(0) #define GSL_SET_IMAG(zp,y) do {(zp)->dat[1]=(y);} while(0) #define GSL_SET_COMPLEX_PACKED(zp,n,x,y) do {*((zp)+2*(n))=(x); *((zp)+(2*(n)+1))=(y);} while(0) __END_DECLS #endif /* __GSL_COMPLEX_H__ */ gsl-2.6/complex/gsl_complex_math.h0000644016036000116100000001364013373111454014241 00000000000000/* complex/gsl_complex_math.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 Jorma Olavi Thtinen, Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along 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.6/complex/ChangeLog0000644016036000116100000000505513373111454012316 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.6/complex/TODO0000644016036000116100000000156713373111454011240 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.6/complex/math.c0000644016036000116100000005556113373111454011650 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.6/complex/inline.c0000644016036000116100000000161613373111454012165 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.6/complex/test.c0000644016036000116100000001525713373111454011674 00000000000000/* complex/test.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include struct f { char *name; double (*f) (gsl_complex z); double x; double y; double fx; double fy; }; struct fz { char *name; gsl_complex (*f) (gsl_complex z); double x; double y; double fx; double fy; }; struct fzz { char *name; gsl_complex (*f) (gsl_complex z1, gsl_complex z2); double x1; double y1; double x2; double y2; double fx; double fy; }; struct freal { char *name; gsl_complex (*f) (double x); double x; double fx; double fy; }; struct fzreal { char *name; gsl_complex (*f) (gsl_complex z, double a); double x; double y; double a; double fx; double fy; }; #define FN(x) "gsl_complex_" #x, gsl_complex_ ## x #define ARG(x,y) x, y #define RES(x,y) x, y struct f list[] = { #include "results1.h" {"", 0, 0, 0, 0, 0} }; struct fz listz[] = { #include "results.h" {"", 0, 0, 0, 0, 0} }; struct fzz listzz[] = { {FN (pow), ARG(0.0,0.0), ARG(0.0,0.0), RES(1.0, 0.0)}, #include "results2.h" {"", 0, 0, 0, 0, 0, 0, 0} }; struct freal listreal[] = { #include "results_real.h" {"", 0, 0, 0, 0} }; struct fzreal listzreal[] = { #include "results_zreal.h" {"", 0, 0, 0, 0, 0, 0} }; #ifndef TEST_FACTOR #ifdef RELEASED #define TEST_FACTOR 100.0 #else #define TEST_FACTOR 1.0 #endif #endif int main (void) { size_t i = 0; const double tol = TEST_FACTOR * 10 * GSL_DBL_EPSILON; const double tolf = TEST_FACTOR * 10 * GSL_FLT_EPSILON; gsl_ieee_env_setup(); for (i = 0 ; i < 10; i++) { double r = (i - 5.0) * 0.3 ; double t = 2.0 * M_PI * i / 5 ; double x = r * cos(t), y = r * sin(t) ; gsl_complex z = gsl_complex_polar (r, t) ; gsl_test_rel (GSL_REAL(z), x, tol, "gsl_complex_polar real part at (r=%g,t=%g)", r, t); gsl_test_rel (GSL_IMAG(z), y, tol, "gsl_complex_polar imag part at (r=%g,t=%g)", r, t); } i = 0; while (list[i].f) { struct f t = list[i]; gsl_complex z = gsl_complex_rect (t.x, t.y); double f = (t.f) (z); gsl_test_rel (f, t.fx, tol, "%s at (%g,%g)", t.name, t.x, t.y); i++; } i = 0; while (listz[i].f) { struct fz t = listz[i]; gsl_complex z = gsl_complex_rect (t.x, t.y); gsl_complex fz = (t.f) (z); double fx = GSL_REAL (fz), fy = GSL_IMAG (fz); #ifdef DEBUG printf("x = "); gsl_ieee_fprintf_double (stdout, &t.x); printf("\n"); printf("y = "); gsl_ieee_fprintf_double (stdout, &t.y); printf("\n"); printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n"); printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n"); printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n"); printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n"); #endif gsl_test_rel (fx, t.fx, tol, "%s real part at (%g,%g)", t.name, t.x, t.y); gsl_test_rel (fy, t.fy, tol, "%s imag part at (%g,%g)", t.name, t.x, t.y); i++; } i = 0; while (listzz[i].f) { struct fzz t = listzz[i]; gsl_complex z1 = gsl_complex_rect (t.x1, t.y1); gsl_complex z2 = gsl_complex_rect (t.x2, t.y2); gsl_complex fz = (t.f) (z1, z2); double fx = GSL_REAL (fz), fy = GSL_IMAG (fz); #ifdef DEBUG printf("x1 = "); gsl_ieee_fprintf_double (stdout, &t.x1); printf("\n"); printf("y1 = "); gsl_ieee_fprintf_double (stdout, &t.y1); printf("\n"); printf("x2 = "); gsl_ieee_fprintf_double (stdout, &t.x2); printf("\n"); printf("y2 = "); gsl_ieee_fprintf_double (stdout, &t.y2); printf("\n"); printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n"); printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n"); printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n"); printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n"); #endif gsl_test_rel (fx, t.fx, tolf, "%s real part at (%g,%g;%g,%g)", t.name, t.x1, t.y1, t.x2, t.y2); gsl_test_rel (fy, t.fy, tolf, "%s imag part at (%g,%g;%g,%g)", t.name, t.x1, t.y1, t.x2, t.y2); i++; } i = 0; while (listreal[i].f) { struct freal t = listreal[i]; gsl_complex fz = (t.f) (t.x); double fx = GSL_REAL (fz), fy = GSL_IMAG (fz); #ifdef DEBUG printf("x = "); gsl_ieee_fprintf_double (stdout, &t.x); printf("\n"); printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n"); printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n"); printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n"); printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n"); #endif gsl_test_rel (fx, t.fx, tol, "%s real part at (%g,0)", t.name, t.x); gsl_test_rel (fy, t.fy, tol, "%s imag part at (%g,0)", t.name, t.x); i++; } i = 0; while (listzreal[i].f) { struct fzreal t = listzreal[i]; gsl_complex z = gsl_complex_rect (t.x, t.y); gsl_complex fz = (t.f) (z, t.a); double fx = GSL_REAL (fz), fy = GSL_IMAG (fz); #ifdef DEBUG printf("x = "); gsl_ieee_fprintf_double (stdout, &t.x); printf("\n"); printf("y = "); gsl_ieee_fprintf_double (stdout, &t.y); printf("\n"); printf("a = "); gsl_ieee_fprintf_double (stdout, &t.a); printf("\n"); printf("fx = "); gsl_ieee_fprintf_double (stdout, &fx); printf("\n"); printf("ex = "); gsl_ieee_fprintf_double (stdout, &t.fx); printf("\n"); printf("fy = "); gsl_ieee_fprintf_double (stdout, &fy); printf("\n"); printf("ey = "); gsl_ieee_fprintf_double (stdout, &t.fy); printf("\n"); #endif gsl_test_rel (fx, t.fx, tol, "%s real part at (%g,0)", t.name, t.x); gsl_test_rel (fy, t.fy, tol, "%s imag part at (%g,0)", t.name, t.x); i++; } exit (gsl_test_summary ()); } gsl-2.6/complex/results.h0000644016036000116100000172434713373111454012433 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.6/complex/results1.h0000644016036000116100000013176113135126237012504 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.6/complex/results2.h0000644016036000116100000001056313373111454012500 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.6/complex/results_real.h0000644016036000116100000002060413135126237013417 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.6/complex/results_zreal.h0000644016036000116100000000434413373111454013613 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.6/cheb/0000755016036000116100000000000013527016555010060 500000000000000gsl-2.6/cheb/Makefile.in0000644016036000116100000010370013527016361012041 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = cheb DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslcheb_la_LIBADD = am_libgslcheb_la_OBJECTS = deriv.lo eval.lo init.lo integ.lo libgslcheb_la_OBJECTS = $(am_libgslcheb_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslcheb.la ../ieee-utils/libgslieeeutils.la \ ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcheb_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcheb_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcheb.la pkginclude_HEADERS = gsl_chebyshev.h AM_CPPFLAGS = -I$(top_srcdir) libgslcheb_la_SOURCES = deriv.c eval.c init.c integ.c TESTS = $(check_PROGRAMS) test_LDADD = libgslcheb.la ../ieee-utils/libgslieeeutils.la ../test/libgsltest.la ../sys/libgslsys.la ../err/libgslerr.la ../utils/libutils.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cheb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu cheb/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcheb.la: $(libgslcheb_la_OBJECTS) $(libgslcheb_la_DEPENDENCIES) $(EXTRA_libgslcheb_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcheb_la_OBJECTS) $(libgslcheb_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/integ.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/cheb/Makefile.am0000644016036000116100000000057413373111454012033 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.6/cheb/gsl_chebyshev.h0000644016036000116100000001063513373111454012774 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 #undef __BEGIN_DECLS #undef __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.6/cheb/ChangeLog0000644016036000116100000000415413373111454011547 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.6/cheb/TODO0000644016036000116100000000015313373111454010460 00000000000000# -*- org -*- #+CATEGORY: cheb Provide a way to save/restore coefficients, or access the coefficient data.gsl-2.6/cheb/deriv.c0000644016036000116100000000327413373111454011254 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.6/cheb/eval.c0000644016036000116100000001070513135126237011070 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.6/cheb/init.c0000644016036000116100000000540713373111454011106 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.6/cheb/integ.c0000644016036000116100000000346513135126237011254 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.6/cheb/test.c0000644016036000116100000001744013373111454011122 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; x&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = block DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslblock_la_LIBADD = am_libgslblock_la_OBJECTS = init.lo file.lo block.lo libgslblock_la_OBJECTS = $(am_libgslblock_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslblock_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslblock_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslblock.la pkginclude_HEADERS = gsl_block.h gsl_block_char.h gsl_block_complex_double.h gsl_block_complex_float.h gsl_block_complex_long_double.h gsl_block_double.h gsl_block_float.h gsl_block_int.h gsl_block_long.h gsl_block_long_double.h gsl_block_short.h gsl_block_uchar.h gsl_block_uint.h gsl_block_ulong.h gsl_block_ushort.h gsl_check_range.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c CLEANFILES = test.txt test.dat noinst_HEADERS = block_source.c init_source.c fprintf_source.c fwrite_source.c test_complex_source.c test_source.c test_io.c test_complex_io.c libgslblock_la_SOURCES = init.c file.c block.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu block/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu block/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslblock.la: $(libgslblock_la_OBJECTS) $(libgslblock_la_DEPENDENCIES) $(EXTRA_libgslblock_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslblock_la_OBJECTS) $(libgslblock_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/block/Makefile.am0000644016036000116100000000152013373111454012214 00000000000000noinst_LTLIBRARIES = libgslblock.la check_PROGRAMS = test pkginclude_HEADERS = gsl_block.h gsl_block_char.h gsl_block_complex_double.h gsl_block_complex_float.h gsl_block_complex_long_double.h gsl_block_double.h gsl_block_float.h gsl_block_int.h gsl_block_long.h gsl_block_long_double.h gsl_block_short.h gsl_block_uchar.h gsl_block_uint.h gsl_block_ulong.h gsl_block_ushort.h gsl_check_range.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c CLEANFILES = test.txt test.dat noinst_HEADERS = block_source.c init_source.c fprintf_source.c fwrite_source.c test_complex_source.c test_source.c test_io.c test_complex_io.c libgslblock_la_SOURCES = init.c file.c block.c gsl-2.6/block/block_source.c0000644016036000116100000000175613135126237013012 00000000000000/* block/block_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ size_t FUNCTION(gsl_block,size) (const TYPE(gsl_block) * b) { return b->size ; } ATOMIC * FUNCTION(gsl_block,data) (const TYPE(gsl_block) * b) { return b->data ; } gsl-2.6/block/init_source.c0000644016036000116100000000371613373111454012660 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.6/block/fprintf_source.c0000644016036000116100000000762613373111454013371 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.6/block/fwrite_source.c0000644016036000116100000000551313135126237013213 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.6/block/test_complex_source.c0000644016036000116100000000711113373111454014414 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.6/block/test_source.c0000644016036000116100000000672313373111454012675 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.6/block/test_io.c0000644016036000116100000000311413135126237011774 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.6/block/test_complex_io.c0000644016036000116100000000325613135126237013532 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.6/block/gsl_block.h0000644016036000116100000000110413135126237012267 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.6/block/gsl_block_char.h0000644016036000116100000000436213135126237013275 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.6/block/gsl_block_complex_double.h0000644016036000116100000000456113135126237015362 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.6/block/gsl_block_complex_float.h0000644016036000116100000000477513135126237015224 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.6/block/gsl_block_complex_long_double.h0000644016036000116100000000531713135126237016401 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.6/block/gsl_block_double.h0000644016036000116100000000421113135126237013623 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.6/block/gsl_block_float.h0000644016036000116100000000442513135126237013465 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.6/block/gsl_block_int.h0000644016036000116100000000431713135126237013152 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.6/block/gsl_block_long.h0000644016036000116100000000436213135126237013317 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.6/block/gsl_block_long_double.h0000644016036000116100000000474713135126237014660 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.6/block/gsl_block_short.h0000644016036000116100000000442513135126237013517 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.6/block/gsl_block_uchar.h0000644016036000116100000000450513135126237013461 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.6/block/gsl_block_uint.h0000644016036000116100000000444213135126237013336 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.6/block/gsl_block_ulong.h0000644016036000116100000000450513135126237013503 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.6/block/gsl_block_ushort.h0000644016036000116100000000455013135126237013703 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.6/block/gsl_check_range.h0000644016036000116100000000305313135126237013433 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.6/block/ChangeLog0000644016036000116100000000301213373111454011730 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.6/block/init.c0000644016036000116100000000337513373111454011301 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.6/block/file.c0000644016036000116100000000424713135126237011255 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.6/block/block.c0000644016036000116100000000337613135126237011432 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.6/block/test.c0000644016036000116100000001310413373111454011304 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.6/vector/0000755016036000116100000000000013527016556010462 500000000000000gsl-2.6/vector/Makefile.in0000644016036000116100000011115213527016364012445 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) test_static$(EXEEXT) subdir = vector DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslvector_la_LIBADD = am_libgslvector_la_OBJECTS = init.lo file.lo vector.lo copy.lo swap.lo \ prop.lo minmax.lo oper.lo reim.lo subvector.lo view.lo libgslvector_la_OBJECTS = $(am_libgslvector_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslvector.la ../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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslvector_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) DIST_SOURCES = $(libgslvector_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslvector.la pkginclude_HEADERS = gsl_vector.h gsl_vector_char.h gsl_vector_complex.h gsl_vector_complex_double.h gsl_vector_complex_float.h gsl_vector_complex_long_double.h gsl_vector_double.h gsl_vector_float.h gsl_vector_int.h gsl_vector_long.h gsl_vector_long_double.h gsl_vector_short.h gsl_vector_uchar.h gsl_vector_uint.h gsl_vector_ulong.h gsl_vector_ushort.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslvector.la ../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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslvector.la: $(libgslvector_la_OBJECTS) $(libgslvector_la_DEPENDENCIES) $(EXTRA_libgslvector_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslvector_la_OBJECTS) $(libgslvector_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) test_static$(EXEEXT): $(test_static_OBJECTS) $(test_static_DEPENDENCIES) $(EXTRA_test_static_DEPENDENCIES) @rm -f test_static$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_static_OBJECTS) $(test_static_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subvector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_static.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_static.log: test_static$(EXEEXT) @p='test_static$(EXEEXT)'; \ b='test_static'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/vector/Makefile.am0000644016036000116100000000253713517225106012435 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.6/vector/init_source.c0000644016036000116100000001143713373111456013071 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.6/vector/file_source.c0000644016036000116100000000443413135126237013043 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.6/vector/copy_source.c0000644016036000116100000000341213521334354013071 00000000000000/* vector/copy_source.c * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ int FUNCTION (gsl_vector, memcpy) (TYPE (gsl_vector) * dest, const TYPE (gsl_vector) * src) { #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_size = src->size; const size_t dest_size = dest->size; if (src_size != dest_size) { GSL_ERROR ("vector lengths are not equal", GSL_EBADLEN); } { const size_t src_stride = src->stride ; const size_t dest_stride = dest->stride ; size_t j; for (j = 0; j < src_size; j++) { size_t k; for (k = 0; k < MULTIPLICITY; k++) { dest->data[MULTIPLICITY * dest_stride * j + k] = src->data[MULTIPLICITY * src_stride * j + k]; } } } #endif return GSL_SUCCESS; } gsl-2.6/vector/swap_source.c0000644016036000116100000000507313135126237013076 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.6/vector/prop_source.c0000644016036000116100000000575213373111456013111 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.6/vector/test_complex_source.c0000644016036000116100000005167413517466722014654 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.6/vector/test_source.c0000644016036000116100000005422713517466177013126 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); for (i = 0; i < N; i++) { FUNCTION (gsl_vector, set) (a, i, (BASE)(3 + i)); FUNCTION (gsl_vector, set) (b, i, (BASE)(3 + 2 * i)); } { int status = (FUNCTION(gsl_vector,equal) (a,b) != 0); TEST2 (status, "_equal vectors unequal"); } FUNCTION(gsl_vector, memcpy) (v, a); { int status = (FUNCTION(gsl_vector,equal) (a,v) != 1); TEST2 (status, "_equal vectors equal"); } FUNCTION(gsl_vector, add) (v, b); { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); BASE x = FUNCTION(gsl_vector,get) (a,i); BASE y = FUNCTION(gsl_vector,get) (b,i); BASE z = x + y; if (r != z) status = 1; } TEST2 (status, "_add vector addition"); } { int status = 0; FUNCTION(gsl_vector, swap) (a, b); for (i = 0; i < N; i++) { status |= (FUNCTION (gsl_vector, get) (a, i) != (BASE)(3 + 2 * i)); status |= (FUNCTION (gsl_vector, get) (b, i) != (BASE)(3 + i)); } FUNCTION(gsl_vector, swap) (a, b); for (i = 0; i < N; i++) { status |= (FUNCTION (gsl_vector, get) (a, i) != (BASE)(3 + i)); status |= (FUNCTION (gsl_vector, get) (b, i) != (BASE)(3 + 2 * i)); } TEST2 (status, "_swap exchange vectors"); } FUNCTION(gsl_vector, memcpy) (v, a); FUNCTION(gsl_vector, sub) (v, b); { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); BASE x = FUNCTION(gsl_vector,get) (a,i); BASE y = FUNCTION(gsl_vector,get) (b,i); BASE z = x - y; if (r != z) status = 1; } TEST2 (status, "_sub vector subtraction"); } FUNCTION(gsl_vector, memcpy) (v, a); FUNCTION(gsl_vector, mul) (v, b); { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); BASE x = FUNCTION(gsl_vector,get) (a,i); BASE y = FUNCTION(gsl_vector,get) (b,i); BASE z = x * y; if (r != z) status = 1; } TEST2 (status, "_mul multiplication"); } FUNCTION(gsl_vector, memcpy) (v, a); FUNCTION(gsl_vector, div) (v, b); { int status = 0; for (i = 0; i < N; i++) { BASE r = FUNCTION(gsl_vector,get) (v,i); BASE x = FUNCTION(gsl_vector,get) (a,i); BASE y = FUNCTION(gsl_vector,get) (b,i); BASE z = x / y; if (fabs(r - z) > 2 * GSL_FLT_EPSILON * fabs(z)) status = 1; } TEST2 (status, "_div division"); } FUNCTION(gsl_vector, free) (a); FUNCTION(gsl_vector, free) (b); FUNCTION(gsl_vector, free) (v); } void FUNCTION (test, file) (size_t stride, size_t N) { TYPE (gsl_vector) * v = FUNCTION (create, vector) (stride, N); TYPE (gsl_vector) * w = FUNCTION (create, vector) (stride, N); size_t i; #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.6/vector/minmax_source.c0000644016036000116100000001007113135126237013407 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.6/vector/oper_source.c0000644016036000116100000001026413517466225013077 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 double x) { const size_t N = a->size; const size_t stride = a->stride; size_t i; for (i = 0; i < N; i++) { a->data[i * stride] += x; } return GSL_SUCCESS; } int FUNCTION (gsl_vector, 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; } } gsl-2.6/vector/oper_complex_source.c0000644016036000116100000001401713517466663014634 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.6/vector/reim_source.c0000644016036000116100000000323213135126237013053 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.6/vector/subvector_source.c0000644016036000116100000000420413373111456014134 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.6/vector/view_source.c0000644016036000116100000000341513373111456013075 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.6/vector/gsl_vector.h0000644016036000116100000000112613135126237012713 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.6/vector/gsl_vector_char.h0000644016036000116100000001643713517223143013721 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 double x); int gsl_vector_char_axpby (const char alpha, const gsl_vector_char * x, const char beta, gsl_vector_char * y); 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.6/vector/gsl_vector_complex.h0000644016036000116100000000137413373111456014450 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.6/vector/gsl_vector_complex_double.h0000644016036000116100000002032213517223143015771 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.6/vector/gsl_vector_complex_float.h0000644016036000116100000002203313517223131015622 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.6/vector/gsl_vector_complex_long_double.h0000644016036000116100000002366113517223143017021 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.6/vector/gsl_vector_double.h0000644016036000116100000001535313517223143014252 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); 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.6/vector/gsl_vector_float.h0000644016036000116100000001666713517223120014111 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 double x); int gsl_vector_float_axpby (const float alpha, const gsl_vector_float * x, const float beta, gsl_vector_float * y); 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.6/vector/gsl_vector_int.h0000644016036000116100000001620713517223143013571 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 double 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_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.6/vector/gsl_vector_long.h0000644016036000116100000001643713517223143013743 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 double x); int gsl_vector_long_axpby (const long alpha, const gsl_vector_long * x, const long beta, gsl_vector_long * y); 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.6/vector/gsl_vector_long_double.h0000644016036000116100000002050713517223143015266 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 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); 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.6/vector/gsl_vector_short.h0000644016036000116100000001666713517223143014150 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 double x); int gsl_vector_short_axpby (const short alpha, const gsl_vector_short * x, const short beta, gsl_vector_short * y); 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.6/vector/gsl_vector_uchar.h0000644016036000116100000001715713517223143014106 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 double x); int gsl_vector_uchar_axpby (const unsigned char alpha, const gsl_vector_uchar * x, const unsigned char beta, gsl_vector_uchar * y); 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.6/vector/gsl_vector_uint.h0000644016036000116100000001672713517223143013765 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 double x); int gsl_vector_uint_axpby (const unsigned int alpha, const gsl_vector_uint * x, const unsigned int beta, gsl_vector_uint * y); 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.6/vector/gsl_vector_ulong.h0000644016036000116100000001715713517223143014130 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 double x); int gsl_vector_ulong_axpby (const unsigned long alpha, const gsl_vector_ulong * x, const unsigned long beta, gsl_vector_ulong * y); 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.6/vector/gsl_vector_ushort.h0000644016036000116100000001740713517223143014326 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 double x); int gsl_vector_ushort_axpby (const unsigned short alpha, const gsl_vector_ushort * x, const unsigned short beta, gsl_vector_ushort * y); 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.6/vector/ChangeLog0000644016036000116100000001745713373111456012164 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.6/vector/TODO0000644016036000116100000000011413373111456011060 00000000000000# -*- org -*- #+CATEGORY: vector * Pretty print function * Vector p-norms gsl-2.6/vector/init.c0000644016036000116100000000337613373111456011514 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.6/vector/file.c0000644016036000116100000000343713135126237011465 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.6/vector/vector.c0000644016036000116100000000207313373111456012044 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.6/vector/copy.c0000644016036000116100000000341313517170252011512 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.6/vector/swap.c0000644016036000116100000000336113135126237011514 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.6/vector/prop.c0000644016036000116100000000336113135126237011522 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.6/vector/minmax.c0000644016036000116100000000260313135126237012031 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.6/vector/oper.c0000644016036000116100000000351213517166757011524 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.6/vector/reim.c0000644016036000116100000000167013135126237011477 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.6/vector/subvector.c0000644016036000116100000000713613135126237012562 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.6/vector/view.c0000644016036000116100000000672213135126237011520 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.6/vector/view.h0000644016036000116100000000011713135126237011515 00000000000000#define NULL_VECTOR {0, 0, 0, 0, 0} #define NULL_VECTOR_VIEW {{0, 0, 0, 0, 0}} gsl-2.6/vector/test.c0000644016036000116100000001744613373111456011533 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.6/vector/test_static.c0000644016036000116100000000015113135126237013062 00000000000000#undef HAVE_INLINE #ifndef NO_INLINE #define NO_INLINE #endif #define DESC " (static)" #include "test.c" gsl-2.6/matrix/0000755016036000116100000000000013527016556010464 500000000000000gsl-2.6/matrix/Makefile.in0000644016036000116100000011147313527016362012453 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) test_static$(EXEEXT) subdir = matrix DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmatrix_la_LIBADD = am_libgslmatrix_la_OBJECTS = init.lo matrix.lo file.lo rowcol.lo \ swap.lo copy.lo minmax.lo prop.lo oper.lo getset.lo view.lo \ submatrix.lo libgslmatrix_la_OBJECTS = $(am_libgslmatrix_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmatrix.la ../vector/libgslvector.la \ ../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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmatrix_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) DIST_SOURCES = $(libgslmatrix_la_SOURCES) $(test_SOURCES) \ $(test_static_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmatrix.la pkginclude_HEADERS = gsl_matrix.h gsl_matrix_char.h gsl_matrix_complex_double.h gsl_matrix_complex_float.h gsl_matrix_complex_long_double.h gsl_matrix_double.h gsl_matrix_float.h gsl_matrix_int.h gsl_matrix_long.h gsl_matrix_long_double.h gsl_matrix_short.h gsl_matrix_uchar.h gsl_matrix_uint.h gsl_matrix_ulong.h gsl_matrix_ushort.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslmatrix.la ../vector/libgslvector.la ../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 libgslmatrix_la_SOURCES = init.c matrix.c file.c rowcol.c swap.c copy.c minmax.c prop.c oper.c getset.c view.c submatrix.c view.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu matrix/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu matrix/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmatrix.la: $(libgslmatrix_la_OBJECTS) $(libgslmatrix_la_DEPENDENCIES) $(EXTRA_libgslmatrix_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmatrix_la_OBJECTS) $(libgslmatrix_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) test_static$(EXEEXT): $(test_static_OBJECTS) $(test_static_DEPENDENCIES) $(EXTRA_test_static_DEPENDENCIES) @rm -f test_static$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_static_OBJECTS) $(test_static_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rowcol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submatrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_static.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_static.log: test_static$(EXEEXT) @p='test_static$(EXEEXT)'; \ b='test_static'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/matrix/Makefile.am0000644016036000116100000000264113521372170012432 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 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.6/matrix/init_source.c0000644016036000116100000001226213373111455013067 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.6/matrix/file_source.c0000644016036000116100000001052613373111455013044 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.6/matrix/rowcol_source.c0000644016036000116100000001157413373111455013436 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.6/matrix/swap_source.c0000644016036000116100000002304213521372075013076 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.6/matrix/copy_source.c0000644016036000116100000001702113521351014013064 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.6/matrix/test_complex_source.c0000644016036000116100000006407313521372023014634 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"); } { 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, 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.6/matrix/test_source.c0000644016036000116100000006547013521371653013117 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"); } 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, 2.0); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (a,i,j); if (r != (ATOMIC)(2*x)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_scale"); } FUNCTION(gsl_matrix, memcpy) (m, a); FUNCTION(gsl_matrix, add_constant) (m, 3.0); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (a,i,j); BASE y = x + 3.0; if (fabs(r - y) > 2 * GSL_FLT_EPSILON * fabs(y)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_add_constant"); } FUNCTION(gsl_matrix, memcpy) (m, a); FUNCTION(gsl_matrix, add_diagonal) (m, 5.0); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE r = FUNCTION(gsl_matrix,get) (m,i,j); BASE x = FUNCTION(gsl_matrix,get) (a,i,j); BASE y = (i == j) ? (x + (ATOMIC) 5.0) : x; if (fabs(r - y) > 2 * GSL_FLT_EPSILON * fabs(y)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_add_diagonal"); } FUNCTION(gsl_matrix, swap) (a, b); { int status = 0; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { BASE x = FUNCTION(gsl_matrix,get) (a,i,j); BASE y = FUNCTION(gsl_matrix,get) (b,i,j); if (y != (BASE)(3 + i + 5 * j) || x != (BASE)(3 + 2 * i + 4 * j)) status = 1; } } gsl_test (status, NAME (gsl_matrix) "_swap"); } FUNCTION (gsl_matrix, 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.6/matrix/minmax_source.c0000644016036000116100000001256513135126237013423 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.6/matrix/prop_source.c0000644016036000116100000000715613373111455013112 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; } gsl-2.6/matrix/oper_source.c0000644016036000116100000001011713135126237013066 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 double x) { const size_t M = a->size1; const size_t N = a->size2; const size_t tda = a->tda; size_t i, j; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { a->data[i * tda + j] *= x; } } return GSL_SUCCESS; } int FUNCTION(gsl_matrix, add_constant) (TYPE(gsl_matrix) * a, const double x) { const size_t M = a->size1; const size_t N = a->size2; const size_t tda = a->tda; size_t i, j; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { a->data[i * tda + j] += x; } } return GSL_SUCCESS; } int FUNCTION(gsl_matrix, add_diagonal) (TYPE(gsl_matrix) * a, const double x) { const size_t M = a->size1; const size_t N = a->size2; const size_t tda = a->tda; const size_t loop_lim = ( M < N ? M : N ); size_t i; for (i = 0; i < loop_lim; i++) { a->data[i * tda + i] += x; } return GSL_SUCCESS; } gsl-2.6/matrix/getset_source.c0000644016036000116100000001167613135126237013427 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.6/matrix/view_source.c0000644016036000116100000001310213373111455013070 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.6/matrix/submatrix_source.c0000644016036000116100000000347313373111455014146 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.6/matrix/oper_complex_source.c0000644016036000116100000001315213135126237014617 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, 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.6/matrix/gsl_matrix.h0000644016036000116100000000112613135126237012717 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.6/matrix/gsl_matrix_char.h0000644016036000116100000003007713521366542013727 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); int gsl_matrix_char_add (gsl_matrix_char * a, const gsl_matrix_char * b); int gsl_matrix_char_sub (gsl_matrix_char * a, const gsl_matrix_char * b); int gsl_matrix_char_mul_elements (gsl_matrix_char * a, const gsl_matrix_char * b); int gsl_matrix_char_div_elements (gsl_matrix_char * a, const gsl_matrix_char * b); int gsl_matrix_char_scale (gsl_matrix_char * a, const double x); int gsl_matrix_char_add_constant (gsl_matrix_char * a, const double x); int gsl_matrix_char_add_diagonal (gsl_matrix_char * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_char_get_row(gsl_vector_char * v, const gsl_matrix_char * m, const size_t i); int gsl_matrix_char_get_col(gsl_vector_char * v, const gsl_matrix_char * m, const size_t j); int gsl_matrix_char_set_row(gsl_matrix_char * m, const size_t i, const gsl_vector_char * v); int gsl_matrix_char_set_col(gsl_matrix_char * m, const size_t j, const gsl_vector_char * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL char gsl_matrix_char_get(const gsl_matrix_char * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_char_set(gsl_matrix_char * m, const size_t i, const size_t j, const char x); INLINE_DECL char * gsl_matrix_char_ptr(gsl_matrix_char * m, const size_t i, const size_t j); INLINE_DECL const char * gsl_matrix_char_const_ptr(const gsl_matrix_char * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN char gsl_matrix_char_get(const gsl_matrix_char * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_char_set(gsl_matrix_char * m, const size_t i, const size_t j, const char x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN char * gsl_matrix_char_ptr(gsl_matrix_char * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (char *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const char * gsl_matrix_char_const_ptr(const gsl_matrix_char * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const char *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_CHAR_H__ */ gsl-2.6/matrix/gsl_matrix_complex_double.h0000644016036000116100000003111013521366542016000 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_equal (const gsl_matrix_complex * a, const gsl_matrix_complex * b); int gsl_matrix_complex_isnull (const gsl_matrix_complex * m); int gsl_matrix_complex_ispos (const gsl_matrix_complex * m); int gsl_matrix_complex_isneg (const gsl_matrix_complex * m); int gsl_matrix_complex_isnonneg (const gsl_matrix_complex * m); int gsl_matrix_complex_add (gsl_matrix_complex * a, const gsl_matrix_complex * b); int gsl_matrix_complex_sub (gsl_matrix_complex * a, const gsl_matrix_complex * b); int gsl_matrix_complex_mul_elements (gsl_matrix_complex * a, const gsl_matrix_complex * b); int gsl_matrix_complex_div_elements (gsl_matrix_complex * a, const gsl_matrix_complex * b); int gsl_matrix_complex_scale (gsl_matrix_complex * a, const gsl_complex x); int gsl_matrix_complex_add_constant (gsl_matrix_complex * a, const gsl_complex x); int gsl_matrix_complex_add_diagonal (gsl_matrix_complex * a, const gsl_complex x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_complex_get_row(gsl_vector_complex * v, const gsl_matrix_complex * m, const size_t i); int gsl_matrix_complex_get_col(gsl_vector_complex * v, const gsl_matrix_complex * m, const size_t j); int gsl_matrix_complex_set_row(gsl_matrix_complex * m, const size_t i, const gsl_vector_complex * v); int gsl_matrix_complex_set_col(gsl_matrix_complex * m, const size_t j, const gsl_vector_complex * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL gsl_complex gsl_matrix_complex_get(const gsl_matrix_complex * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_complex_set(gsl_matrix_complex * m, const size_t i, const size_t j, const gsl_complex x); INLINE_DECL gsl_complex * gsl_matrix_complex_ptr(gsl_matrix_complex * m, const size_t i, const size_t j); INLINE_DECL const gsl_complex * gsl_matrix_complex_const_ptr(const gsl_matrix_complex * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN gsl_complex gsl_matrix_complex_get(const gsl_matrix_complex * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { gsl_complex zero = {{0,0}}; if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, zero) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, zero) ; } } #endif return *(gsl_complex *)(m->data + 2*(i * m->tda + j)) ; } INLINE_FUN void gsl_matrix_complex_set(gsl_matrix_complex * m, const size_t i, const size_t j, const gsl_complex x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif *(gsl_complex *)(m->data + 2*(i * m->tda + j)) = x ; } INLINE_FUN gsl_complex * gsl_matrix_complex_ptr(gsl_matrix_complex * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (gsl_complex *)(m->data + 2*(i * m->tda + j)) ; } INLINE_FUN const gsl_complex * gsl_matrix_complex_const_ptr(const gsl_matrix_complex * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const gsl_complex *)(m->data + 2*(i * m->tda + j)) ; } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_MATRIX_COMPLEX_DOUBLE_H__ */ gsl-2.6/matrix/gsl_matrix_complex_float.h0000644016036000116100000003343013521366540015640 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_equal (const gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b); int gsl_matrix_complex_float_isnull (const gsl_matrix_complex_float * m); int gsl_matrix_complex_float_ispos (const gsl_matrix_complex_float * m); int gsl_matrix_complex_float_isneg (const gsl_matrix_complex_float * m); int gsl_matrix_complex_float_isnonneg (const gsl_matrix_complex_float * m); int gsl_matrix_complex_float_add (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b); int gsl_matrix_complex_float_sub (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b); int gsl_matrix_complex_float_mul_elements (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b); int gsl_matrix_complex_float_div_elements (gsl_matrix_complex_float * a, const gsl_matrix_complex_float * b); int gsl_matrix_complex_float_scale (gsl_matrix_complex_float * a, const gsl_complex_float x); int gsl_matrix_complex_float_add_constant (gsl_matrix_complex_float * a, const gsl_complex_float x); int gsl_matrix_complex_float_add_diagonal (gsl_matrix_complex_float * a, const gsl_complex_float x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_complex_float_get_row(gsl_vector_complex_float * v, const gsl_matrix_complex_float * m, const size_t i); int gsl_matrix_complex_float_get_col(gsl_vector_complex_float * v, const gsl_matrix_complex_float * m, const size_t j); int gsl_matrix_complex_float_set_row(gsl_matrix_complex_float * m, const size_t i, const gsl_vector_complex_float * v); int gsl_matrix_complex_float_set_col(gsl_matrix_complex_float * m, const size_t j, const gsl_vector_complex_float * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL gsl_complex_float gsl_matrix_complex_float_get(const gsl_matrix_complex_float * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_complex_float_set(gsl_matrix_complex_float * m, const size_t i, const size_t j, const gsl_complex_float x); INLINE_DECL gsl_complex_float * gsl_matrix_complex_float_ptr(gsl_matrix_complex_float * m, const size_t i, const size_t j); INLINE_DECL const gsl_complex_float * gsl_matrix_complex_float_const_ptr(const gsl_matrix_complex_float * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN gsl_complex_float gsl_matrix_complex_float_get(const gsl_matrix_complex_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { gsl_complex_float zero = {{0,0}}; if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, zero) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, zero) ; } } #endif return *(gsl_complex_float *)(m->data + 2*(i * m->tda + j)) ; } INLINE_FUN void gsl_matrix_complex_float_set(gsl_matrix_complex_float * m, const size_t i, const size_t j, const gsl_complex_float x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif *(gsl_complex_float *)(m->data + 2*(i * m->tda + j)) = x ; } INLINE_FUN gsl_complex_float * gsl_matrix_complex_float_ptr(gsl_matrix_complex_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (gsl_complex_float *)(m->data + 2*(i * m->tda + j)) ; } INLINE_FUN const gsl_complex_float * gsl_matrix_complex_float_const_ptr(const gsl_matrix_complex_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const gsl_complex_float *)(m->data + 2*(i * m->tda + j)) ; } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_MATRIX_COMPLEX_FLOAT_H__ */ gsl-2.6/matrix/gsl_matrix_complex_long_double.h0000644016036000116100000003605613521366542017035 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_equal (const gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b); int gsl_matrix_complex_long_double_isnull (const gsl_matrix_complex_long_double * m); int gsl_matrix_complex_long_double_ispos (const gsl_matrix_complex_long_double * m); int gsl_matrix_complex_long_double_isneg (const gsl_matrix_complex_long_double * m); int gsl_matrix_complex_long_double_isnonneg (const gsl_matrix_complex_long_double * m); int gsl_matrix_complex_long_double_add (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b); int gsl_matrix_complex_long_double_sub (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b); int gsl_matrix_complex_long_double_mul_elements (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b); int gsl_matrix_complex_long_double_div_elements (gsl_matrix_complex_long_double * a, const gsl_matrix_complex_long_double * b); int gsl_matrix_complex_long_double_scale (gsl_matrix_complex_long_double * a, const gsl_complex_long_double x); int gsl_matrix_complex_long_double_add_constant (gsl_matrix_complex_long_double * a, const gsl_complex_long_double x); int gsl_matrix_complex_long_double_add_diagonal (gsl_matrix_complex_long_double * a, const gsl_complex_long_double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_complex_long_double_get_row(gsl_vector_complex_long_double * v, const gsl_matrix_complex_long_double * m, const size_t i); int gsl_matrix_complex_long_double_get_col(gsl_vector_complex_long_double * v, const gsl_matrix_complex_long_double * m, const size_t j); int gsl_matrix_complex_long_double_set_row(gsl_matrix_complex_long_double * m, const size_t i, const gsl_vector_complex_long_double * v); int gsl_matrix_complex_long_double_set_col(gsl_matrix_complex_long_double * m, const size_t j, const gsl_vector_complex_long_double * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL gsl_complex_long_double gsl_matrix_complex_long_double_get(const gsl_matrix_complex_long_double * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_complex_long_double_set(gsl_matrix_complex_long_double * m, const size_t i, const size_t j, const gsl_complex_long_double x); INLINE_DECL gsl_complex_long_double * gsl_matrix_complex_long_double_ptr(gsl_matrix_complex_long_double * m, const size_t i, const size_t j); INLINE_DECL const gsl_complex_long_double * gsl_matrix_complex_long_double_const_ptr(const gsl_matrix_complex_long_double * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN gsl_complex_long_double gsl_matrix_complex_long_double_get(const gsl_matrix_complex_long_double * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { gsl_complex_long_double zero = {{0,0}}; if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, zero) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, zero) ; } } #endif return *(gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) ; } INLINE_FUN void gsl_matrix_complex_long_double_set(gsl_matrix_complex_long_double * m, const size_t i, const size_t j, const gsl_complex_long_double x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif *(gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) = x ; } INLINE_FUN gsl_complex_long_double * gsl_matrix_complex_long_double_ptr(gsl_matrix_complex_long_double * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) ; } INLINE_FUN const gsl_complex_long_double * gsl_matrix_complex_long_double_const_ptr(const gsl_matrix_complex_long_double * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const gsl_complex_long_double *)(m->data + 2*(i * m->tda + j)) ; } #endif /* HAVE_INLINE */ __END_DECLS #endif /* __GSL_MATRIX_COMPLEX_LONG_DOUBLE_H__ */ gsl-2.6/matrix/gsl_matrix_double.h0000644016036000116100000002617713521366542014272 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); int gsl_matrix_add (gsl_matrix * a, const gsl_matrix * b); int gsl_matrix_sub (gsl_matrix * a, const gsl_matrix * b); int gsl_matrix_mul_elements (gsl_matrix * a, const gsl_matrix * b); int gsl_matrix_div_elements (gsl_matrix * a, const gsl_matrix * b); int gsl_matrix_scale (gsl_matrix * a, const double x); int gsl_matrix_add_constant (gsl_matrix * a, const double x); int gsl_matrix_add_diagonal (gsl_matrix * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_get_row(gsl_vector * v, const gsl_matrix * m, const size_t i); int gsl_matrix_get_col(gsl_vector * v, const gsl_matrix * m, const size_t j); int gsl_matrix_set_row(gsl_matrix * m, const size_t i, const gsl_vector * v); int gsl_matrix_set_col(gsl_matrix * m, const size_t j, const gsl_vector * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL double gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x); INLINE_DECL double * gsl_matrix_ptr(gsl_matrix * m, const size_t i, const size_t j); INLINE_DECL const double * gsl_matrix_const_ptr(const gsl_matrix * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN double gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN double * gsl_matrix_ptr(gsl_matrix * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (double *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const double * gsl_matrix_const_ptr(const gsl_matrix * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const double *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_DOUBLE_H__ */ gsl-2.6/matrix/gsl_matrix_float.h0000644016036000116100000003044213521366504014111 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); int gsl_matrix_float_add (gsl_matrix_float * a, const gsl_matrix_float * b); int gsl_matrix_float_sub (gsl_matrix_float * a, const gsl_matrix_float * b); int gsl_matrix_float_mul_elements (gsl_matrix_float * a, const gsl_matrix_float * b); int gsl_matrix_float_div_elements (gsl_matrix_float * a, const gsl_matrix_float * b); int gsl_matrix_float_scale (gsl_matrix_float * a, const double x); int gsl_matrix_float_add_constant (gsl_matrix_float * a, const double x); int gsl_matrix_float_add_diagonal (gsl_matrix_float * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_float_get_row(gsl_vector_float * v, const gsl_matrix_float * m, const size_t i); int gsl_matrix_float_get_col(gsl_vector_float * v, const gsl_matrix_float * m, const size_t j); int gsl_matrix_float_set_row(gsl_matrix_float * m, const size_t i, const gsl_vector_float * v); int gsl_matrix_float_set_col(gsl_matrix_float * m, const size_t j, const gsl_vector_float * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL float gsl_matrix_float_get(const gsl_matrix_float * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_float_set(gsl_matrix_float * m, const size_t i, const size_t j, const float x); INLINE_DECL float * gsl_matrix_float_ptr(gsl_matrix_float * m, const size_t i, const size_t j); INLINE_DECL const float * gsl_matrix_float_const_ptr(const gsl_matrix_float * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN float gsl_matrix_float_get(const gsl_matrix_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_float_set(gsl_matrix_float * m, const size_t i, const size_t j, const float x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN float * gsl_matrix_float_ptr(gsl_matrix_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (float *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const float * gsl_matrix_float_const_ptr(const gsl_matrix_float * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const float *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_FLOAT_H__ */ gsl-2.6/matrix/gsl_matrix_int.h0000644016036000116100000002753413521366542013610 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_add (gsl_matrix_int * a, const gsl_matrix_int * b); int gsl_matrix_int_sub (gsl_matrix_int * a, const gsl_matrix_int * b); int gsl_matrix_int_mul_elements (gsl_matrix_int * a, const gsl_matrix_int * b); int gsl_matrix_int_div_elements (gsl_matrix_int * a, const gsl_matrix_int * b); int gsl_matrix_int_scale (gsl_matrix_int * a, const double x); int gsl_matrix_int_add_constant (gsl_matrix_int * a, const double x); int gsl_matrix_int_add_diagonal (gsl_matrix_int * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_int_get_row(gsl_vector_int * v, const gsl_matrix_int * m, const size_t i); int gsl_matrix_int_get_col(gsl_vector_int * v, const gsl_matrix_int * m, const size_t j); int gsl_matrix_int_set_row(gsl_matrix_int * m, const size_t i, const gsl_vector_int * v); int gsl_matrix_int_set_col(gsl_matrix_int * m, const size_t j, const gsl_vector_int * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL int gsl_matrix_int_get(const gsl_matrix_int * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_int_set(gsl_matrix_int * m, const size_t i, const size_t j, const int x); INLINE_DECL int * gsl_matrix_int_ptr(gsl_matrix_int * m, const size_t i, const size_t j); INLINE_DECL const int * gsl_matrix_int_const_ptr(const gsl_matrix_int * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN int gsl_matrix_int_get(const gsl_matrix_int * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_int_set(gsl_matrix_int * m, const size_t i, const size_t j, const int x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN int * gsl_matrix_int_ptr(gsl_matrix_int * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (int *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const int * gsl_matrix_int_const_ptr(const gsl_matrix_int * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const int *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_INT_H__ */ gsl-2.6/matrix/gsl_matrix_long.h0000644016036000116100000003007713521366542013751 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); int gsl_matrix_long_add (gsl_matrix_long * a, const gsl_matrix_long * b); int gsl_matrix_long_sub (gsl_matrix_long * a, const gsl_matrix_long * b); int gsl_matrix_long_mul_elements (gsl_matrix_long * a, const gsl_matrix_long * b); int gsl_matrix_long_div_elements (gsl_matrix_long * a, const gsl_matrix_long * b); int gsl_matrix_long_scale (gsl_matrix_long * a, const double x); int gsl_matrix_long_add_constant (gsl_matrix_long * a, const double x); int gsl_matrix_long_add_diagonal (gsl_matrix_long * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_long_get_row(gsl_vector_long * v, const gsl_matrix_long * m, const size_t i); int gsl_matrix_long_get_col(gsl_vector_long * v, const gsl_matrix_long * m, const size_t j); int gsl_matrix_long_set_row(gsl_matrix_long * m, const size_t i, const gsl_vector_long * v); int gsl_matrix_long_set_col(gsl_matrix_long * m, const size_t j, const gsl_vector_long * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL long gsl_matrix_long_get(const gsl_matrix_long * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_long_set(gsl_matrix_long * m, const size_t i, const size_t j, const long x); INLINE_DECL long * gsl_matrix_long_ptr(gsl_matrix_long * m, const size_t i, const size_t j); INLINE_DECL const long * gsl_matrix_long_const_ptr(const gsl_matrix_long * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN long gsl_matrix_long_get(const gsl_matrix_long * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_long_set(gsl_matrix_long * m, const size_t i, const size_t j, const long x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN long * gsl_matrix_long_ptr(gsl_matrix_long * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (long *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const long * gsl_matrix_long_const_ptr(const gsl_matrix_long * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const long *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_LONG_H__ */ gsl-2.6/matrix/gsl_matrix_long_double.h0000644016036000116100000003316413521366542015303 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); int gsl_matrix_long_double_add (gsl_matrix_long_double * a, const gsl_matrix_long_double * b); int gsl_matrix_long_double_sub (gsl_matrix_long_double * a, const gsl_matrix_long_double * b); int gsl_matrix_long_double_mul_elements (gsl_matrix_long_double * a, const gsl_matrix_long_double * b); int gsl_matrix_long_double_div_elements (gsl_matrix_long_double * a, const gsl_matrix_long_double * b); int gsl_matrix_long_double_scale (gsl_matrix_long_double * a, const double x); int gsl_matrix_long_double_add_constant (gsl_matrix_long_double * a, const double x); int gsl_matrix_long_double_add_diagonal (gsl_matrix_long_double * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_long_double_get_row(gsl_vector_long_double * v, const gsl_matrix_long_double * m, const size_t i); int gsl_matrix_long_double_get_col(gsl_vector_long_double * v, const gsl_matrix_long_double * m, const size_t j); int gsl_matrix_long_double_set_row(gsl_matrix_long_double * m, const size_t i, const gsl_vector_long_double * v); int gsl_matrix_long_double_set_col(gsl_matrix_long_double * m, const size_t j, const gsl_vector_long_double * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL long double gsl_matrix_long_double_get(const gsl_matrix_long_double * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_long_double_set(gsl_matrix_long_double * m, const size_t i, const size_t j, const long double x); INLINE_DECL long double * gsl_matrix_long_double_ptr(gsl_matrix_long_double * m, const size_t i, const size_t j); INLINE_DECL const long double * gsl_matrix_long_double_const_ptr(const gsl_matrix_long_double * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN long double gsl_matrix_long_double_get(const gsl_matrix_long_double * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_long_double_set(gsl_matrix_long_double * m, const size_t i, const size_t j, const long double x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN long double * gsl_matrix_long_double_ptr(gsl_matrix_long_double * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (long double *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const long double * gsl_matrix_long_double_const_ptr(const gsl_matrix_long_double * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const long double *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_LONG_DOUBLE_H__ */ gsl-2.6/matrix/gsl_matrix_short.h0000644016036000116100000003044213521366542014145 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); int gsl_matrix_short_add (gsl_matrix_short * a, const gsl_matrix_short * b); int gsl_matrix_short_sub (gsl_matrix_short * a, const gsl_matrix_short * b); int gsl_matrix_short_mul_elements (gsl_matrix_short * a, const gsl_matrix_short * b); int gsl_matrix_short_div_elements (gsl_matrix_short * a, const gsl_matrix_short * b); int gsl_matrix_short_scale (gsl_matrix_short * a, const double x); int gsl_matrix_short_add_constant (gsl_matrix_short * a, const double x); int gsl_matrix_short_add_diagonal (gsl_matrix_short * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_short_get_row(gsl_vector_short * v, const gsl_matrix_short * m, const size_t i); int gsl_matrix_short_get_col(gsl_vector_short * v, const gsl_matrix_short * m, const size_t j); int gsl_matrix_short_set_row(gsl_matrix_short * m, const size_t i, const gsl_vector_short * v); int gsl_matrix_short_set_col(gsl_matrix_short * m, const size_t j, const gsl_vector_short * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL short gsl_matrix_short_get(const gsl_matrix_short * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_short_set(gsl_matrix_short * m, const size_t i, const size_t j, const short x); INLINE_DECL short * gsl_matrix_short_ptr(gsl_matrix_short * m, const size_t i, const size_t j); INLINE_DECL const short * gsl_matrix_short_const_ptr(const gsl_matrix_short * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN short gsl_matrix_short_get(const gsl_matrix_short * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_short_set(gsl_matrix_short * m, const size_t i, const size_t j, const short x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN short * gsl_matrix_short_ptr(gsl_matrix_short * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (short *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const short * gsl_matrix_short_const_ptr(const gsl_matrix_short * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const short *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_SHORT_H__ */ gsl-2.6/matrix/gsl_matrix_uchar.h0000644016036000116100000003070213521366542014107 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); int gsl_matrix_uchar_add (gsl_matrix_uchar * a, const gsl_matrix_uchar * b); int gsl_matrix_uchar_sub (gsl_matrix_uchar * a, const gsl_matrix_uchar * b); int gsl_matrix_uchar_mul_elements (gsl_matrix_uchar * a, const gsl_matrix_uchar * b); int gsl_matrix_uchar_div_elements (gsl_matrix_uchar * a, const gsl_matrix_uchar * b); int gsl_matrix_uchar_scale (gsl_matrix_uchar * a, const double x); int gsl_matrix_uchar_add_constant (gsl_matrix_uchar * a, const double x); int gsl_matrix_uchar_add_diagonal (gsl_matrix_uchar * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_uchar_get_row(gsl_vector_uchar * v, const gsl_matrix_uchar * m, const size_t i); int gsl_matrix_uchar_get_col(gsl_vector_uchar * v, const gsl_matrix_uchar * m, const size_t j); int gsl_matrix_uchar_set_row(gsl_matrix_uchar * m, const size_t i, const gsl_vector_uchar * v); int gsl_matrix_uchar_set_col(gsl_matrix_uchar * m, const size_t j, const gsl_vector_uchar * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL unsigned char gsl_matrix_uchar_get(const gsl_matrix_uchar * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_uchar_set(gsl_matrix_uchar * m, const size_t i, const size_t j, const unsigned char x); INLINE_DECL unsigned char * gsl_matrix_uchar_ptr(gsl_matrix_uchar * m, const size_t i, const size_t j); INLINE_DECL const unsigned char * gsl_matrix_uchar_const_ptr(const gsl_matrix_uchar * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned char gsl_matrix_uchar_get(const gsl_matrix_uchar * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_uchar_set(gsl_matrix_uchar * m, const size_t i, const size_t j, const unsigned char x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN unsigned char * gsl_matrix_uchar_ptr(gsl_matrix_uchar * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (unsigned char *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const unsigned char * gsl_matrix_uchar_const_ptr(const gsl_matrix_uchar * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const unsigned char *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_UCHAR_H__ */ gsl-2.6/matrix/gsl_matrix_uint.h0000644016036000116100000003033713521366542013770 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); int gsl_matrix_uint_add (gsl_matrix_uint * a, const gsl_matrix_uint * b); int gsl_matrix_uint_sub (gsl_matrix_uint * a, const gsl_matrix_uint * b); int gsl_matrix_uint_mul_elements (gsl_matrix_uint * a, const gsl_matrix_uint * b); int gsl_matrix_uint_div_elements (gsl_matrix_uint * a, const gsl_matrix_uint * b); int gsl_matrix_uint_scale (gsl_matrix_uint * a, const double x); int gsl_matrix_uint_add_constant (gsl_matrix_uint * a, const double x); int gsl_matrix_uint_add_diagonal (gsl_matrix_uint * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_uint_get_row(gsl_vector_uint * v, const gsl_matrix_uint * m, const size_t i); int gsl_matrix_uint_get_col(gsl_vector_uint * v, const gsl_matrix_uint * m, const size_t j); int gsl_matrix_uint_set_row(gsl_matrix_uint * m, const size_t i, const gsl_vector_uint * v); int gsl_matrix_uint_set_col(gsl_matrix_uint * m, const size_t j, const gsl_vector_uint * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL unsigned int gsl_matrix_uint_get(const gsl_matrix_uint * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_uint_set(gsl_matrix_uint * m, const size_t i, const size_t j, const unsigned int x); INLINE_DECL unsigned int * gsl_matrix_uint_ptr(gsl_matrix_uint * m, const size_t i, const size_t j); INLINE_DECL const unsigned int * gsl_matrix_uint_const_ptr(const gsl_matrix_uint * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned int gsl_matrix_uint_get(const gsl_matrix_uint * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_uint_set(gsl_matrix_uint * m, const size_t i, const size_t j, const unsigned int x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN unsigned int * gsl_matrix_uint_ptr(gsl_matrix_uint * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (unsigned int *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const unsigned int * gsl_matrix_uint_const_ptr(const gsl_matrix_uint * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const unsigned int *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_UINT_H__ */ gsl-2.6/matrix/gsl_matrix_ulong.h0000644016036000116100000003070213521366542014131 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); int gsl_matrix_ulong_add (gsl_matrix_ulong * a, const gsl_matrix_ulong * b); int gsl_matrix_ulong_sub (gsl_matrix_ulong * a, const gsl_matrix_ulong * b); int gsl_matrix_ulong_mul_elements (gsl_matrix_ulong * a, const gsl_matrix_ulong * b); int gsl_matrix_ulong_div_elements (gsl_matrix_ulong * a, const gsl_matrix_ulong * b); int gsl_matrix_ulong_scale (gsl_matrix_ulong * a, const double x); int gsl_matrix_ulong_add_constant (gsl_matrix_ulong * a, const double x); int gsl_matrix_ulong_add_diagonal (gsl_matrix_ulong * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_ulong_get_row(gsl_vector_ulong * v, const gsl_matrix_ulong * m, const size_t i); int gsl_matrix_ulong_get_col(gsl_vector_ulong * v, const gsl_matrix_ulong * m, const size_t j); int gsl_matrix_ulong_set_row(gsl_matrix_ulong * m, const size_t i, const gsl_vector_ulong * v); int gsl_matrix_ulong_set_col(gsl_matrix_ulong * m, const size_t j, const gsl_vector_ulong * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL unsigned long gsl_matrix_ulong_get(const gsl_matrix_ulong * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_ulong_set(gsl_matrix_ulong * m, const size_t i, const size_t j, const unsigned long x); INLINE_DECL unsigned long * gsl_matrix_ulong_ptr(gsl_matrix_ulong * m, const size_t i, const size_t j); INLINE_DECL const unsigned long * gsl_matrix_ulong_const_ptr(const gsl_matrix_ulong * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned long gsl_matrix_ulong_get(const gsl_matrix_ulong * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_ulong_set(gsl_matrix_ulong * m, const size_t i, const size_t j, const unsigned long x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN unsigned long * gsl_matrix_ulong_ptr(gsl_matrix_ulong * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (unsigned long *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const unsigned long * gsl_matrix_ulong_const_ptr(const gsl_matrix_ulong * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const unsigned long *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_ULONG_H__ */ gsl-2.6/matrix/gsl_matrix_ushort.h0000644016036000116100000003124513521366542014334 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); int gsl_matrix_ushort_add (gsl_matrix_ushort * a, const gsl_matrix_ushort * b); int gsl_matrix_ushort_sub (gsl_matrix_ushort * a, const gsl_matrix_ushort * b); int gsl_matrix_ushort_mul_elements (gsl_matrix_ushort * a, const gsl_matrix_ushort * b); int gsl_matrix_ushort_div_elements (gsl_matrix_ushort * a, const gsl_matrix_ushort * b); int gsl_matrix_ushort_scale (gsl_matrix_ushort * a, const double x); int gsl_matrix_ushort_add_constant (gsl_matrix_ushort * a, const double x); int gsl_matrix_ushort_add_diagonal (gsl_matrix_ushort * a, const double x); /***********************************************************************/ /* The functions below are obsolete */ /***********************************************************************/ int gsl_matrix_ushort_get_row(gsl_vector_ushort * v, const gsl_matrix_ushort * m, const size_t i); int gsl_matrix_ushort_get_col(gsl_vector_ushort * v, const gsl_matrix_ushort * m, const size_t j); int gsl_matrix_ushort_set_row(gsl_matrix_ushort * m, const size_t i, const gsl_vector_ushort * v); int gsl_matrix_ushort_set_col(gsl_matrix_ushort * m, const size_t j, const gsl_vector_ushort * v); /***********************************************************************/ /* inline functions if you are using GCC */ INLINE_DECL unsigned short gsl_matrix_ushort_get(const gsl_matrix_ushort * m, const size_t i, const size_t j); INLINE_DECL void gsl_matrix_ushort_set(gsl_matrix_ushort * m, const size_t i, const size_t j, const unsigned short x); INLINE_DECL unsigned short * gsl_matrix_ushort_ptr(gsl_matrix_ushort * m, const size_t i, const size_t j); INLINE_DECL const unsigned short * gsl_matrix_ushort_const_ptr(const gsl_matrix_ushort * m, const size_t i, const size_t j); #ifdef HAVE_INLINE INLINE_FUN unsigned short gsl_matrix_ushort_get(const gsl_matrix_ushort * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VAL("first index out of range", GSL_EINVAL, 0) ; } else if (j >= m->size2) { GSL_ERROR_VAL("second index out of range", GSL_EINVAL, 0) ; } } #endif return m->data[i * m->tda + j] ; } INLINE_FUN void gsl_matrix_ushort_set(gsl_matrix_ushort * m, const size_t i, const size_t j, const unsigned short x) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_VOID("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_VOID("second index out of range", GSL_EINVAL) ; } } #endif m->data[i * m->tda + j] = x ; } INLINE_FUN unsigned short * gsl_matrix_ushort_ptr(gsl_matrix_ushort * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (unsigned short *) (m->data + (i * m->tda + j)) ; } INLINE_FUN const unsigned short * gsl_matrix_ushort_const_ptr(const gsl_matrix_ushort * m, const size_t i, const size_t j) { #if GSL_RANGE_CHECK if (GSL_RANGE_COND(1)) { if (i >= m->size1) { GSL_ERROR_NULL("first index out of range", GSL_EINVAL) ; } else if (j >= m->size2) { GSL_ERROR_NULL("second index out of range", GSL_EINVAL) ; } } #endif return (const unsigned short *) (m->data + (i * m->tda + j)) ; } #endif __END_DECLS #endif /* __GSL_MATRIX_USHORT_H__ */ gsl-2.6/matrix/ChangeLog0000644016036000116100000001751313373111455012156 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.6/matrix/TODO0000644016036000116100000000055413373111455011071 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.6/matrix/init.c0000644016036000116100000000340513373111455011506 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.6/matrix/matrix.c0000644016036000116100000000031113373111455012040 00000000000000#include #include #include /* Compile all the inline matrix functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-2.6/matrix/file.c0000644016036000116100000000341513135126237011463 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.6/matrix/rowcol.c0000644016036000116100000000710713135126237012053 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.6/matrix/swap.c0000644016036000116100000000350113521367701011514 00000000000000#include #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.6/matrix/copy.c0000644016036000116100000000350013521343130011501 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.6/matrix/minmax.c0000644016036000116100000000260313135126237012033 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.6/matrix/prop.c0000644016036000116100000000336113135126237011524 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.6/matrix/oper.c0000644016036000116100000000346013135126237011511 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.6/matrix/getset.c0000644016036000116100000000345113135126237012037 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.6/matrix/view.c0000644016036000116100000000673113135126237011522 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.6/matrix/submatrix.c0000644016036000116100000000723313135126237012564 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.6/matrix/view.h0000644016036000116100000000024513135126237011521 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.6/matrix/test.c0000644016036000116100000001462313521347701011526 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.6/matrix/test_static.c0000644016036000116100000000015213135126237013065 00000000000000 #undef HAVE_INLINE #ifndef NO_INLINE #define NO_INLINE #endif #define DESC " (static)" #include "test.c" gsl-2.6/permutation/0000755016036000116100000000000013527016556011527 500000000000000gsl-2.6/permutation/Makefile.in0000644016036000116100000010733213527016363013516 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = permutation DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslpermutation_la_LIBADD = am_libgslpermutation_la_OBJECTS = init.lo file.lo permutation.lo \ permute.lo canonical.lo inline.lo libgslpermutation_la_OBJECTS = $(am_libgslpermutation_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslpermutation.la ../vector/libgslvector.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslpermutation_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslpermutation_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslpermutation.la pkginclude_HEADERS = gsl_permutation.h gsl_permute.h \ gsl_permute_char.h gsl_permute_complex_double.h \ gsl_permute_complex_float.h gsl_permute_complex_long_double.h \ gsl_permute_double.h gsl_permute_float.h gsl_permute_int.h \ gsl_permute_long.h gsl_permute_long_double.h \ gsl_permute_short.h gsl_permute_uchar.h gsl_permute_uint.h \ gsl_permute_ulong.h gsl_permute_ushort.h gsl_permute_vector.h \ gsl_permute_vector_char.h gsl_permute_vector_complex_double.h \ gsl_permute_vector_complex_float.h \ gsl_permute_vector_complex_long_double.h \ gsl_permute_vector_double.h gsl_permute_vector_float.h \ gsl_permute_vector_int.h gsl_permute_vector_long.h \ gsl_permute_vector_long_double.h gsl_permute_vector_short.h \ gsl_permute_vector_uchar.h gsl_permute_vector_uint.h \ gsl_permute_vector_ulong.h gsl_permute_vector_ushort.h \ gsl_permute_matrix_char.h \ gsl_permute_matrix_complex_long_double.h gsl_permute_matrix.h \ gsl_permute_matrix_long.h gsl_permute_matrix_uint.h \ gsl_permute_matrix_complex_double.h \ gsl_permute_matrix_double.h gsl_permute_matrix_int.h \ gsl_permute_matrix_short.h gsl_permute_matrix_ulong.h \ gsl_permute_matrix_complex_float.h gsl_permute_matrix_float.h \ gsl_permute_matrix_long_double.h gsl_permute_matrix_uchar.h \ gsl_permute_matrix_ushort.h AM_CPPFLAGS = -I$(top_srcdir) libgslpermutation_la_SOURCES = init.c file.c permutation.c permute.c canonical.c inline.c noinst_HEADERS = permute_source.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu permutation/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu permutation/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslpermutation.la: $(libgslpermutation_la_OBJECTS) $(libgslpermutation_la_DEPENDENCIES) $(EXTRA_libgslpermutation_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslpermutation_la_OBJECTS) $(libgslpermutation_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/canonical.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permutation.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permute.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #CLEANFILES = test.txt test.dat # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/permutation/Makefile.am0000644016036000116100000000331713373111456013501 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.6/permutation/permute_source.c0000644016036000116100000001051113373111456014644 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.6/permutation/gsl_permutation.h0000644016036000116100000000642213373111456015032 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.6/permutation/gsl_permute.h0000644016036000116100000000114613135126237014141 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.6/permutation/gsl_permute_char.h0000644016036000116100000000262613135126237015142 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.6/permutation/gsl_permute_complex_double.h0000644016036000116100000000274513135126237017230 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.6/permutation/gsl_permute_complex_float.h0000644016036000116100000000275313135126237017062 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.6/permutation/gsl_permute_complex_long_double.h0000644016036000116100000000303313135126237020236 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.6/permutation/gsl_permute_double.h0000644016036000116100000000263013135126237015472 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.6/permutation/gsl_permute_float.h0000644016036000116100000000263613135126237015333 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.6/permutation/gsl_permute_int.h0000644016036000116100000000261613135126237015016 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.6/permutation/gsl_permute_long.h0000644016036000116100000000262613135126237015164 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.6/permutation/gsl_permute_long_double.h0000644016036000116100000000271613135126237016516 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.6/permutation/gsl_permute_short.h0000644016036000116100000000263613135126237015365 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.6/permutation/gsl_permute_uchar.h0000644016036000116100000000265613135126237015332 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.6/permutation/gsl_permute_uint.h0000644016036000116100000000264613135126237015206 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.6/permutation/gsl_permute_ulong.h0000644016036000116100000000265613135126237015354 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.6/permutation/gsl_permute_ushort.h0000644016036000116100000000266613135126237015555 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.6/permutation/gsl_permute_vector.h0000644016036000116100000000133513135126237015523 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.6/permutation/gsl_permute_vector_char.h0000644016036000116100000000267113135126237016524 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.6/permutation/gsl_permute_vector_complex_double.h0000644016036000116100000000276713135126237020616 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.6/permutation/gsl_permute_vector_complex_float.h0000644016036000116100000000301213135126237020431 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.6/permutation/gsl_permute_vector_complex_long_double.h0000644016036000116100000000310013135126237021613 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.6/permutation/gsl_permute_vector_double.h0000644016036000116100000000265713135126237017065 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.6/permutation/gsl_permute_vector_float.h0000644016036000116100000000270213135126237016707 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.6/permutation/gsl_permute_vector_int.h0000644016036000116100000000266013135126237016377 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.6/permutation/gsl_permute_vector_long.h0000644016036000116100000000267113135126237016546 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.6/permutation/gsl_permute_vector_long_double.h0000644016036000116100000000277013135126237020100 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.6/permutation/gsl_permute_vector_short.h0000644016036000116100000000270213135126237016741 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.6/permutation/gsl_permute_vector_uchar.h0000644016036000116100000000270213135126237016704 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.6/permutation/gsl_permute_vector_uint.h0000644016036000116100000000267113135126237016566 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.6/permutation/gsl_permute_vector_ulong.h0000644016036000116100000000270213135126237016726 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.6/permutation/gsl_permute_vector_ushort.h0000644016036000116100000000271313135126237017130 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.6/permutation/gsl_permute_matrix_char.h0000644016036000116100000000250713373111456016525 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.6/permutation/gsl_permute_matrix_complex_long_double.h0000644016036000116100000000266013373111456021630 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.6/permutation/gsl_permute_matrix.h0000644016036000116100000000133513373111456015526 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.6/permutation/gsl_permute_matrix_long.h0000644016036000116100000000250713373111456016547 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.6/permutation/gsl_permute_matrix_uint.h0000644016036000116100000000250713373111456016567 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.6/permutation/gsl_permute_matrix_complex_double.h0000644016036000116100000000257713373111456020620 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.6/permutation/gsl_permute_matrix_double.h0000644016036000116100000000250713373111456017062 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.6/permutation/gsl_permute_matrix_int.h0000644016036000116100000000250013373111456016373 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.6/permutation/gsl_permute_matrix_short.h0000644016036000116100000000251613373111456016747 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.6/permutation/gsl_permute_matrix_ulong.h0000644016036000116100000000251613373111456016734 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.6/permutation/gsl_permute_matrix_complex_float.h0000644016036000116100000000260613373111456020444 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.6/permutation/gsl_permute_matrix_float.h0000644016036000116100000000251613373111456016715 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.6/permutation/gsl_permute_matrix_long_double.h0000644016036000116100000000257013373111456020101 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.6/permutation/gsl_permute_matrix_uchar.h0000644016036000116100000000251613373111456016712 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.6/permutation/gsl_permute_matrix_ushort.h0000644016036000116100000000252513373111456017134 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.6/permutation/ChangeLog0000644016036000116100000000432413373111456013216 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.6/permutation/init.c0000644016036000116100000000425413373111456012555 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.6/permutation/file.c0000644016036000116100000000463113135126237012527 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.6/permutation/permutation.c0000644016036000116100000001221113373111456014151 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.6/permutation/permute.c0000644016036000116100000000363413373111456013274 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.6/permutation/canonical.c0000644016036000116100000000703013135126237013533 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.6/permutation/inline.c0000644016036000116100000000170113373111456013062 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.6/permutation/test.c0000644016036000116100000002340413135126237012566 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.6/combination/0000755016036000116100000000000013527016556011462 500000000000000gsl-2.6/combination/Makefile.in0000644016036000116100000010474113527016361013450 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = combination DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslcombination_la_LIBADD = am_libgslcombination_la_OBJECTS = init.lo file.lo combination.lo \ inline.lo libgslcombination_la_OBJECTS = $(am_libgslcombination_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslcombination.la ../vector/libgslvector.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcombination_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcombination_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcombination.la pkginclude_HEADERS = gsl_combination.h AM_CPPFLAGS = -I$(top_srcdir) libgslcombination_la_SOURCES = init.c file.c combination.c inline.c noinst_HEADERS = TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslcombination.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu combination/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu combination/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcombination.la: $(libgslcombination_la_OBJECTS) $(libgslcombination_la_DEPENDENCIES) $(EXTRA_libgslcombination_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcombination_la_OBJECTS) $(libgslcombination_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combination.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #noinst_PROGRAMS = demo #demo_SOURCES = demo.c #demo_LDADD = libgslcombination.la ../vector/libgslvector.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la #CLEANFILES = test.txt test.dat # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/combination/Makefile.am0000644016036000116100000000130013373111454013420 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.6/combination/gsl_combination.h0000644016036000116100000000546213373111454014721 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.6/combination/ChangeLog0000644016036000116100000000261713373111454013152 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.6/combination/TODO0000644016036000116100000000020713373111454012061 00000000000000# -*- org -*- #+CATEGORY: combination * The module has a lot of overlap with multiset/ some of the functions could be abstracted out. gsl-2.6/combination/init.c0000644016036000116100000000537313373111454012511 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.6/combination/file.c0000644016036000116100000000464413135126237012466 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.6/combination/combination.c0000644016036000116100000000706113373111454014044 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.6/combination/inline.c0000644016036000116100000000162113373111454013014 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.6/combination/test.c0000644016036000116100000001460313135126237012522 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.6/multiset/0000755016036000116100000000000013527016556011026 500000000000000gsl-2.6/multiset/Makefile.in0000644016036000116100000010456413527016363013021 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multiset DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultiset_la_LIBADD = am_libgslmultiset_la_OBJECTS = init.lo file.lo multiset.lo inline.lo libgslmultiset_la_OBJECTS = $(am_libgslmultiset_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultiset.la ../vector/libgslvector.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultiset_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultiset_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultiset.la pkginclude_HEADERS = gsl_multiset.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultiset_la_SOURCES = init.c file.c multiset.c inline.c noinst_HEADERS = TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultiset.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multiset/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multiset/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultiset.la: $(libgslmultiset_la_OBJECTS) $(libgslmultiset_la_DEPENDENCIES) $(EXTRA_libgslmultiset_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultiset_la_OBJECTS) $(libgslmultiset_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #noinst_PROGRAMS = demo #demo_SOURCES = demo.c #demo_LDADD = libgslmultiset.la ../vector/libgslvector.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multiset/Makefile.am0000644016036000116100000000121113373111456012767 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.6/multiset/gsl_multiset.h0000644016036000116100000000534013373111456013626 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.6/multiset/ChangeLog0000644016036000116100000000077613373111456012524 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.6/multiset/TODO0000644016036000116100000000020713373111456011427 00000000000000# -*- org -*- #+CATEGORY: multiset * The module has a lot of overlap with combination/ some of the functions could be abstracted out. gsl-2.6/multiset/init.c0000644016036000116100000000523013373111456012047 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.6/multiset/file.c0000644016036000116100000000470213373111456012026 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.6/multiset/multiset.c0000644016036000116100000000655613373111456012766 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.6/multiset/inline.c0000644016036000116100000000160713373111456012366 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.6/multiset/test.c0000644016036000116100000002057613373111456012075 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.6/sort/0000755016036000116100000000000013527016556010147 500000000000000gsl-2.6/sort/Makefile.in0000644016036000116100000010600513527016364012133 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = sort DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsort_la_LIBADD = am_libgslsort_la_OBJECTS = sort.lo sortind.lo sortvec.lo sortvecind.lo \ subset.lo subsetind.lo libgslsort_la_OBJECTS = $(am_libgslsort_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslsort.la ../permutation/libgslpermutation.la \ ../vector/libgslvector.la ../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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsort_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsort_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsort.la pkginclude_HEADERS = gsl_heapsort.h gsl_sort.h gsl_sort_char.h gsl_sort_double.h gsl_sort_float.h gsl_sort_int.h gsl_sort_long.h gsl_sort_long_double.h gsl_sort_short.h gsl_sort_uchar.h gsl_sort_uint.h gsl_sort_ulong.h gsl_sort_ushort.h gsl_sort_vector.h gsl_sort_vector_char.h gsl_sort_vector_double.h gsl_sort_vector_float.h gsl_sort_vector_int.h gsl_sort_vector_long.h gsl_sort_vector_long_double.h gsl_sort_vector_short.h gsl_sort_vector_uchar.h gsl_sort_vector_uint.h gsl_sort_vector_ulong.h gsl_sort_vector_ushort.h AM_CPPFLAGS = -I$(top_srcdir) libgslsort_la_SOURCES = sort.c sortind.c sortvec.c sortvecind.c subset.c subsetind.c noinst_HEADERS = sortvec_source.c sortvecind_source.c subset_source.c subsetind_source.c test_source.c test_heapsort.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslsort.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsort.la: $(libgslsort_la_OBJECTS) $(libgslsort_la_DEPENDENCIES) $(EXTRA_libgslsort_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsort_la_OBJECTS) $(libgslsort_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortvec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sortvecind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subsetind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/sort/Makefile.am0000644016036000116100000000214313517225234012115 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.6/sort/sortvec_source.c0000644016036000116100000000777213373111456013307 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.6/sort/sortvecind_source.c0000644016036000116100000000467713135126237014002 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.6/sort/subset_source.c0000644016036000116100000000563013135126237013115 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.6/sort/subsetind_source.c0000644016036000116100000000574113135126237013613 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.6/sort/test_source.c0000644016036000116100000002454313373111456012574 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.6/sort/test_heapsort.c0000644016036000116100000000776313135126237013125 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.6/sort/gsl_heapsort.h0000644016036000116100000000265613135126237012734 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.6/sort/gsl_sort.h0000644016036000116100000000066313135126237012072 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.6/sort/gsl_sort_char.h0000644016036000116100000000366613373111456013076 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.6/sort/gsl_sort_double.h0000644016036000116100000000365713373111456013433 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.6/sort/gsl_sort_float.h0000644016036000116100000000371313373111456013257 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.6/sort/gsl_sort_int.h0000644016036000116100000000364113373111456012744 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.6/sort/gsl_sort_long.h0000644016036000116100000000366613373111456013120 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.6/sort/gsl_sort_long_double.h0000644016036000116100000000411113373111456014434 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.6/sort/gsl_sort_short.h0000644016036000116100000000371313373111456013311 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.6/sort/gsl_sort_uchar.h0000644016036000116100000000403313373111456013250 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.6/sort/gsl_sort_uint.h0000644016036000116100000000400613373111456013125 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.6/sort/gsl_sort_ulong.h0000644016036000116100000000403313373111456013272 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.6/sort/gsl_sort_ushort.h0000644016036000116100000000406013373111456013472 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.6/sort/gsl_sort_vector.h0000644016036000116100000000102513135126237013445 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.6/sort/gsl_sort_vector_char.h0000644016036000116100000000352613373111456014453 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.6/sort/gsl_sort_vector_double.h0000644016036000116100000000343113373111456015003 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.6/sort/gsl_sort_vector_float.h0000644016036000116100000000355413373111456014644 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.6/sort/gsl_sort_vector_int.h0000644016036000116100000000350013373111456014320 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.6/sort/gsl_sort_vector_long.h0000644016036000116100000000352613373111456014475 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.6/sort/gsl_sort_vector_long_double.h0000644016036000116100000000376013373111456016027 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.6/sort/gsl_sort_vector_short.h0000644016036000116100000000355413373111456014676 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.6/sort/gsl_sort_vector_uchar.h0000644016036000116100000000357413373111456014643 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.6/sort/gsl_sort_vector_uint.h0000644016036000116100000000354613373111456014517 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.6/sort/gsl_sort_vector_ulong.h0000644016036000116100000000357413373111456014665 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.6/sort/gsl_sort_vector_ushort.h0000644016036000116100000000362213373111456015057 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.6/sort/ChangeLog0000644016036000116100000000412613373111456011636 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.6/sort/TODO0000644016036000116100000000225713373111456010557 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.6/sort/sort.c0000644016036000116100000000523713135126237011222 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.6/sort/sortind.c0000644016036000116100000000472513135126237011716 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.6/sort/sortvec.c0000644016036000116100000000415213135126237011713 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.6/sort/sortvecind.c0000644016036000116100000000421313135126237012404 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.6/sort/subset.c0000644016036000116100000000371413135126237011536 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.6/sort/subsetind.c0000644016036000116100000000376013135126237012232 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.6/sort/test.c0000644016036000116100000000647313135126237011215 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.6/ieee-utils/0000755016036000116100000000000013527016556011225 500000000000000gsl-2.6/ieee-utils/Makefile.in0000644016036000116100000010457213527016362013216 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = ieee-utils DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslieeeutils_la_LIBADD = am_libgslieeeutils_la_OBJECTS = print.lo make_rep.lo env.lo fp.lo \ read.lo libgslieeeutils_la_OBJECTS = $(am_libgslieeeutils_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslieeeutils.la ../err/libgslerr.la \ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslieeeutils_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslieeeutils_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslieeeutils.la pkginclude_HEADERS = gsl_ieee_utils.h libgslieeeutils_la_SOURCES = print.c make_rep.c gsl_ieee_utils.h env.c fp.c read.c noinst_HEADERS = fp-aix.c fp-darwin.c fp-darwin86.c fp-hpux.c fp-hpux11.c fp-irix.c fp-gnum68k.c fp-gnuppc.c fp-solaris.c fp-gnusparc.c fp-sunos4.c fp-tru64.c fp-unknown.c fp-gnux86.c fp-freebsd.c fp-os2emx.c fp-netbsd.c fp-openbsd.c fp-gnuc99.c endian.c standardize.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ieee-utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ieee-utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslieeeutils.la: $(libgslieeeutils_la_OBJECTS) $(libgslieeeutils_la_DEPENDENCIES) $(EXTRA_libgslieeeutils_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslieeeutils_la_OBJECTS) $(libgslieeeutils_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_rep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/ieee-utils/Makefile.am0000644016036000116100000000121413373111455013170 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.6/ieee-utils/fp-aix.c0000644016036000116100000000772013373111455012474 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.6/ieee-utils/fp-darwin.c0000644016036000116100000000555313135126237013201 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.6/ieee-utils/fp-darwin86.c0000644016036000116100000001237513135126237013357 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.6/ieee-utils/fp-hpux.c0000644016036000116100000000545713135126237012704 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.6/ieee-utils/fp-hpux11.c0000644016036000116100000000536513135126237013044 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.6/ieee-utils/fp-irix.c0000644016036000116100000000542013135126237012661 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.6/ieee-utils/fp-gnum68k.c0000644016036000116100000000527313135126237013213 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.6/ieee-utils/fp-gnuppc.c0000644016036000116100000000533613135126237013210 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.6/ieee-utils/fp-solaris.c0000644016036000116100000000544613135126237013372 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.6/ieee-utils/fp-gnusparc.c0000644016036000116100000000466213135126237013537 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.6/ieee-utils/fp-sunos4.c0000644016036000116100000000632213135126237013143 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.6/ieee-utils/fp-tru64.c0000644016036000116100000001317713135126237012702 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.6/ieee-utils/fp-unknown.c0000644016036000116100000000213113135126237013401 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.6/ieee-utils/fp-gnux86.c0000644016036000116100000000545613135126237013056 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.6/ieee-utils/fp-freebsd.c0000644016036000116100000000466013135126237013325 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.6/ieee-utils/fp-os2emx.c0000644016036000116100000000452713135126237013132 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.6/ieee-utils/fp-netbsd.c0000644016036000116100000000561013135126237013166 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.6/ieee-utils/fp-openbsd.c0000644016036000116100000000575113135126237013347 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.6/ieee-utils/fp-gnuc99.c0000644016036000116100000001046013135126237013024 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.6/ieee-utils/endian.c0000644016036000116100000000216613135126237012545 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.6/ieee-utils/standardize.c0000644016036000116100000000257613135126237013624 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.6/ieee-utils/gsl_ieee_utils.h0000644016036000116100000000523313135126237014306 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.6/ieee-utils/ChangeLog0000644016036000116100000001661213373111455012716 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.6/ieee-utils/TODO0000644016036000116100000000016413373111455011627 00000000000000# -*- org -*- #+CATEGORY: ieee-utils * Fix up ieee-utils/fp-m68klinux.c for correct behavior and actually test it. gsl-2.6/ieee-utils/print.c0000644016036000116100000000523413135126237012442 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.6/ieee-utils/make_rep.c0000644016036000116100000001064713135126237013075 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.6/ieee-utils/env.c0000644016036000116100000000613113373111455012073 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.6/ieee-utils/fp.c0000644016036000116100000000235413135126237011713 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.6/ieee-utils/read.c0000644016036000116100000001210013373111455012207 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.6/ieee-utils/test.c0000644016036000116100000003510513135126237012265 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.6/cblas/0000755016036000116100000000000013527016557010245 500000000000000gsl-2.6/cblas/Makefile.in0000644016036000116100000015207213527016361012232 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = cblas DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libgslcblas_la_LIBADD = am_libgslcblas_la_OBJECTS = sasum.lo saxpy.lo scasum.lo scnrm2.lo \ scopy.lo sdot.lo sdsdot.lo sgbmv.lo sgemm.lo sgemv.lo sger.lo \ snrm2.lo srot.lo srotg.lo srotm.lo srotmg.lo ssbmv.lo sscal.lo \ sspmv.lo sspr.lo sspr2.lo sswap.lo ssymm.lo ssymv.lo ssyr.lo \ ssyr2.lo ssyr2k.lo ssyrk.lo stbmv.lo stbsv.lo stpmv.lo \ stpsv.lo strmm.lo strmv.lo strsm.lo strsv.lo dasum.lo daxpy.lo \ dcopy.lo ddot.lo dgbmv.lo dgemm.lo dgemv.lo dger.lo dnrm2.lo \ drot.lo drotg.lo drotm.lo drotmg.lo dsbmv.lo dscal.lo dsdot.lo \ dspmv.lo dspr.lo dspr2.lo dswap.lo dsymm.lo dsymv.lo dsyr.lo \ dsyr2.lo dsyr2k.lo dsyrk.lo dtbmv.lo dtbsv.lo dtpmv.lo \ dtpsv.lo dtrmm.lo dtrmv.lo dtrsm.lo dtrsv.lo dzasum.lo \ dznrm2.lo caxpy.lo ccopy.lo cdotc_sub.lo cdotu_sub.lo cgbmv.lo \ cgemm.lo cgemv.lo cgerc.lo cgeru.lo chbmv.lo chemm.lo chemv.lo \ cher.lo cher2.lo cher2k.lo cherk.lo chpmv.lo chpr.lo chpr2.lo \ cscal.lo csscal.lo cswap.lo csymm.lo csyr2k.lo csyrk.lo \ ctbmv.lo ctbsv.lo ctpmv.lo ctpsv.lo ctrmm.lo ctrmv.lo ctrsm.lo \ ctrsv.lo zaxpy.lo zcopy.lo zdotc_sub.lo zdotu_sub.lo zdscal.lo \ zgbmv.lo zgemm.lo zgemv.lo zgerc.lo zgeru.lo zhbmv.lo zhemm.lo \ zhemv.lo zher.lo zher2.lo zher2k.lo zherk.lo zhpmv.lo zhpr.lo \ zhpr2.lo zscal.lo zswap.lo zsymm.lo zsyr2k.lo zsyrk.lo \ ztbmv.lo ztbsv.lo ztpmv.lo ztpsv.lo ztrmm.lo ztrmv.lo ztrsm.lo \ ztrsv.lo icamax.lo idamax.lo isamax.lo izamax.lo xerbla.lo libgslcblas_la_OBJECTS = $(am_libgslcblas_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgslcblas_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libgslcblas_la_LDFLAGS) $(LDFLAGS) -o \ $@ am_test_OBJECTS = test.$(OBJEXT) test_amax.$(OBJEXT) \ test_asum.$(OBJEXT) test_axpy.$(OBJEXT) test_copy.$(OBJEXT) \ test_dot.$(OBJEXT) test_gbmv.$(OBJEXT) test_gemm.$(OBJEXT) \ test_gemv.$(OBJEXT) test_ger.$(OBJEXT) test_hbmv.$(OBJEXT) \ test_hemm.$(OBJEXT) test_hemv.$(OBJEXT) test_her.$(OBJEXT) \ test_her2.$(OBJEXT) test_her2k.$(OBJEXT) test_herk.$(OBJEXT) \ test_hpmv.$(OBJEXT) test_hpr.$(OBJEXT) test_hpr2.$(OBJEXT) \ test_nrm2.$(OBJEXT) test_rot.$(OBJEXT) test_rotg.$(OBJEXT) \ test_rotm.$(OBJEXT) test_rotmg.$(OBJEXT) test_sbmv.$(OBJEXT) \ test_scal.$(OBJEXT) test_spmv.$(OBJEXT) test_spr.$(OBJEXT) \ test_spr2.$(OBJEXT) test_swap.$(OBJEXT) test_symm.$(OBJEXT) \ test_symv.$(OBJEXT) test_syr.$(OBJEXT) test_syr2.$(OBJEXT) \ test_syr2k.$(OBJEXT) test_syrk.$(OBJEXT) test_tbmv.$(OBJEXT) \ test_tbsv.$(OBJEXT) test_tpmv.$(OBJEXT) test_tpsv.$(OBJEXT) \ test_trmm.$(OBJEXT) test_trmv.$(OBJEXT) test_trsm.$(OBJEXT) \ test_trsv.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslcblas.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcblas_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcblas_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = libgslcblas.la libgslcblas_la_LDFLAGS = $(GSLCBLAS_LDFLAGS) -version-info $(GSL_LT_CBLAS_VERSION) pkginclude_HEADERS = gsl_cblas.h AM_CPPFLAGS = -I$(top_srcdir) libgslcblas_la_SOURCES = sasum.c saxpy.c scasum.c scnrm2.c scopy.c \ sdot.c sdsdot.c sgbmv.c sgemm.c sgemv.c sger.c snrm2.c srot.c \ srotg.c srotm.c srotmg.c ssbmv.c sscal.c sspmv.c sspr.c \ sspr2.c sswap.c ssymm.c ssymv.c ssyr.c ssyr2.c ssyr2k.c \ ssyrk.c stbmv.c stbsv.c stpmv.c stpsv.c strmm.c strmv.c \ strsm.c strsv.c dasum.c daxpy.c dcopy.c ddot.c dgbmv.c dgemm.c \ dgemv.c dger.c dnrm2.c drot.c drotg.c drotm.c drotmg.c dsbmv.c \ dscal.c dsdot.c dspmv.c dspr.c dspr2.c dswap.c dsymm.c dsymv.c \ dsyr.c dsyr2.c dsyr2k.c dsyrk.c dtbmv.c dtbsv.c dtpmv.c \ dtpsv.c dtrmm.c dtrmv.c dtrsm.c dtrsv.c dzasum.c dznrm2.c \ caxpy.c ccopy.c cdotc_sub.c cdotu_sub.c cgbmv.c cgemm.c \ cgemv.c cgerc.c cgeru.c chbmv.c chemm.c chemv.c cher.c cher2.c \ cher2k.c cherk.c chpmv.c chpr.c chpr2.c cscal.c csscal.c \ cswap.c csymm.c csyr2k.c csyrk.c ctbmv.c ctbsv.c ctpmv.c \ ctpsv.c ctrmm.c ctrmv.c ctrsm.c ctrsv.c zaxpy.c zcopy.c \ zdotc_sub.c zdotu_sub.c zdscal.c zgbmv.c zgemm.c zgemv.c \ zgerc.c zgeru.c zhbmv.c zhemm.c zhemv.c zher.c zher2.c \ zher2k.c zherk.c zhpmv.c zhpr.c zhpr2.c zscal.c zswap.c \ zsymm.c zsyr2k.c zsyrk.c ztbmv.c ztbsv.c ztpmv.c ztpsv.c \ ztrmm.c ztrmv.c ztrsm.c ztrsv.c icamax.c idamax.c isamax.c \ izamax.c xerbla.c noinst_HEADERS = tests.c tests.h error_cblas.h error_cblas_l2.h \ error_cblas_l3.h cblas.h source_asum_c.h source_asum_r.h \ source_axpy_c.h source_axpy_r.h source_copy_c.h \ source_copy_r.h source_dot_c.h source_dot_r.h source_gbmv_c.h \ source_gbmv_r.h source_gemm_c.h source_gemm_r.h \ source_gemv_c.h source_gemv_r.h source_ger.h source_gerc.h \ source_geru.h source_hbmv.h source_hemm.h source_hemv.h \ source_her.h source_her2.h source_her2k.h source_herk.h \ source_hpmv.h source_hpr.h source_hpr2.h source_iamax_c.h \ source_iamax_r.h source_nrm2_c.h source_nrm2_r.h source_rot.h \ source_rotg.h source_rotm.h source_rotmg.h source_sbmv.h \ source_scal_c.h source_scal_c_s.h source_scal_r.h \ source_spmv.h source_spr.h source_spr2.h source_swap_c.h \ source_swap_r.h source_symm_c.h source_symm_r.h source_symv.h \ source_syr.h source_syr2.h source_syr2k_c.h source_syr2k_r.h \ source_syrk_c.h source_syrk_r.h source_tbmv_c.h \ source_tbmv_r.h source_tbsv_c.h source_tbsv_r.h \ source_tpmv_c.h source_tpmv_r.h source_tpsv_c.h \ source_tpsv_r.h source_trmm_c.h source_trmm_r.h \ source_trmv_c.h source_trmv_r.h source_trsm_c.h \ source_trsm_r.h source_trsv_c.h source_trsv_r.h hypot.c TESTS = $(check_PROGRAMS) test_LDADD = libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la test_SOURCES = test.c test_amax.c test_asum.c test_axpy.c test_copy.c test_dot.c test_gbmv.c test_gemm.c test_gemv.c test_ger.c test_hbmv.c test_hemm.c test_hemv.c test_her.c test_her2.c test_her2k.c test_herk.c test_hpmv.c test_hpr.c test_hpr2.c test_nrm2.c test_rot.c test_rotg.c test_rotm.c test_rotmg.c test_sbmv.c test_scal.c test_spmv.c test_spr.c test_spr2.c test_swap.c test_symm.c test_symv.c test_syr.c test_syr2.c test_syr2k.c test_syrk.c test_tbmv.c test_tbsv.c test_tpmv.c test_tpsv.c test_trmm.c test_trmv.c test_trsm.c test_trsv.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cblas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu cblas/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcblas.la: $(libgslcblas_la_OBJECTS) $(libgslcblas_la_DEPENDENCIES) $(EXTRA_libgslcblas_la_DEPENDENCIES) $(AM_V_CCLD)$(libgslcblas_la_LINK) -rpath $(libdir) $(libgslcblas_la_OBJECTS) $(libgslcblas_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotc_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotu_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgerc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgeru.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cher2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cherk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ddot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drotmg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dspr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsymv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtrsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dzasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dznrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/izamax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scasum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scnrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdsdot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snrm2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srot.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srotmg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sspr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssymv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_amax.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_asum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_axpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_copy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hemm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hemv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_her2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_herk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hpr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nrm2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rotmg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_scal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_spr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_swap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_symm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_symv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syr2k.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_syrk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tbmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tbsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tpmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tpsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trmm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trmv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trsm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_trsv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xerbla.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaxpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zcopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdotc_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdotu_sub.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zdscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgerc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zgeru.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zher2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zherk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zhpr2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zswap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsyr2k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsyrk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztbmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztbsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztpmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztpsv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrmm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ztrsv.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-libLTLIBRARIES \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/cblas/Makefile.am0000644016036000116100000000626113373111454012215 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.6/cblas/tests.c0000644016036000116100000000127413135126237011467 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.6/cblas/tests.h0000644016036000116100000000176013135126237011474 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.6/cblas/error_cblas.h0000644016036000116100000000617013373111454012626 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.6/cblas/error_cblas_l2.h0000644016036000116100000001562213373111454013225 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.6/cblas/source_asum_c.h0000644016036000116100000000200013135126237013145 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.6/cblas/source_asum_r.h0000644016036000116100000000173213135126237013177 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.6/cblas/source_axpy_c.h0000644016036000116100000000247213135126237013176 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.6/cblas/source_axpy_r.h0000644016036000116100000000251713135126237013215 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.6/cblas/source_copy_c.h0000644016036000116100000000201013135126237013153 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.6/cblas/source_copy_r.h0000644016036000116100000000172113135126237013202 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.6/cblas/source_dot_c.h0000644016036000116100000000250013135126237012773 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.6/cblas/source_dot_r.h0000644016036000116100000000177313135126237013025 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.6/cblas/source_gbmv_c.h0000644016036000116100000001353613373111454013152 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.6/cblas/source_gbmv_r.h0000644016036000116100000000537413373111454013172 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.6/cblas/source_gemm_c.h0000644016036000116100000001423713373111454013143 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.6/cblas/source_gemm_r.h0000644016036000116100000000617013373111454013157 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.6/cblas/source_gemv_c.h0000644016036000116100000001212413373111454013145 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.6/cblas/source_gemv_r.h0000644016036000116100000000467413373111454013177 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.6/cblas/source_ger.h0000644016036000116100000000277513373111454012475 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.6/cblas/source_gerc.h0000644016036000116100000000470213373111454012630 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.6/cblas/source_geru.h0000644016036000116100000000470013373111454012650 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.6/cblas/source_hbmv.h0000644016036000116100000001246713373111454012653 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.6/cblas/source_hemm.h0000644016036000116100000002050013373111454012630 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.6/cblas/source_hemv.h0000644016036000116100000001230013373111454012640 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.6/cblas/source_her.h0000644016036000116100000000541713373111454012472 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.6/cblas/source_her2.h0000644016036000116100000001065113373111454012550 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.6/cblas/source_her2k.h0000644016036000116100000002542213373111454012725 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.6/cblas/source_herk.h0000644016036000116100000001215413373111454012641 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.6/cblas/source_hpmv.h0000644016036000116100000001230113373111454012654 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.6/cblas/source_hpr.h0000644016036000116100000000544313373111454012504 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.6/cblas/source_hpr2.h0000644016036000116100000001070313373111454012561 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.6/cblas/source_iamax_c.h0000644016036000116100000000215013135126237013305 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.6/cblas/source_iamax_r.h0000644016036000116100000000206513135126237013331 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.6/cblas/source_nrm2_c.h0000644016036000116100000000300313135126237013062 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.6/cblas/source_nrm2_r.h0000644016036000116100000000243713135126237013113 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.6/cblas/source_rot.h0000644016036000116100000000204513135126237012513 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.6/cblas/source_rotg.h0000644016036000116100000000246513135126237012670 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.6/cblas/source_rotm.h0000644016036000116100000000270413373111454012671 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.6/cblas/source_rotmg.h0000644016036000116100000000552013135126237013040 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.6/cblas/source_sbmv.h0000644016036000116100000000546713373111454012670 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.6/cblas/source_scal_c.h0000644016036000116100000000230613373111454013132 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.6/cblas/source_scal_c_s.h0000644016036000116100000000173413373111454013460 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.6/cblas/source_scal_r.h0000644016036000116100000000167213373111454013156 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.6/cblas/source_spmv.h0000644016036000116100000000541113373111454012673 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.6/cblas/source_spr.h0000644016036000116100000000332213373111454012511 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.6/cblas/source_spr2.h0000644016036000116100000000401513373111454012573 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.6/cblas/source_swap_c.h0000644016036000116100000000220213135126237013156 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.6/cblas/source_swap_r.h0000644016036000116100000000177513135126237013213 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.6/cblas/source_symm_c.h0000644016036000116100000002105513373111454013177 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.6/cblas/source_symm_r.h0000644016036000116100000000701213373111454013213 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.6/cblas/source_symv.h0000644016036000116100000000540613373111454012710 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.6/cblas/source_syr.h0000644016036000116100000000331713373111454012526 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.6/cblas/source_syr2.h0000644016036000116100000000401413373111454012603 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.6/cblas/source_syr2k_c.h0000644016036000116100000001714113373111454013265 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.6/cblas/source_syr2k_r.h0000644016036000116100000000652013373111454013303 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.6/cblas/source_syrk_c.h0000644016036000116100000001415513373111454013205 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.6/cblas/source_syrk_r.h0000644016036000116100000000616213373111454013223 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.6/cblas/source_tbmv_c.h0000644016036000116100000001432113373111454013160 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.6/cblas/source_tbmv_r.h0000644016036000116100000000677313373111454013213 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.6/cblas/source_tbsv_c.h0000644016036000116100000001514413373111454013172 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.6/cblas/source_tbsv_r.h0000644016036000116100000000755313373111454013216 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.6/cblas/source_tpmv_c.h0000644016036000116100000001367613373111454013212 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.6/cblas/source_tpmv_r.h0000644016036000116100000000637113373111454013223 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.6/cblas/source_tpsv_c.h0000644016036000116100000002017613373111454013211 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.6/cblas/source_tpsv_r.h0000644016036000116100000000745213373111454013232 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.6/cblas/source_trmm_c.h0000644016036000116100000003113213373111454013166 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.6/cblas/source_trmm_r.h0000644016036000116100000001245513373111454013214 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.6/cblas/source_trmv_c.h0000644016036000116100000001356313373111454013207 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.6/cblas/source_trmv_r.h0000644016036000116100000000702313373111454013220 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.6/cblas/source_trsm_c.h0000644016036000116100000003622713373111454013206 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.6/cblas/source_trsm_r.h0000644016036000116100000001447613373111454013227 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.6/cblas/source_trsv_c.h0000644016036000116100000002003113373111454013201 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.6/cblas/source_trsv_r.h0000644016036000116100000000735013373111454013231 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.6/cblas/hypot.c0000644016036000116100000000065613135126237011473 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.6/cblas/gsl_cblas.h0000644016036000116100000010161513135126237012263 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.6/cblas/ChangeLog0000644016036000116100000000237013373111454011730 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.6/cblas/TODO0000644016036000116100000000063113373111454010644 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.6/cblas/sasum.c0000644016036000116100000000030713135126237011451 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.6/cblas/saxpy.c0000644016036000116100000000040013135126237011457 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.6/cblas/scasum.c0000644016036000116100000000030713135126237011614 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.6/cblas/scnrm2.c0000644016036000116100000000030713135126237011525 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.6/cblas/scopy.c0000644016036000116100000000035513135126237011461 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.6/cblas/sdot.c0000644016036000116100000000047713135126237011302 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.6/cblas/sdsdot.c0000644016036000116100000000053113135126237011620 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.6/cblas/sgbmv.c0000644016036000116100000000072113373111454011436 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.6/cblas/sgemm.c0000644016036000116100000000076013373111454011433 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.6/cblas/sgemv.c0000644016036000116100000000066513373111454011450 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.6/cblas/sger.c0000644016036000116100000000055513373111454011265 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.6/cblas/snrm2.c0000644016036000116100000000030713135126237011362 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.6/cblas/srot.c0000644016036000116100000000040013135126237011302 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.6/cblas/srotg.c0000644016036000116100000000027713135126237011465 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.6/cblas/srotm.c0000644016036000116100000000036513135126237011471 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.6/cblas/srotmg.c0000644016036000116100000000032413135126237011633 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.6/cblas/ssbmv.c0000644016036000116100000000065413373111454011457 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.6/cblas/sscal.c0000644016036000116100000000032313135126237011424 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.6/cblas/sspmv.c0000644016036000116100000000060413373111454011470 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.6/cblas/sspr.c0000644016036000116100000000051613373111454011311 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.6/cblas/sspr2.c0000644016036000116100000000056313373111454011375 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.6/cblas/sswap.c0000644016036000116100000000033213135126237011454 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.6/cblas/ssymm.c0000644016036000116100000000071013373111454011466 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.6/cblas/ssymv.c0000644016036000116100000000063713373111454011507 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.6/cblas/ssyr.c0000644016036000116100000000053413373111454011322 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.6/cblas/ssyr2.c0000644016036000116100000000060013373111454011376 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.6/cblas/ssyr2k.c0000644016036000116100000000074113373111454011557 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.6/cblas/ssyrk.c0000644016036000116100000000065713373111454011503 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.6/cblas/stbmv.c0000644016036000116100000000065013373111454011454 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.6/cblas/stbsv.c0000644016036000116100000000065013373111454011462 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.6/cblas/stpmv.c0000644016036000116100000000060013373111454011465 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.6/cblas/stpsv.c0000644016036000116100000000060013373111454011473 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.6/cblas/strmm.c0000644016036000116100000000074313373111454011466 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.6/cblas/strmv.c0000644016036000116100000000063313373111454011475 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.6/cblas/strsm.c0000644016036000116100000000074313373111454011474 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.6/cblas/strsv.c0000644016036000116100000000063313373111454011503 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.6/cblas/dasum.c0000644016036000116100000000031213135126237011426 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.6/cblas/daxpy.c0000644016036000116100000000040413135126237011444 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.6/cblas/dcopy.c0000644016036000116100000000036013135126237011436 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.6/cblas/ddot.c0000644016036000116100000000050413135126237011252 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.6/cblas/dgbmv.c0000644016036000116100000000074413373111454011424 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.6/cblas/dgemm.c0000644016036000116100000000076613373111454011422 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.6/cblas/dgemv.c0000644016036000116100000000067313373111454011430 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.6/cblas/dger.c0000644016036000116100000000056213373111454011244 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.6/cblas/dnrm2.c0000644016036000116100000000031213135126237011337 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.6/cblas/drot.c0000644016036000116100000000040513135126237011270 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.6/cblas/drotg.c0000644016036000116100000000030413135126237011435 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.6/cblas/drotm.c0000644016036000116100000000037113135126237011447 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.6/cblas/drotmg.c0000644016036000116100000000033213135126237011613 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.6/cblas/dsbmv.c0000644016036000116100000000066213373111454011437 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.6/cblas/dscal.c0000644016036000116100000000032613135126237011410 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.6/cblas/dsdot.c0000644016036000116100000000050313135126237011434 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.6/cblas/dspmv.c0000644016036000116100000000062713373111454011456 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.6/cblas/dspr.c0000644016036000116100000000052213373111454011267 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.6/cblas/dspr2.c0000644016036000116100000000056713373111454011362 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.6/cblas/dswap.c0000644016036000116100000000035213135126237011437 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.6/cblas/dsymm.c0000644016036000116100000000073313373111454011454 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.6/cblas/dsymv.c0000644016036000116100000000064513373111454011467 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.6/cblas/dsyr.c0000644016036000116100000000054013373111454011300 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.6/cblas/dsyr2.c0000644016036000116100000000060513373111454011364 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.6/cblas/dsyr2k.c0000644016036000116100000000074713373111454011546 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.6/cblas/dsyrk.c0000644016036000116100000000066413373111454011462 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.6/cblas/dtbmv.c0000644016036000116100000000065313373111454011440 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.6/cblas/dtbsv.c0000644016036000116100000000065313373111454011446 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.6/cblas/dtpmv.c0000644016036000116100000000060313373111454011451 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.6/cblas/dtpsv.c0000644016036000116100000000060313373111454011457 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.6/cblas/dtrmm.c0000644016036000116100000000074713373111454011453 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.6/cblas/dtrmv.c0000644016036000116100000000063613373111454011461 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.6/cblas/dtrsm.c0000644016036000116100000000074713373111454011461 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.6/cblas/dtrsv.c0000644016036000116100000000063613373111454011467 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.6/cblas/dzasum.c0000644016036000116100000000031113135126237011617 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.6/cblas/dznrm2.c0000644016036000116100000000031113135126237011530 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.6/cblas/caxpy.c0000644016036000116100000000037613135126237011453 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.6/cblas/ccopy.c0000644016036000116100000000035313135126237011437 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.6/cblas/cdotc_sub.c0000644016036000116100000000045413135126237012271 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.6/cblas/cdotu_sub.c0000644016036000116100000000045113135126237012310 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.6/cblas/cgbmv.c0000644016036000116100000000071613373111454011422 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.6/cblas/cgemm.c0000644016036000116100000000075513373111454011417 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.6/cblas/cgemv.c0000644016036000116100000000066213373111454011425 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.6/cblas/cgerc.c0000644016036000116100000000055613373111454011411 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.6/cblas/cgeru.c0000644016036000116100000000055613373111454011433 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.6/cblas/chbmv.c0000644016036000116100000000065113373111454011421 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.6/cblas/chemm.c0000644016036000116100000000070313373111454011411 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.6/cblas/chemv.c0000644016036000116100000000063413373111454011425 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.6/cblas/cher.c0000644016036000116100000000053213373111454011241 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.6/cblas/cher2.c0000644016036000116100000000057513373111454011332 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.6/cblas/cher2k.c0000644016036000116100000000071613373111454011502 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.6/cblas/cherk.c0000644016036000116100000000065313373111454011420 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.6/cblas/chpmv.c0000644016036000116100000000060113373111454011432 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.6/cblas/chpr.c0000644016036000116100000000051413373111454011254 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.6/cblas/chpr2.c0000644016036000116100000000055713373111454011345 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.6/cblas/cscal.c0000644016036000116100000000032213135126237011403 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.6/cblas/csscal.c0000644016036000116100000000032513135126237011571 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.6/cblas/cswap.c0000644016036000116100000000033013135126237011432 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.6/cblas/csymm.c0000644016036000116100000000070513373111454011452 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.6/cblas/csyr2k.c0000644016036000116100000000072013373111454011534 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.6/cblas/csyrk.c0000644016036000116100000000065513373111454011461 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.6/cblas/ctbmv.c0000644016036000116100000000064613373111454011441 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.6/cblas/ctbsv.c0000644016036000116100000000067213373111454011446 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.6/cblas/ctpmv.c0000644016036000116100000000057613373111454011461 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.6/cblas/ctpsv.c0000644016036000116100000000062213373111454011457 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.6/cblas/ctrmm.c0000644016036000116100000000074113373111454011444 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.6/cblas/ctrmv.c0000644016036000116100000000063113373111454011453 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.6/cblas/ctrsm.c0000644016036000116100000000076513373111454011460 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.6/cblas/ctrsv.c0000644016036000116100000000065513373111454011467 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.6/cblas/zaxpy.c0000644016036000116100000000037713135126237011503 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.6/cblas/zcopy.c0000644016036000116100000000035413135126237011467 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.6/cblas/zdotc_sub.c0000644016036000116100000000045513135126237012321 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.6/cblas/zdotu_sub.c0000644016036000116100000000045213135126237012340 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.6/cblas/zdscal.c0000644016036000116100000000032713135126237011603 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.6/cblas/zgbmv.c0000644016036000116100000000071713373111454011452 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.6/cblas/zgemm.c0000644016036000116100000000075613373111454011447 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.6/cblas/zgemv.c0000644016036000116100000000066313373111454011455 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.6/cblas/zgerc.c0000644016036000116100000000055713373111454011441 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.6/cblas/zgeru.c0000644016036000116100000000055713373111454011463 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.6/cblas/zhbmv.c0000644016036000116100000000065213373111454011451 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.6/cblas/zhemm.c0000644016036000116100000000070413373111454011441 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.6/cblas/zhemv.c0000644016036000116100000000063513373111454011455 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.6/cblas/zher.c0000644016036000116100000000053413373111454011272 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.6/cblas/zher2.c0000644016036000116100000000057613373111454011362 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.6/cblas/zher2k.c0000644016036000116100000000072013373111454011524 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.6/cblas/zherk.c0000644016036000116100000000065613373111454011452 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.6/cblas/zhpmv.c0000644016036000116100000000060213373111454011462 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.6/cblas/zhpr.c0000644016036000116100000000051613373111454011305 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.6/cblas/zhpr2.c0000644016036000116100000000056013373111454011366 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.6/cblas/zscal.c0000644016036000116100000000032313135126237011433 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.6/cblas/zswap.c0000644016036000116100000000033113135126237011462 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.6/cblas/zsymm.c0000644016036000116100000000070613373111454011502 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.6/cblas/zsyr2k.c0000644016036000116100000000072113373111454011564 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.6/cblas/zsyrk.c0000644016036000116100000000065613373111454011511 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.6/cblas/ztbmv.c0000644016036000116100000000064713373111454011471 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.6/cblas/ztbsv.c0000644016036000116100000000067313373111454011476 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.6/cblas/ztpmv.c0000644016036000116100000000057713373111454011511 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.6/cblas/ztpsv.c0000644016036000116100000000062313373111454011507 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.6/cblas/ztrmm.c0000644016036000116100000000074213373111454011474 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.6/cblas/ztrmv.c0000644016036000116100000000063213373111454011503 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.6/cblas/ztrsm.c0000644016036000116100000000076613373111454011510 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.6/cblas/ztrsv.c0000644016036000116100000000065613373111454011517 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.6/cblas/icamax.c0000644016036000116100000000031613135126237011563 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.6/cblas/idamax.c0000644016036000116100000000032113135126237011560 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.6/cblas/isamax.c0000644016036000116100000000031713135126237011604 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.6/cblas/izamax.c0000644016036000116100000000031713135126237011613 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.6/cblas/xerbla.c0000644016036000116100000000226613135126237011604 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.6/cblas/test.c0000644016036000116100000000204113135126237011275 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.6/cblas/test_amax.c0000644016036000116100000000466113135126237012315 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.6/cblas/test_asum.c0000644016036000116100000000523513135126237012332 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.6/cblas/test_axpy.c0000644016036000116100000001170113135126237012341 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.6/cblas/test_copy.c0000644016036000116100000001103213135126237012327 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.6/cblas/test_dot.c0000644016036000116100000002112213135126237012144 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.6/cblas/test_gbmv.c0000644016036000116100000004602413135126237012321 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.6/cblas/test_gemm.c0000644016036000116100000012251713135126237012315 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.6/cblas/test_gemv.c0000644016036000116100000003054713135126237012327 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.6/cblas/test_ger.c0000644016036000116100000001476413135126237012151 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.6/cblas/test_hbmv.c0000644016036000116100000003372113135126237012322 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.6/cblas/test_hemm.c0000644016036000116100000002746413135126237012323 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.6/cblas/test_hemv.c0000644016036000116100000002375113135126237012327 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.6/cblas/test_her.c0000644016036000116100000001032413135126237012136 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.6/cblas/test_her2.c0000644016036000116100000001147513135126237012230 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.6/cblas/test_her2k.c0000644016036000116100000002570513135126237012404 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.6/cblas/test_herk.c0000644016036000116100000002621013135126237012312 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.6/cblas/test_hpmv.c0000644016036000116100000002615113135126237012337 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.6/cblas/test_hpr.c0000644016036000116100000001141213135126237012150 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.6/cblas/test_hpr2.c0000644016036000116100000001131113135126237012230 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.6/cblas/test_nrm2.c0000644016036000116100000000527213135126237012244 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.6/cblas/test_rot.c0000644016036000116100000003117213135126237012170 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.6/cblas/test_rotg.c0000644016036000116100000013527713135126237012352 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.6/cblas/test_rotm.c0000644016036000116100000010502513135126237012344 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.6/cblas/test_rotmg.c0000644016036000116100000001430113135126237012507 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.6/cblas/test_sbmv.c0000644016036000116100000002327513135126237012340 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.6/cblas/test_scal.c0000644016036000116100000005076213135126237012314 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.6/cblas/test_spmv.c0000644016036000116100000002021113135126237012341 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.6/cblas/test_spr.c0000644016036000116100000000710413135126237012166 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.6/cblas/test_spr2.c0000644016036000116100000001001113135126237012237 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.6/cblas/test_swap.c0000644016036000116100000001611713135126237012340 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.6/cblas/test_symm.c0000644016036000116100000005075413135126237012360 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.6/cblas/test_symv.c0000644016036000116100000001740113135126237012361 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.6/cblas/test_syr.c0000644016036000116100000000653013135126237012201 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.6/cblas/test_syr2.c0000644016036000116100000000735113135126237012265 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.6/cblas/test_syr2k.c0000644016036000116100000004715413135126237012445 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.6/cblas/test_syrk.c0000644016036000116100000004765613135126237012372 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.6/cblas/test_tbmv.c0000644016036000116100000015104113135126237012332 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.6/cblas/test_tbsv.c0000644016036000116100000015223413135126237012345 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.6/cblas/test_tpmv.c0000644016036000116100000012305113135126237012350 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.6/cblas/test_tpsv.c0000644016036000116100000012343113135126237012360 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.6/cblas/test_trmm.c0000644016036000116100000036501613135126237012352 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.6/cblas/test_trmv.c0000644016036000116100000011525113135126237012355 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.6/cblas/test_trsm.c0000644016036000116100000036547313135126237012367 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.6/cblas/test_trsv.c0000644016036000116100000011554113135126237012365 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.6/blas/0000755016036000116100000000000013527016560010074 500000000000000gsl-2.6/blas/Makefile.in0000644016036000116100000005117413527016360012067 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = blas DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslblas_la_LIBADD = am_libgslblas_la_OBJECTS = blas.lo libgslblas_la_OBJECTS = $(am_libgslblas_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslblas_la_SOURCES) DIST_SOURCES = $(libgslblas_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslblas.la pkginclude_HEADERS = gsl_blas.h gsl_blas_types.h AM_CPPFLAGS = -I$(top_srcdir) libgslblas_la_SOURCES = blas.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu blas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu blas/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslblas.la: $(libgslblas_la_OBJECTS) $(libgslblas_la_DEPENDENCIES) $(EXTRA_libgslblas_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslblas_la_OBJECTS) $(libgslblas_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #check_PROGRAMS = test #TESTS = test #test_LDADD = libgslblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la #test_SOURCES = test_blas_raw.c test_cases.c test_cases.h # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/blas/Makefile.am0000644016036000116100000000056213373111454012050 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.6/blas/gsl_blas.h0000644016036000116100000005265613135126237011767 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.6/blas/gsl_blas_types.h0000644016036000116100000000305313135126237013176 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.6/blas/ChangeLog0000644016036000116100000000467413373111454011576 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.6/blas/TODO0000644016036000116100000000041613373111454010502 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.6/blas/blas.c0000644016036000116100000016000213373111454011075 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.6/linalg/0000755016036000116100000000000013527016560010421 500000000000000gsl-2.6/linalg/Makefile.in0000644016036000116100000011314513527016362012413 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = linalg DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsllinalg_la_LIBADD = am_libgsllinalg_la_OBJECTS = cod.lo condest.lo invtri.lo \ invtri_complex.lo multiply.lo exponential.lo tridiag.lo lu.lo \ luc.lo hh.lo qr.lo qrpt.lo qr_tr.lo rqr.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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsllinalg_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsllinalg_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsllinalg.la pkginclude_HEADERS = gsl_linalg.h AM_CPPFLAGS = -I$(top_srcdir) libgsllinalg_la_SOURCES = cod.c condest.c invtri.c invtri_complex.c multiply.c exponential.c tridiag.c tridiag.h lu.c luc.c hh.c qr.c qrpt.c qr_tr.c rqr.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_luc.c test_lq.c test_qr.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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsllinalg.la: $(libgsllinalg_la_OBJECTS) $(libgsllinalg_la_DEPENDENCIES) $(EXTRA_libgsllinalg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsllinalg_la_OBJECTS) $(libgsllinalg_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/balancemat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidiag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_band.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/choleskyc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/condest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermtd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hessenberg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hesstri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/householder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/householdercomplex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invtri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invtri_complex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldlt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldlt_band.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/luc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiply.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptlq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr_tr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rqr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmtd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tridiag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trimult.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trimult_complex.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/linalg/Makefile.am0000644016036000116100000000215413521441620012370 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 luc.c hh.c qr.c qrpt.c qr_tr.c rqr.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_luc.c test_lq.c test_qr.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.6/linalg/apply_givens.c0000644016036000116100000000675513373111455013220 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.6/linalg/cholesky_common.c0000644016036000116100000000451413373111455013700 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.6/linalg/recurse.h0000644016036000116100000000070513476347663012202 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.6/linalg/svdstep.c0000644016036000116100000003213413373111455012176 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.6/linalg/tridiag.h0000644016036000116100000000363713135126237012144 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.6/linalg/test_cholesky.c0000644016036000116100000007126713521372674013407 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, 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 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_calloc(N); /* convert m to packed banded format */ symm2band_matrix(p, m, u); s += gsl_linalg_cholesky_band_decomp(u); s += 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_matrix_free(u); return s; } 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(p, m, rhs, sol, 1.0e3 * N * GSL_DBL_EPSILON, "cholesky_band_solve random"); } 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 * GSL_DBL_EPSILON, "cholesky_band_invert random"); } gsl_matrix_free(m); } return s; } gsl-2.6/linalg/test_choleskyc.c0000644016036000116100000001214313502600472013523 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.6/linalg/test_cod.c0000644016036000116100000003042313477016362012317 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.0e3 * 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.0e5 * M * GSL_DBL_EPSILON, "COD_lssolve2 rank 278"); gsl_matrix_free(m); gsl_vector_free(b); return s; } gsl-2.6/linalg/test_common.c0000644016036000116100000001417413521372735013046 00000000000000/* linalg/test_common.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 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; } 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; } } gsl-2.6/linalg/test_ldlt.c0000644016036000116100000002231613521372774012515 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.0e2 * 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.6/linalg/test_lu.c0000644016036000116100000001630113477611707012175 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, 256.0 * 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, 256.0 * 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.6/linalg/test_luc.c0000644016036000116100000002111713477624577012352 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, 4096.0 * 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, 256.0 * 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, 256.0 * 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.6/linalg/test_lq.c0000644016036000116100000005531313373111455012165 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_QR_decomp_dim(const gsl_matrix * m, double eps) { int s = 0; unsigned long i,j, M = m->size1, N = m->size2; gsl_matrix * qr = gsl_matrix_alloc(M,N); gsl_matrix * a = gsl_matrix_alloc(M,N); gsl_matrix * q = gsl_matrix_alloc(M,M); gsl_matrix * r = gsl_matrix_alloc(M,N); gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N)); gsl_matrix_memcpy(qr,m); s += gsl_linalg_QR_decomp(qr, d); s += gsl_linalg_QR_unpack(qr, d, q, r); /* compute a = q r */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, q, r, 0.0, a); for(i=0; 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.0e5 * 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.0e4 * M * GSL_DBL_EPSILON, "QR_lssolve_r random"); gsl_matrix_free(A); gsl_vector_free(b); } } return s; } static int test_QR_TR_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_TR_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_TR_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_TR_decomp_eps(S, A, 1.0e5 * M * GSL_DBL_EPSILON, "QR_TR_decomp random"); gsl_matrix_free(S); gsl_matrix_free(A); } } return s; } gsl-2.6/linalg/test_tri.c0000644016036000116100000001161013517357142012344 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.6/linalg/gsl_linalg.h0000644016036000116100000007543613517371500012641 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); 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); /* 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_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); /* 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 rectangle QR decomposition */ int gsl_linalg_QR_TR_decomp (gsl_matrix * S, gsl_matrix * A, gsl_matrix * T); /* 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_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_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.6/linalg/ChangeLog0000644016036000116100000003434213373111455012117 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.6/linalg/TODO0000644016036000116100000000040613373111455011027 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); gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); } /* 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.6/linalg/condest.c0000644016036000116100000001743713510024414012145 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.6/linalg/invtri.c0000644016036000116100000001571213474323774012037 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.6/linalg/invtri_complex.c0000644016036000116100000001545113477623322013561 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.6/linalg/multiply.c0000644016036000116100000001000413135126237012355 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.6/linalg/exponential.c0000644016036000116100000001164013135126237013033 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.6/linalg/tridiag.c0000644016036000116100000003707513373111455012142 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.6/linalg/lu.c0000644016036000116100000003414413526013533011127 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 (0) { } 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.6/linalg/luc.c0000644016036000116100000003677113501212246011275 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 (0) { } 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.6/linalg/hh.c0000644016036000116100000001105413373111455011103 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.6/linalg/qr.c0000644016036000116100000003722713517376227011152 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 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 c = gsl_matrix_const_column (QR, i); gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector), i, M - i); gsl_vector_view w = gsl_vector_subvector (v, i, M - i); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_hv (ti, &(h.vector), &(w.vector)); } return GSL_SUCCESS; } } int gsl_linalg_QR_Qvec (const gsl_matrix * QR, const gsl_vector * tau, gsl_vector * v) { const size_t M = QR->size1; const size_t N = QR->size2; if (tau->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN); } else if (v->size != M) { GSL_ERROR ("vector size must be M", GSL_EBADLEN); } else { size_t i; /* compute Q v */ for (i = GSL_MIN (M, N); i-- > 0;) { gsl_vector_const_view c = gsl_matrix_const_column (QR, i); gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector), i, M - i); gsl_vector_view w = gsl_vector_subvector (v, i, M - i); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_hv (ti, &h.vector, &w.vector); } return GSL_SUCCESS; } } /* Form the product Q^T A from a QR factorized matrix */ int gsl_linalg_QR_QTmat (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * A) { const size_t M = QR->size1; const size_t N = QR->size2; if (tau->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN); } else if (A->size1 != M) { GSL_ERROR ("matrix must have M rows", GSL_EBADLEN); } else { size_t i; /* compute Q^T A */ for (i = 0; i < GSL_MIN (M, N); i++) { gsl_vector_const_view c = gsl_matrix_const_column (QR, i); gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector), i, M - i); gsl_matrix_view m = gsl_matrix_submatrix(A, i, 0, M - i, A->size2); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_hm (ti, &(h.vector), &(m.matrix)); } return GSL_SUCCESS; } } /* Form the product A Q from a QR factorized matrix */ int gsl_linalg_QR_matQ (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * A) { const size_t M = QR->size1; const size_t N = QR->size2; if (tau->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN); } else if (A->size2 != M) { GSL_ERROR ("matrix must have M columns", GSL_EBADLEN); } else { size_t i; /* compute A Q */ for (i = 0; i < GSL_MIN (M, N); i++) { gsl_vector_const_view c = gsl_matrix_const_column (QR, i); gsl_vector_const_view h = gsl_vector_const_subvector (&(c.vector), i, M - i); gsl_matrix_view m = gsl_matrix_submatrix(A, 0, i, A->size1, M - i); double ti = gsl_vector_get (tau, i); gsl_linalg_householder_mh (ti, &(h.vector), &(m.matrix)); } return GSL_SUCCESS; } } /* Form the orthogonal matrix Q from the packed QR matrix */ int gsl_linalg_QR_unpack (const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * R) { const size_t M = QR->size1; const size_t N = QR->size2; if (Q->size1 != M || Q->size2 != M) { GSL_ERROR ("Q matrix must be M x M", GSL_ENOTSQR); } else if (R->size1 != M || R->size2 != N) { GSL_ERROR ("R matrix must be M x N", GSL_ENOTSQR); } else if (tau->size != GSL_MIN (M, N)) { GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN); } else { size_t i, j; /* Initialize Q to the identity */ gsl_matrix_set_identity (Q); for (i = GSL_MIN (M, N); i-- > 0;) { gsl_vector_const_view 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.6/linalg/qrpt.c0000644016036000116100000004123013517376172011502 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.6/linalg/qr_tr.c0000644016036000116100000001673113515670624011650 00000000000000/* linalg/qr_tr.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 /* * 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_TR_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_TR_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_TR_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_TR_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.6/linalg/rqr.c0000644016036000116100000006342513522623441011320 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.6/linalg/lq.c0000644016036000116100000004116713373111455011130 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.6/linalg/ptlq.c0000644016036000116100000003143613373111455011472 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.6/linalg/svd.c0000644016036000116100000004614713373111455011313 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.6/linalg/householder.c0000644016036000116100000002565413504036630013035 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; } } 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) v(1) is modified but is restored on output 2) 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 { double v0; /* quick return */ if (tau == 0.0) return GSL_SUCCESS; v0 = gsl_vector_get(v, 0); v->data[0] = 1.0; /* 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); v->data[0] = v0; 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.6/linalg/householdercomplex.c0000644016036000116100000002143113517372447014427 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; { /* 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.6/linalg/hessenberg.c0000644016036000116100000003101013472607151012626 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.6/linalg/hesstri.c0000644016036000116100000001264513373111455012174 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.6/linalg/cholesky.c0000644016036000116100000004302713521372357012337 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.6/linalg/choleskyc.c0000644016036000116100000002177013500011762012466 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.6/linalg/mcholesky.c0000644016036000116100000001550313521372452012506 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.6/linalg/pcholesky.c0000644016036000116100000003410113521372505012503 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.6/linalg/cholesky_band.c0000644016036000116100000002335613415161117013316 00000000000000/* linalg/cholesky_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. */ #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_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; } } /* 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.6/linalg/ldlt.c0000644016036000116100000001632713414702623011452 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.6/linalg/ldlt_band.c0000644016036000116100000002330013415161021012413 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.6/linalg/symmtd.c0000644016036000116100000001445113517465175012040 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); gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); } /* 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 { 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);; /* 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.6/linalg/hermtd.c0000644016036000116100000001661313517373376012011 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 { 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); /* 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.6/linalg/bidiag.c0000644016036000116100000002336013515752162011732 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); gsl_linalg_householder_left (tau_j, &v.vector, &m.matrix, &work.vector); } 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); gsl_linalg_householder_left (ti, &h.vector, &m.matrix, &work.vector); } /* 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.6/linalg/balance.c0000644016036000116100000000373613373111455012101 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.6/linalg/balancemat.c0000644016036000116100000001157213135126237012600 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.6/linalg/inline.c0000644016036000116100000000205413373111455011762 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.6/linalg/trimult.c0000644016036000116100000002122213477611572012214 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.6/linalg/trimult_complex.c0000644016036000116100000002352213477624437013754 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.6/linalg/test.c0000644016036000116100000025770413517372506011507 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_lq.c" #include "test_tri.c" #include "test_qr.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(GSL_MIN(M,N)); gsl_vector * solution1 = gsl_vector_alloc(N); gsl_vector * solution2 = gsl_vector_alloc(N); gsl_vector * u = gsl_vector_alloc(M); gsl_vector * v = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(M); gsl_matrix_memcpy(qr1,m); gsl_matrix_memcpy(qr2,m); for(i=0; isize1, N = m->size2; gsl_matrix * qr1 = gsl_matrix_alloc(M,N); gsl_matrix * qr2 = gsl_matrix_alloc(M,N); gsl_matrix * q1 = gsl_matrix_alloc(M,M); gsl_matrix * r1 = gsl_matrix_alloc(M,N); gsl_matrix * q2 = gsl_matrix_alloc(M,M); gsl_matrix * r2 = gsl_matrix_alloc(M,N); gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N)); gsl_vector * u = gsl_vector_alloc(M); gsl_vector * v = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(M); gsl_vector * norm = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_memcpy(qr1,m); gsl_matrix_memcpy(qr2,m); for(i=0; isize1; 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&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = eigen DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsleigen_la_LIBADD = am_libgsleigen_la_OBJECTS = jacobi.lo symm.lo symmv.lo nonsymm.lo \ nonsymmv.lo herm.lo hermv.lo gensymm.lo gensymmv.lo genherm.lo \ genhermv.lo gen.lo genv.lo sort.lo francis.lo schur.lo libgsleigen_la_OBJECTS = $(am_libgsleigen_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgsleigen.la ../test/libgsltest.la \ ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../matrix/libgslmatrix.la ../vector/libgslvector.la \ ../block/libgslblock.la ../complex/libgslcomplex.la \ ../ieee-utils/libgslieeeutils.la ../sys/libgslsys.la \ ../err/libgslerr.la ../utils/libutils.la ../rng/libgslrng.la \ ../sort/libgslsort.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsleigen_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsleigen_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsleigen.la pkginclude_HEADERS = gsl_eigen.h libgsleigen_la_SOURCES = jacobi.c symm.c symmv.c nonsymm.c nonsymmv.c herm.c hermv.c gensymm.c gensymmv.c genherm.c genhermv.c gen.c genv.c sort.c francis.c schur.c AM_CPPFLAGS = -I$(top_srcdir) noinst_HEADERS = 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsleigen.la: $(libgsleigen_la_OBJECTS) $(libgsleigen_la_DEPENDENCIES) $(EXTRA_libgsleigen_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsleigen_la_OBJECTS) $(libgsleigen_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/francis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genherm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genhermv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gensymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gensymmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/herm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jacobi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsymm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsymmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schur.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sort.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/eigen/Makefile.am0000644016036000116100000000141513474324216012220 00000000000000noinst_LTLIBRARIES = libgsleigen.la check_PROGRAMS = test pkginclude_HEADERS = gsl_eigen.h libgsleigen_la_SOURCES = jacobi.c symm.c symmv.c nonsymm.c nonsymmv.c herm.c hermv.c 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 gsl-2.6/eigen/recurse.h0000644016036000116100000000056113474327444012014 00000000000000/* define how a problem is split recursively */ #define GSL_EIGEN_SPLIT(n) ((n >= 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.6/eigen/qrstep.c0000644016036000116100000001045513373111455011647 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.6/eigen/gsl_eigen.h0000644016036000116100000003173213373111455012273 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.6/eigen/ChangeLog0000644016036000116100000001055413373111455011737 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.6/eigen/TODO0000644016036000116100000000115113373111455010646 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.6/eigen/jacobi.c0000644016036000116100000001412413373111455011555 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.6/eigen/symmv.c0000644016036000116100000001345113373111455011503 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.6/eigen/nonsymm.c0000644016036000116100000001574113373111455012034 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.6/eigen/nonsymmv.c0000644016036000116100000007612413373111455012224 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.6/eigen/herm.c0000644016036000116100000001124013373111455011255 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.6/eigen/hermv.c0000644016036000116100000001571213373111455011453 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.6/eigen/gensymm.c0000644016036000116100000002052313474326732012015 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.6/eigen/gensymmv.c0000644016036000116100000001225113373111455012172 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.6/eigen/genherm.c0000644016036000116100000002211113521376015011746 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.6/eigen/genhermv.c0000644016036000116100000001252613373111455012145 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.6/eigen/gen.c0000644016036000116100000016526413373111455011113 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.6/eigen/genv.c0000644016036000116100000007013713373111455011273 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.6/eigen/sort.c0000644016036000116100000002357013373111455011322 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.6/eigen/francis.c0000644016036000116100000007166013373111455011763 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.6/eigen/schur.c0000644016036000116100000005300413135126237011452 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.6/eigen/test.c0000644016036000116100000011742713474333126011322 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.6/specfunc/0000755016036000116100000000000013527016560010761 500000000000000gsl-2.6/specfunc/Makefile.in0000644016036000116100000012756413527016364012767 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = specfunc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslspecfunc_la_LIBADD = am_libgslspecfunc_la_OBJECTS = airy.lo airy_der.lo airy_zero.lo \ atanint.lo bessel.lo bessel_I0.lo bessel_I1.lo bessel_In.lo \ bessel_Inu.lo bessel_J0.lo bessel_J1.lo bessel_Jn.lo \ bessel_Jnu.lo bessel_K0.lo bessel_K1.lo bessel_Kn.lo \ bessel_Knu.lo bessel_Y0.lo bessel_Y1.lo bessel_Yn.lo \ bessel_Ynu.lo bessel_amp_phase.lo bessel_i.lo bessel_j.lo \ bessel_k.lo bessel_olver.lo bessel_temme.lo bessel_y.lo \ bessel_zero.lo bessel_sequence.lo beta.lo beta_inc.lo \ clausen.lo coulomb.lo coupling.lo coulomb_bound.lo dawson.lo \ debye.lo dilog.lo elementary.lo ellint.lo elljac.lo erfc.lo \ exp.lo expint.lo expint3.lo fermi_dirac.lo gegenbauer.lo \ gamma.lo gamma_inc.lo hermite.lo hyperg_0F1.lo hyperg_2F0.lo \ hyperg_1F1.lo hyperg_2F1.lo hyperg_U.lo hyperg.lo laguerre.lo \ lambert.lo legendre_H3d.lo legendre_P.lo legendre_Qn.lo \ legendre_con.lo legendre_poly.lo log.lo mathieu_angfunc.lo \ mathieu_charv.lo mathieu_coeff.lo mathieu_radfunc.lo \ mathieu_workspace.lo poch.lo pow_int.lo psi.lo result.lo \ shint.lo 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslspecfunc_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslspecfunc_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslspecfunc.la pkginclude_HEADERS = gsl_sf.h gsl_sf_airy.h gsl_sf_bessel.h gsl_sf_clausen.h gsl_sf_coulomb.h gsl_sf_coupling.h gsl_sf_dawson.h gsl_sf_debye.h gsl_sf_dilog.h gsl_sf_elementary.h gsl_sf_ellint.h gsl_sf_elljac.h gsl_sf_erf.h gsl_sf_exp.h gsl_sf_expint.h gsl_sf_fermi_dirac.h gsl_sf_gamma.h gsl_sf_gegenbauer.h gsl_sf_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 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslspecfunc.la: $(libgslspecfunc_la_OBJECTS) $(libgslspecfunc_la_DEPENDENCIES) $(EXTRA_libgslspecfunc_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslspecfunc_la_OBJECTS) $(libgslspecfunc_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy_der.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airy_zero.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atanint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_I0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_I1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_In.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Inu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_J0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_J1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Jn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Jnu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_K0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_K1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Kn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Knu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Y0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Y1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Yn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_Ynu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_amp_phase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_i.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_j.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_k.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_olver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_temme.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_y.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bessel_zero.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta_inc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clausen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coulomb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coulomb_bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coupling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dawson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debye.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dilog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementary.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ellint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elljac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/erfc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expint3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fermi_dirac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma_inc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gegenbauer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_0F1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_1F1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_2F0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_2F1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg_U.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laguerre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lambert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_H3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_P.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_Qn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_con.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre_poly.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_angfunc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_charv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_coeff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_radfunc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mathieu_workspace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow_int.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/result.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sincos_pi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sinint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synchrotron.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_airy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bessel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_coulomb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dilog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gamma.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hermite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hyperg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_legendre.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mathieu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sincos_pi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zeta.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/specfunc/Makefile.am0000644016036000116100000000463213373111456012741 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 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.6/specfunc/bessel_amp_phase.h0000644016036000116100000000276713135126237014356 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.6/specfunc/bessel_olver.h0000644016036000116100000000223613135126237013537 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.6/specfunc/bessel_temme.h0000644016036000116100000000235113135126237013515 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.6/specfunc/bessel.h0000644016036000116100000000631713373111456012335 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.6/specfunc/hyperg.h0000644016036000116100000000433613135126237012354 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.6/specfunc/legendre.h0000644016036000116100000000447713135126237012651 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.6/specfunc/eval.h0000644016036000116100000000064013135126237011777 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.6/specfunc/chebyshev.h0000644016036000116100000000227213135126237013033 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.6/specfunc/cheb_eval.c0000644016036000116100000000122013441251001012732 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.6/specfunc/cheb_eval_mode.c0000644016036000116100000000125013441251001013741 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.6/specfunc/check.h0000644016036000116100000000017613135126237012131 00000000000000/* check for underflow */ #define CHECK_UNDERFLOW(r) if (fabs((r)->val) < GSL_DBL_MIN) GSL_ERROR("underflow", GSL_EUNDRFLW); gsl-2.6/specfunc/error.h0000644016036000116100000000366113373111456012210 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.6/specfunc/legendre_source.c0000644016036000116100000004300413441251001014175 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.6/specfunc/gsl_sf.h0000644016036000116100000000212213373111456012323 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.6/specfunc/gsl_sf_airy.h0000644016036000116100000000717513135126237013363 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.6/specfunc/gsl_sf_bessel.h0000644016036000116100000003352513373111456013673 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.6/specfunc/gsl_sf_clausen.h0000644016036000116100000000267313135126237014047 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.6/specfunc/gsl_sf_coulomb.h0000644016036000116100000001046213135126237014050 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.6/specfunc/gsl_sf_coupling.h0000644016036000116100000001010513135126237014222 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.6/specfunc/gsl_sf_dawson.h0000644016036000116100000000257213135126237013706 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.6/specfunc/gsl_sf_debye.h0000644016036000116100000000437713135126237013510 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.6/specfunc/gsl_sf_dilog.h0000644016036000116100000001011313135126237013477 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.6/specfunc/gsl_sf_elementary.h0000644016036000116100000000317113135126237014554 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.6/specfunc/gsl_sf_ellint.h0000644016036000116100000001007713373111456013702 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.6/specfunc/gsl_sf_elljac.h0000644016036000116100000000252413135126237013642 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.6/specfunc/gsl_sf_erf.h0000644016036000116100000000436713135126237013173 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.6/specfunc/gsl_sf_exp.h0000644016036000116100000000740713373111456013212 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.6/specfunc/gsl_sf_expint.h0000644016036000116100000001045513135126237013721 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.6/specfunc/gsl_sf_fermi_dirac.h0000644016036000116100000000652513135126237014661 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.6/specfunc/gsl_sf_gamma.h0000644016036000116100000001710613373111456013475 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.6/specfunc/gsl_sf_gegenbauer.h0000644016036000116100000000415213135126237014513 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.6/specfunc/gsl_sf_hermite.h0000644016036000116100000001264213441244424014046 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.6/specfunc/gsl_sf_hyperg.h0000644016036000116100000001064513135126237013711 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.6/specfunc/gsl_sf_laguerre.h0000644016036000116100000000372013135126237014215 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.6/specfunc/gsl_sf_lambert.h0000644016036000116100000000342513135126237014037 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.6/specfunc/gsl_sf_legendre.h0000644016036000116100000002716313373111456014204 00000000000000/* specfunc/gsl_sf_legendre.h * * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004 Gerard Jungman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Author: G. Jungman */ #ifndef __GSL_SF_LEGENDRE_H__ #define __GSL_SF_LEGENDRE_H__ #include #undef __BEGIN_DECLS #undef __END_DECLS #ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # define __END_DECLS } #else # define __BEGIN_DECLS /* empty */ # define __END_DECLS /* empty */ #endif __BEGIN_DECLS /* P_l(x) l >= 0; |x| <= 1 * * exceptions: GSL_EDOM */ int gsl_sf_legendre_Pl_e(const int l, const double x, gsl_sf_result * result); double gsl_sf_legendre_Pl(const int l, const double x); /* P_l(x) for l=0,...,lmax; |x| <= 1 * * exceptions: GSL_EDOM */ int gsl_sf_legendre_Pl_array( const int lmax, const double x, double * result_array ); /* P_l(x) and P_l'(x) for l=0,...,lmax; |x| <= 1 * * exceptions: GSL_EDOM */ int gsl_sf_legendre_Pl_deriv_array( const int lmax, const double x, double * result_array, double * result_deriv_array ); /* P_l(x), l=1,2,3 * * exceptions: none */ int gsl_sf_legendre_P1_e(double x, gsl_sf_result * result); int gsl_sf_legendre_P2_e(double x, gsl_sf_result * result); int gsl_sf_legendre_P3_e(double x, gsl_sf_result * result); double gsl_sf_legendre_P1(const double x); double gsl_sf_legendre_P2(const double x); double gsl_sf_legendre_P3(const double x); /* Q_0(x), x > -1, x != 1 * * exceptions: GSL_EDOM */ int gsl_sf_legendre_Q0_e(const double x, gsl_sf_result * result); double gsl_sf_legendre_Q0(const double x); /* Q_1(x), x > -1, x != 1 * * exceptions: GSL_EDOM */ int gsl_sf_legendre_Q1_e(const double x, gsl_sf_result * result); double gsl_sf_legendre_Q1(const double x); /* Q_l(x), x > -1, x != 1, l >= 0 * * exceptions: GSL_EDOM */ int gsl_sf_legendre_Ql_e(const int l, const double x, gsl_sf_result * result); double gsl_sf_legendre_Ql(const int l, const double x); /* P_l^m(x) m >= 0; l >= m; |x| <= 1.0 * * Note that this function grows combinatorially with l. * Therefore we can easily generate an overflow for l larger * than about 150. * * There is no trouble for small m, but when m and l are both large, * then there will be trouble. Rather than allow overflows, these * functions refuse to calculate when they can sense that l and m are * too big. * * If you really want to calculate a spherical harmonic, then DO NOT * use this. Instead use legendre_sphPlm() below, which uses a similar * recursion, but with the normalized functions. * * exceptions: GSL_EDOM, GSL_EOVRFLW */ int gsl_sf_legendre_Plm_e(const int l, const int m, const double x, gsl_sf_result * result); double gsl_sf_legendre_Plm(const int l, const int m, const double x); /* P_l^m(x) m >= 0; l >= m; |x| <= 1.0 * l=|m|,...,lmax * * exceptions: GSL_EDOM, GSL_EOVRFLW */ int gsl_sf_legendre_Plm_array( const int lmax, const int m, const double x, double * result_array ); /* P_l^m(x) and d(P_l^m(x))/dx; m >= 0; lmax >= m; |x| <= 1.0 * l=|m|,...,lmax * * exceptions: GSL_EDOM, GSL_EOVRFLW */ int gsl_sf_legendre_Plm_deriv_array( const int lmax, const int m, const double x, double * result_array, double * result_deriv_array ); /* P_l^m(x), normalized properly for use in spherical harmonics * m >= 0; l >= m; |x| <= 1.0 * * There is no overflow problem, as there is for the * standard normalization of P_l^m(x). * * Specifically, it returns: * * sqrt((2l+1)/(4pi)) sqrt((l-m)!/(l+m)!) P_l^m(x) * * exceptions: GSL_EDOM */ int gsl_sf_legendre_sphPlm_e(const int l, int m, const double x, gsl_sf_result * result); double gsl_sf_legendre_sphPlm(const int l, const int m, const double x); /* sphPlm(l,m,x) values * m >= 0; l >= m; |x| <= 1.0 * l=|m|,...,lmax * * exceptions: GSL_EDOM */ int gsl_sf_legendre_sphPlm_array( const int lmax, int m, const double x, double * result_array ); /* sphPlm(l,m,x) and d(sphPlm(l,m,x))/dx values * m >= 0; l >= m; |x| <= 1.0 * l=|m|,...,lmax * * exceptions: GSL_EDOM */ int gsl_sf_legendre_sphPlm_deriv_array( const int lmax, const int m, const double x, double * result_array, double * result_deriv_array ); /* size of result_array[] needed for the array versions of Plm * (lmax - m + 1) */ int gsl_sf_legendre_array_size(const int lmax, const int m); /* Irregular Spherical Conical Function * P^{1/2}_{-1/2 + I lambda}(x) * * x > -1.0 * exceptions: GSL_EDOM */ int gsl_sf_conicalP_half_e(const double lambda, const double x, gsl_sf_result * result); double gsl_sf_conicalP_half(const double lambda, const double x); /* Regular Spherical Conical Function * P^{-1/2}_{-1/2 + I lambda}(x) * * x > -1.0 * exceptions: GSL_EDOM */ int gsl_sf_conicalP_mhalf_e(const double lambda, const double x, gsl_sf_result * result); double gsl_sf_conicalP_mhalf(const double lambda, const double x); /* Conical Function * P^{0}_{-1/2 + I lambda}(x) * * x > -1.0 * exceptions: GSL_EDOM */ int gsl_sf_conicalP_0_e(const double lambda, const double x, gsl_sf_result * result); double gsl_sf_conicalP_0(const double lambda, const double x); /* Conical Function * P^{1}_{-1/2 + I lambda}(x) * * x > -1.0 * exceptions: GSL_EDOM */ int gsl_sf_conicalP_1_e(const double lambda, const double x, gsl_sf_result * result); double gsl_sf_conicalP_1(const double lambda, const double x); /* Regular Spherical Conical Function * P^{-1/2-l}_{-1/2 + I lambda}(x) * * x > -1.0, l >= -1 * exceptions: GSL_EDOM */ int gsl_sf_conicalP_sph_reg_e(const int l, const double lambda, const double x, gsl_sf_result * result); double gsl_sf_conicalP_sph_reg(const int l, const double lambda, const double x); /* Regular Cylindrical Conical Function * P^{-m}_{-1/2 + I lambda}(x) * * x > -1.0, m >= -1 * exceptions: GSL_EDOM */ int gsl_sf_conicalP_cyl_reg_e(const int m, const double lambda, const double x, gsl_sf_result * result); double gsl_sf_conicalP_cyl_reg(const int m, const double lambda, const double x); /* The following spherical functions are specializations * of Legendre functions which give the regular eigenfunctions * of the Laplacian on a 3-dimensional hyperbolic space. * Of particular interest is the flat limit, which is * Flat-Lim := {lambda->Inf, eta->0, lambda*eta fixed}. */ /* Zeroth radial eigenfunction of the Laplacian on the * 3-dimensional hyperbolic space. * * legendre_H3d_0(lambda,eta) := sin(lambda*eta)/(lambda*sinh(eta)) * * Normalization: * Flat-Lim legendre_H3d_0(lambda,eta) = j_0(lambda*eta) * * eta >= 0.0 * exceptions: GSL_EDOM */ int gsl_sf_legendre_H3d_0_e(const double lambda, const double eta, gsl_sf_result * result); double gsl_sf_legendre_H3d_0(const double lambda, const double eta); /* First radial eigenfunction of the Laplacian on the * 3-dimensional hyperbolic space. * * legendre_H3d_1(lambda,eta) := * 1/sqrt(lambda^2 + 1) sin(lam eta)/(lam sinh(eta)) * (coth(eta) - lambda cot(lambda*eta)) * * Normalization: * Flat-Lim legendre_H3d_1(lambda,eta) = j_1(lambda*eta) * * eta >= 0.0 * exceptions: GSL_EDOM */ int gsl_sf_legendre_H3d_1_e(const double lambda, const double eta, gsl_sf_result * result); double gsl_sf_legendre_H3d_1(const double lambda, const double eta); /* l'th radial eigenfunction of the Laplacian on the * 3-dimensional hyperbolic space. * * Normalization: * Flat-Lim legendre_H3d_l(l,lambda,eta) = j_l(lambda*eta) * * eta >= 0.0, l >= 0 * exceptions: GSL_EDOM */ int gsl_sf_legendre_H3d_e(const int l, const double lambda, const double eta, gsl_sf_result * result); double gsl_sf_legendre_H3d(const int l, const double lambda, const double eta); /* Array of H3d(ell), 0 <= ell <= lmax */ int gsl_sf_legendre_H3d_array(const int lmax, const double lambda, const double eta, double * result_array); /* associated legendre P_{lm} routines */ typedef enum { GSL_SF_LEGENDRE_SCHMIDT, GSL_SF_LEGENDRE_SPHARM, GSL_SF_LEGENDRE_FULL, GSL_SF_LEGENDRE_NONE } gsl_sf_legendre_t; int gsl_sf_legendre_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[]); int gsl_sf_legendre_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[]); int gsl_sf_legendre_deriv_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv_alt_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv_alt_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[]); int gsl_sf_legendre_deriv2_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[], double result_deriv2_array[]); int gsl_sf_legendre_deriv2_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[], double result_deriv2_array[]); int gsl_sf_legendre_deriv2_alt_array(const gsl_sf_legendre_t norm, const size_t lmax, const double x, double result_array[], double result_deriv_array[], double result_deriv2_array[]); int gsl_sf_legendre_deriv2_alt_array_e(const gsl_sf_legendre_t norm, const size_t lmax, const double x, const double csphase, double result_array[], double result_deriv_array[], double result_deriv2_array[]); size_t gsl_sf_legendre_array_n(const size_t lmax); size_t gsl_sf_legendre_array_index(const size_t l, const size_t m); size_t gsl_sf_legendre_nlm(const size_t lmax); __END_DECLS #endif /* __GSL_SF_LEGENDRE_H__ */ gsl-2.6/specfunc/gsl_sf_log.h0000644016036000116100000000401613135126237013167 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.6/specfunc/gsl_sf_mathieu.h0000644016036000116100000001032313373111456014041 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.6/specfunc/gsl_sf_pow_int.h0000644016036000116100000000255613135126237014074 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.6/specfunc/gsl_sf_psi.h0000644016036000116100000000517313135126237013206 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.6/specfunc/gsl_sf_result.h0000644016036000116100000000305113135126237013722 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.6/specfunc/gsl_sf_sincos_pi.h0000644016036000116100000000321013373111456014370 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.6/specfunc/gsl_sf_synchrotron.h0000644016036000116100000000327313135126237015002 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.6/specfunc/gsl_sf_transport.h0000644016036000116100000000367213135126237014451 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.6/specfunc/gsl_sf_trig.h0000644016036000116100000000756513135126237013367 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.6/specfunc/gsl_sf_zeta.h0000644016036000116100000000551613135126237013357 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.6/specfunc/gsl_specfunc.h0000644016036000116100000000025513135126237013525 00000000000000/* Author: G. Jungman */ /* Convenience header */ #ifndef __GSL_SPECFUNC_H__ #define __GSL_SPECFUNC_H__ #include #endif /* __GSL_SPECFUNC_H__ */ gsl-2.6/specfunc/ChangeLog0000644016036000116100000006521713373111456012465 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.6/specfunc/TODO0000644016036000116100000003316013441251103011361 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.6/specfunc/airy.c0000644016036000116100000005577213441251001012013 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.6/specfunc/airy_der.c0000644016036000116100000006177613441251001012646 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.6/specfunc/airy_zero.c0000644016036000116100000003250613441251001013040 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.6/specfunc/atanint.c0000644016036000116100000000571513441251001012475 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.6/specfunc/bessel.c0000644016036000116100000006643613441251001012323 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.6/specfunc/bessel_I0.c0000644016036000116100000001416413441251001012642 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.6/specfunc/bessel_I1.c0000644016036000116100000001523413441251001012642 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.6/specfunc/bessel_In.c0000644016036000116100000001443013441251001012734 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.6/specfunc/bessel_Inu.c0000644016036000116100000000653013441251001013123 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.6/specfunc/bessel_J0.c0000644016036000116100000000627613441251001012650 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.6/specfunc/bessel_J1.c0000644016036000116100000000713713441251001012646 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.6/specfunc/bessel_Jn.c0000644016036000116100000001171213441251001012735 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.6/specfunc/bessel_Jnu.c0000644016036000116100000001401113441251001013115 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.6/specfunc/bessel_K0.c0000644016036000116100000001313713441251001012643 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.6/specfunc/bessel_K1.c0000644016036000116100000001373513441251001012650 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.6/specfunc/bessel_Kn.c0000644016036000116100000001467613441251001012752 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.6/specfunc/bessel_Knu.c0000644016036000116100000001247513441251001013132 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.6/specfunc/bessel_Y0.c0000644016036000116100000000704213441251001012657 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.6/specfunc/bessel_Y1.c0000644016036000116100000001012113441251001012650 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.6/specfunc/bessel_Yn.c0000644016036000116100000001257413441251001012763 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.6/specfunc/bessel_Ynu.c0000644016036000116100000001034313441251001013140 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.6/specfunc/bessel_amp_phase.c0000644016036000116100000001105313441251001014321 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.6/specfunc/bessel_i.c0000644016036000116100000002147713441251001012627 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.6/specfunc/bessel_j.c0000644016036000116100000002563013441251001012623 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.6/specfunc/bessel_k.c0000644016036000116100000001445313441251001012625 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.6/specfunc/bessel_olver.c0000644016036000116100000007575013441251001013531 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.6/specfunc/bessel_temme.c0000644016036000116100000001425113441251001013476 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.6/specfunc/bessel_y.c0000644016036000116100000001720513441251001012641 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.6/specfunc/bessel_zero.c0000644016036000116100000007020613441251001013350 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.6/specfunc/bessel_sequence.c0000644016036000116100000001026313441251001014176 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.6/specfunc/beta_inc.c0000644016036000116100000001363013441251001012576 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.6/specfunc/clausen.c0000644016036000116100000000526213441251001012466 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.6/specfunc/coulomb.c0000644016036000116100000011503313524156231012505 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.6/specfunc/coupling.c0000644016036000116100000003411113441251001012647 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.6/specfunc/coulomb_bound.c0000644016036000116100000000725313441251001013665 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.6/specfunc/dawson.c0000644016036000116100000002343413441251001012330 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.6/specfunc/debye.c0000644016036000116100000003340013441251001012117 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.6/specfunc/dilog.c0000644016036000116100000004320413441251001012130 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.6/specfunc/elementary.c0000644016036000116100000000463513441251001013204 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.6/specfunc/ellint.c0000644016036000116100000004666413441251001012336 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.6/specfunc/elljac.c0000644016036000116100000000656013441251001012270 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.6/specfunc/erfc.c0000644016036000116100000002770413441251001011760 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.6/specfunc/exp.c0000644016036000116100000003723613441251001011636 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.6/specfunc/expint.c0000644016036000116100000003661313441251001012347 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.6/specfunc/expint3.c0000644016036000116100000000661513441251001012431 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.6/specfunc/fermi_dirac.c0000644016036000116100000010316013441251001013274 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.6/specfunc/gegenbauer.c0000644016036000116100000001160013441251001013131 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.6/specfunc/gamma.c0000644016036000116100000016652513441251001012130 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.6/specfunc/gamma_inc.c0000644016036000116100000005043613441251001012752 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.6/specfunc/hermite.c0000644016036000116100000014051313522604465012510 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.6/specfunc/hyperg_0F1.c0000644016036000116100000001200113441251001012725 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.6/specfunc/hyperg_2F0.c0000644016036000116100000000353313441251001012740 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.6/specfunc/hyperg_1F1.c0000644016036000116100000017043713441251001012750 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.6/specfunc/hyperg_2F1.c0000644016036000116100000007117513441251001012750 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.6/specfunc/hyperg_U.c0000644016036000116100000016146113441251001012622 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.6/specfunc/hyperg.c0000644016036000116100000002107513441251001012332 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.6/specfunc/laguerre.c0000644016036000116100000002331513441251001012641 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.6/specfunc/lambert.c0000644016036000116100000001404013441251001012454 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.6/specfunc/legendre_H3d.c0000644016036000116100000004205513441251001013320 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.6/specfunc/legendre_P.c0000644016036000116100000000605013441251001013074 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); } /* gsl_sf_legendre_array_n() */ /* gsl_sf_legendre_array_index() This routine computes the index into a result_array[] corresponding to a given (l,m) */ size_t gsl_sf_legendre_array_index(const size_t l, const size_t m) { return (l * (l + 1) / 2 + m); } /* gsl_sf_legendre_array_index() */ /********************************************************* * INTERNAL ROUTINES * *********************************************************/ /* legendre_sqrts() Precompute square root factors needed for Legendre recurrence. On output, array[i] = sqrt(i) */ static void legendre_sqrts(const size_t lmax, double *array) { size_t l; for (l = 0; l <= 2 * lmax + 1; ++l) array[l] = sqrt((double) l); } gsl-2.6/specfunc/legendre_Qn.c0000644016036000116100000002276513441251001013266 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.6/specfunc/legendre_con.c0000644016036000116100000012450113441251001013456 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.6/specfunc/legendre_poly.c0000644016036000116100000005123613441251001013666 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.6/specfunc/log.c0000644016036000116100000001535013441251001011614 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.6/specfunc/mathieu_angfunc.c0000644016036000116100000002053413441251001014170 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.6/specfunc/poch.c0000644016036000116100000003400013441251001011755 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.6/specfunc/pow_int.c0000644016036000116100000000357213441251001012515 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.6/specfunc/psi.c0000644016036000116100000006036413441251001011633 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.6/specfunc/recurse.h0000644016036000116100000001724613135126237012532 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.6/specfunc/result.c0000644016036000116100000000454113441251001012351 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.6/specfunc/shint.c0000644016036000116100000000761013441251001012160 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.6/specfunc/sincos_pi.c0000644016036000116100000001701213441251001013016 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.6/specfunc/sinint.c0000644016036000116100000002560713441251001012345 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.6/specfunc/synchrotron.c0000644016036000116100000001626413441251001013430 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.6/specfunc/transport.c0000644016036000116100000003104213441251001013063 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.6/specfunc/trig.c0000644016036000116100000004643113441251001012004 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.6/specfunc/zeta.c0000644016036000116100000010076013441251001011776 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.6/specfunc/test_sf.c0000644016036000116100000046645013441251001012515 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.6/specfunc/test_sf.h0000644016036000116100000001125313425475415012530 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.6/specfunc/test_airy.c0000644016036000116100000002220413441251001013032 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.6/specfunc/test_bessel.c0000644016036000116100000033714513441251001013360 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.6/specfunc/test_coulomb.c0000644016036000116100000004243413441251001013535 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.6/specfunc/test_dilog.c0000644016036000116100000002727513441251001013201 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.6/specfunc/test_gamma.c0000644016036000116100000006774313441251001013171 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.6/specfunc/test_hermite.c0000644016036000116100000005615113472614725013557 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.6/specfunc/test_hyperg.c0000644016036000116100000015065113441251001013374 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.6/specfunc/test_legendre.c0000644016036000116100000014435013441251001013662 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.6/specfunc/test_mathieu.c0000644016036000116100000002362213441251001013527 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.6/specfunc/test_sincos_pi.c0000644016036000116100000002277513441251001014071 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.6/dht/0000755016036000116100000000000013527016560007732 500000000000000gsl-2.6/dht/Makefile.in0000644016036000116100000010342413527016361011722 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = dht DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsldht_la_LIBADD = am_libgsldht_la_OBJECTS = dht.lo libgsldht_la_OBJECTS = $(am_libgsldht_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgsldht.la ../specfunc/libgslspecfunc.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsldht_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsldht_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsldht.la pkginclude_HEADERS = gsl_dht.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgsldht.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c libgsldht_la_SOURCES = dht.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dht/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu dht/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsldht.la: $(libgsldht_la_OBJECTS) $(libgsldht_la_DEPENDENCIES) $(EXTRA_libgsldht_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsldht_la_OBJECTS) $(libgsldht_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dht.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/dht/Makefile.am0000644016036000116100000000062213373111454011703 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.6/dht/gsl_dht.h0000644016036000116100000000510513135126237011446 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__ #undef __BEGIN_DECLS #undef __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.6/dht/ChangeLog0000644016036000116100000000070513373111454011423 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.6/dht/dht.c0000644016036000116100000001136013373111454010573 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.6/dht/test.c0000644016036000116100000001204113135126237010771 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.6/qrng/0000755016036000116100000000000013527016560010122 500000000000000gsl-2.6/qrng/Makefile.in0000644016036000116100000010426313527016363012116 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = qrng DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslqrng_la_LIBADD = am_libgslqrng_la_OBJECTS = qrng.lo niederreiter-2.lo sobol.lo \ halton.lo reversehalton.lo inline.lo libgslqrng_la_OBJECTS = $(am_libgslqrng_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslqrng.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslqrng_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslqrng_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslqrng.la pkginclude_HEADERS = gsl_qrng.h AM_CPPFLAGS = -I$(top_srcdir) libgslqrng_la_SOURCES = gsl_qrng.h qrng.c niederreiter-2.c sobol.c halton.c reversehalton.c inline.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslqrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu qrng/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu qrng/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslqrng.la: $(libgslqrng_la_OBJECTS) $(libgslqrng_la_DEPENDENCIES) $(EXTRA_libgslqrng_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslqrng_la_OBJECTS) $(libgslqrng_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/halton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/niederreiter-2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qrng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reversehalton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sobol.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/qrng/Makefile.am0000644016036000116100000000064213373111456012077 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.6/qrng/gsl_qrng.h0000644016036000116100000000446313373111456012035 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.6/qrng/ChangeLog0000644016036000116100000000227713373111456011623 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.6/qrng/TODO0000644016036000116100000000113213373111456010526 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.6/qrng/qrng.c0000644016036000116100000000401513373111456011154 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.6/qrng/niederreiter-2.c0000644016036000116100000002161413135126237013030 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.6/qrng/sobol.c0000644016036000116100000001442213135126237011325 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.6/qrng/halton.c0000644016036000116100000002415213373111456011476 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.6/qrng/reversehalton.c0000644016036000116100000002463013373111456013073 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.6/qrng/inline.c0000644016036000116100000000034613373111456011466 00000000000000/* Author: G. Jungman */ #include #include #include #include /* Compile all the inline functions */ #define COMPILE_INLINE_STATIC #include "build.h" #include gsl-2.6/qrng/test.c0000644016036000116100000001505113373111456011166 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.6/rng/0000755016036000116100000000000013527016561007742 500000000000000gsl-2.6/rng/Makefile.in0000644016036000116100000011330413527016363011731 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = rng DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslrng_la_LIBADD = am_libgslrng_la_OBJECTS = borosh13.lo cmrg.lo coveyou.lo default.lo \ file.lo fishman18.lo fishman20.lo fishman2x.lo gfsr4.lo \ knuthran2.lo knuthran.lo knuthran2002.lo lecuyer21.lo \ minstd.lo mrg.lo mt.lo r250.lo ran0.lo ran1.lo ran2.lo ran3.lo \ rand48.lo rand.lo random.lo randu.lo ranf.lo ranlux.lo \ ranlxd.lo ranlxs.lo ranmar.lo rng.lo slatec.lo taus.lo \ taus113.lo transputer.lo tt.lo types.lo uni32.lo uni.lo vax.lo \ waterman14.lo zuf.lo inline.lo libgslrng_la_OBJECTS = $(am_libgslrng_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslrng.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslrng_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslrng_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslrng.la pkginclude_HEADERS = gsl_rng.h AM_CPPFLAGS = -I$(top_srcdir) libgslrng_la_SOURCES = borosh13.c cmrg.c coveyou.c default.c file.c fishman18.c fishman20.c fishman2x.c gfsr4.c knuthran2.c knuthran.c knuthran2002.c lecuyer21.c minstd.c mrg.c mt.c r250.c ran0.c ran1.c ran2.c ran3.c rand48.c rand.c random.c randu.c ranf.c ranlux.c ranlxd.c ranlxs.c ranmar.c rng.c slatec.c taus.c taus113.c transputer.c tt.c types.c uni32.c uni.c vax.c waterman14.c zuf.c inline.c CLEANFILES = test.dat noinst_HEADERS = schrage.c test_SOURCES = test.c test_LDADD = libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la TESTS = $(check_PROGRAMS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rng/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu rng/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslrng.la: $(libgslrng_la_OBJECTS) $(libgslrng_la_DEPENDENCIES) $(EXTRA_libgslrng_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslrng_la_OBJECTS) $(libgslrng_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/borosh13.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmrg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coveyou.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman18.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman20.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fishman2x.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfsr4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/knuthran2002.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lecuyer21.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minstd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mrg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r250.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ran3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand48.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlxd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranlxs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ranmar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slatec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taus113.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transputer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uni.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uni32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/waterman14.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zuf.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # benchmark_SOURCES = benchmark.c # benchmark_LDADD = libgslrng.la ../err/libgslerr.la ../utils/libutils.la # rng_dump_SOURCES = rng-dump.c # rng_dump_LDADD = libgslrng.la ../err/libgslerr.la ../utils/libutils.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/rng/Makefile.am0000644016036000116100000000172313373111456011717 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.6/rng/schrage.c0000644016036000116100000000352213135126237011441 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.6/rng/gsl_rng.h0000644016036000116100000001545513373111456011476 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.6/rng/ChangeLog0000644016036000116100000003075713373111456011446 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.6/rng/TODO0000644016036000116100000000750413373111456010356 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.6/rng/borosh13.c0000644016036000116100000000423113135126237011463 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.6/rng/cmrg.c0000644016036000116100000001231013135126237010750 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.6/rng/coveyou.c0000644016036000116100000000431213135126237011514 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.6/rng/default.c0000644016036000116100000000460013135126237011447 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.6/rng/file.c0000644016036000116100000000261513373111456010747 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.6/rng/fishman18.c0000644016036000116100000000443513135126237011627 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.6/rng/fishman20.c0000644016036000116100000000446213135126237011620 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.6/rng/fishman2x.c0000644016036000116100000000551513135126237011730 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.6/rng/gfsr4.c0000644016036000116100000001263113373111456011054 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.6/rng/knuthran2.c0000644016036000116100000000477213135126237011751 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.6/rng/knuthran.c0000644016036000116100000001134713135126237011663 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.6/rng/knuthran2002.c0000644016036000116100000001143013135126237012160 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.6/rng/lecuyer21.c0000644016036000116100000000434313135126237011642 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.6/rng/minstd.c0000644016036000116100000000546713135126237011335 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.6/rng/mrg.c0000644016036000116100000000760013135126237010613 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.6/rng/mt.c0000644016036000116100000001465613373111456010460 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.6/rng/r250.c0000644016036000116100000001132413135126237010514 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.6/rng/ran0.c0000644016036000116100000000505013135126237010663 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.6/rng/ran1.c0000644016036000116100000000570213135126237010670 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.6/rng/ran2.c0000644016036000116100000000676413135126237010702 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.6/rng/ran3.c0000644016036000116100000000603613373111456010674 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.6/rng/rand48.c0000644016036000116100000000742713135126237011135 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.6/rng/rand.c0000644016036000116100000000436613135126237010760 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.6/rng/random.c0000644016036000116100000004003313135126237011303 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.6/rng/randu.c0000644016036000116100000000502213135126237011133 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.6/rng/ranf.c0000644016036000116100000001023113373111456010747 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.6/rng/ranlux.c0000644016036000116100000001242413135126237011337 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.6/rng/ranlxd.c0000644016036000116100000001321413135126237011314 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.6/rng/ranlxs.c0000644016036000116100000001577113373111456011346 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.6/rng/ranmar.c0000644016036000116100000000757013135126237011314 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.6/rng/rng.c0000644016036000116100000000617713373111456010625 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.6/rng/slatec.c0000644016036000116100000001661713135126237011311 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.6/rng/taus.c0000644016036000116100000001266413135126237011010 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.6/rng/taus113.c0000644016036000116100000001256713433322215011232 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.6/rng/transputer.c0000644016036000116100000000435413135126237012240 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.6/rng/tt.c0000644016036000116100000000741513135126237010461 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.6/rng/types.c0000644016036000116100000000520413135126237011170 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.6/rng/uni32.c0000644016036000116100000001406313135126237010767 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.6/rng/uni.c0000644016036000116100000001367213135126237010627 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.6/rng/vax.c0000644016036000116100000000421213135126237010620 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.6/rng/waterman14.c0000644016036000116100000000422113135126237012005 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.6/rng/zuf.c0000644016036000116100000000671113135126237010634 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.6/rng/inline.c0000644016036000116100000000203113373111456011276 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.6/rng/test.c0000644016036000116100000004255413373111456011015 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.6/randist/0000755016036000116100000000000013527016561010620 500000000000000gsl-2.6/randist/Makefile.in0000644016036000116100000011365313527016363012616 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = randist DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslrandist_la_LIBADD = am_libgslrandist_la_OBJECTS = bernoulli.lo beta.lo bigauss.lo \ binomial.lo cauchy.lo chisq.lo dirichlet.lo discrete.lo \ erlang.lo exponential.lo exppow.lo fdist.lo flat.lo gamma.lo \ gauss.lo gausszig.lo gausstail.lo geometric.lo gumbel.lo \ hyperg.lo laplace.lo levy.lo logarithmic.lo logistic.lo \ lognormal.lo multinomial.lo mvgauss.lo nbinomial.lo pareto.lo \ pascal.lo poisson.lo rayleigh.lo shuffle.lo sphere.lo tdist.lo \ weibull.lo landau.lo binomial_tpe.lo 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslrandist_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslrandist_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslrandist.la pkginclude_HEADERS = gsl_randist.h AM_CPPFLAGS = -I$(top_srcdir) libgslrandist_la_SOURCES = bernoulli.c beta.c bigauss.c binomial.c cauchy.c chisq.c dirichlet.c discrete.c erlang.c exponential.c exppow.c fdist.c flat.c gamma.c gauss.c gausszig.c gausstail.c geometric.c gumbel.c hyperg.c laplace.c levy.c logarithmic.c logistic.c lognormal.c multinomial.c mvgauss.c nbinomial.c pareto.c pascal.c poisson.c rayleigh.c shuffle.c sphere.c tdist.c weibull.c landau.c binomial_tpe.c 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslrandist.la: $(libgslrandist_la_OBJECTS) $(libgslrandist_la_DEPENDENCIES) $(EXTRA_libgslrandist_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslrandist_la_OBJECTS) $(libgslrandist_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bernoulli.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial_tpe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirichlet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discrete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/erlang.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exppow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gausstail.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gausszig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometric.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hyperg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/landau.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logarithmic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logistic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multinomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvgauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nbinomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pareto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pascal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleigh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shuffle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibull.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wishart.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/randist/Makefile.am0000644016036000116100000000207713373111456012600 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.6/randist/gsl_randist.h0000644016036000116100000002415313373111456013225 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.6/randist/ChangeLog0000644016036000116100000004105213373111456012312 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.6/randist/TODO0000644016036000116100000000600413373111456011226 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.6/randist/bernoulli.c0000644016036000116100000000255413135126237012702 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.6/randist/beta.c0000644016036000116100000000522513373111456011621 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.6/randist/bigauss.c0000644016036000116100000000417713135126237012347 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.6/randist/binomial.c0000644016036000116100000000441113135126237012473 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.6/randist/cauchy.c0000644016036000116100000000261613135126237012162 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.6/randist/chisq.c0000644016036000116100000000311013373111456012004 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.6/randist/dirichlet.c0000644016036000116100000000775513135126237012666 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.6/randist/discrete.c0000644016036000116100000003217413373111456012513 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.6/randist/erlang.c0000644016036000116100000000274713135126237012163 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.6/randist/exponential.c0000644016036000116100000000255013373111456013232 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.6/randist/exppow.c0000644016036000116100000000637213135126237012233 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.6/randist/fdist.c0000644016036000116100000000362113373111456012015 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.6/randist/flat.c0000644016036000116100000000261013373111456011627 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.6/randist/gamma.c0000644016036000116100000001223513373111456011767 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.6/randist/gauss.c0000644016036000116100000001063713135126237012032 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.6/randist/gausszig.c0000644016036000116100000002272313373111456012544 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.6/randist/gausstail.c0000644016036000116100000000514313135126237012700 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.6/randist/geometric.c0000644016036000116100000000313013135126237012654 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.6/randist/gumbel.c0000644016036000116100000000346013135126237012157 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.6/randist/hyperg.c0000644016036000116100000000542513135126237012205 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.6/randist/laplace.c0000644016036000116100000000270713135126237012310 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.6/randist/levy.c0000644016036000116100000000723713135126237011671 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 Lvy 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.6/randist/logarithmic.c0000644016036000116100000000351713135126237013211 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.6/randist/logistic.c0000644016036000116100000000257413135126237012526 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.6/randist/lognormal.c0000644016036000116100000000361313135126237012676 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.6/randist/multinomial.c0000644016036000116100000000572613373111456013246 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.6/randist/mvgauss.c0000644016036000116100000001653313373111456012377 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.6/randist/nbinomial.c0000644016036000116100000000325513373111456012657 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.6/randist/pareto.c0000644016036000116100000000254713135126237012203 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.6/randist/pascal.c0000644016036000116100000000322513135126237012146 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.6/randist/poisson.c0000644016036000116100000000404113135126237012372 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.6/randist/rayleigh.c0000644016036000116100000000377613135126237012522 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.6/randist/shuffle.c0000644016036000116100000000672313135126237012345 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.6/randist/sphere.c0000644016036000116100000000663713135126237012203 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.6/randist/tdist.c0000644016036000116100000000420013135126237012024 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.6/randist/weibull.c0000644016036000116100000000305213135126237012344 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.6/randist/landau.c0000644016036000116100000005112013135126237012144 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.6/randist/binomial_tpe.c0000644016036000116100000003120213373111456013342 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.6/randist/wishart.c0000644016036000116100000001520113373111456012362 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.6/randist/test.c0000644016036000116100000014770513373111456011677 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.6/fft/0000755016036000116100000000000013527016561007733 500000000000000gsl-2.6/fft/Makefile.in0000644016036000116100000010544713527016362011732 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = fft DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslfft_la_LIBADD = am_libgslfft_la_OBJECTS = dft.lo fft.lo libgslfft_la_OBJECTS = $(am_libgslfft_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) signals.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslfft.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslfft_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslfft_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslfft.la pkginclude_HEADERS = gsl_fft.h gsl_fft_complex.h gsl_fft_halfcomplex.h gsl_fft_real.h gsl_dft_complex.h gsl_dft_complex_float.h gsl_fft_complex_float.h gsl_fft_halfcomplex_float.h gsl_fft_real_float.h AM_CPPFLAGS = -I$(top_srcdir) libgslfft_la_SOURCES = dft.c fft.c noinst_HEADERS = c_pass.h hc_pass.h real_pass.h signals.h signals_source.c c_main.c c_init.c c_pass_2.c c_pass_3.c c_pass_4.c c_pass_5.c c_pass_6.c c_pass_7.c c_pass_n.c c_radix2.c bitreverse.c bitreverse.h factorize.c factorize.h hc_init.c hc_pass_2.c hc_pass_3.c hc_pass_4.c hc_pass_5.c hc_pass_n.c hc_radix2.c hc_unpack.c real_init.c real_pass_2.c real_pass_3.c real_pass_4.c real_pass_5.c real_pass_n.c real_radix2.c real_unpack.c compare.h compare_source.c dft_source.c hc_main.c real_main.c test_complex_source.c test_real_source.c test_trap_source.c urand.c complex_internal.h TESTS = $(check_PROGRAMS) test_SOURCES = test.c signals.c test_LDADD = libgslfft.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu fft/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu fft/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslfft.la: $(libgslfft_la_OBJECTS) $(libgslfft_la_DEPENDENCIES) $(EXTRA_libgslfft_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslfft_la_OBJECTS) $(libgslfft_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #errs_LDADD = libgslfft.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la #benchmark_LDADD = libgslfft.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/fft/Makefile.am0000644016036000116100000000242513373111455011707 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.6/fft/c_pass.h0000644016036000116100000001137113135126237011274 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.6/fft/hc_pass.h0000644016036000116100000000636513135126237011453 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.6/fft/real_pass.h0000644016036000116100000000655313135126237012003 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.6/fft/signals.h0000644016036000116100000000565013135126237011467 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.6/fft/signals_source.c0000644016036000116100000001613713135126237013044 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.6/fft/c_main.c0000644016036000116100000001573113135126237011251 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.6/fft/c_init.c0000644016036000116100000001131013373111455011255 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.6/fft/c_pass_2.c0000644016036000116100000000577613135126237011524 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.6/fft/c_pass_3.c0000644016036000116100000001050713135126237011511 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.6/fft/c_pass_4.c0000644016036000116100000001221513135126237011510 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.6/fft/c_pass_5.c0000644016036000116100000001703513135126237011516 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.6/fft/c_pass_6.c0000644016036000116100000002023113135126237011507 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.6/fft/c_pass_7.c0000644016036000116100000003075313135126237011522 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.6/fft/c_pass_n.c0000644016036000116100000001374013135126237011606 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.6/fft/bitreverse.c0000644016036000116100000000473513135126237012177 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.6/fft/bitreverse.h0000644016036000116100000000250713135126237012177 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.6/fft/factorize.c0000644016036000116100000000721713135126237012011 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.6/fft/factorize.h0000644016036000116100000000232113135126237012005 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.6/fft/hc_init.c0000644016036000116100000000640613373111455011437 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.6/fft/hc_pass_2.c0000644016036000116100000000637113135126237011664 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.6/fft/hc_pass_3.c0000644016036000116100000001235713135126237011666 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.6/fft/hc_pass_4.c0000644016036000116100000001466213135126237011670 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.6/fft/hc_pass_5.c0000644016036000116100000002275513135126237011673 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.6/fft/hc_pass_n.c0000644016036000116100000002006513135126237011754 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.6/fft/hc_radix2.c0000644016036000116100000001133513135126237011662 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.6/fft/hc_unpack.c0000644016036000116100000000547613135126237011763 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.6/fft/real_init.c0000644016036000116100000001047413373111455011770 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.6/fft/real_pass_2.c0000644016036000116100000000720613135126237012213 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.6/fft/real_pass_3.c0000644016036000116100000001332313135126237012211 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.6/fft/real_pass_4.c0000644016036000116100000001604513135126237012216 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.6/fft/real_pass_5.c0000644016036000116100000002437213135126237012221 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.6/fft/real_pass_n.c0000644016036000116100000002052213135126237012303 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.6/fft/real_radix2.c0000644016036000116100000000753713135126237012224 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.6/fft/real_unpack.c0000644016036000116100000000245413135126237012305 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.6/fft/compare.h0000644016036000116100000000251213135126237011447 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.6/fft/compare_source.c0000644016036000116100000000626313135126237013031 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.6/fft/dft_source.c0000644016036000116100000000616413135126237012160 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.6/fft/hc_main.c0000644016036000116100000001222013135126237011407 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.6/fft/real_main.c0000644016036000116100000000765213135126237011755 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.6/fft/test_complex_source.c0000644016036000116100000003560713135126237014115 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.6/fft/test_real_source.c0000644016036000116100000001660213135126237013363 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.6/fft/test_trap_source.c0000644016036000116100000001226013135126237013402 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.6/fft/urand.c0000644016036000116100000000171213135126237011126 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.6/fft/complex_internal.h0000644016036000116100000000055613135126237013372 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.6/fft/gsl_fft.h0000644016036000116100000000257213373111455011453 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.6/fft/gsl_fft_complex.h0000644016036000116100000001133613135126237013200 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.6/fft/gsl_fft_halfcomplex.h0000644016036000116100000000572413135126237014037 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.6/fft/gsl_fft_real.h0000644016036000116100000000427013135126237012453 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.6/fft/gsl_dft_complex.h0000644016036000116100000000342613135126237013177 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.6/fft/gsl_dft_complex_float.h0000644016036000116100000000347613135126237014371 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.6/fft/gsl_fft_complex_float.h0000644016036000116100000001234513135126237014366 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.6/fft/gsl_fft_halfcomplex_float.h0000644016036000116100000000624213135126237015220 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.6/fft/gsl_fft_real_float.h0000644016036000116100000000451613135126237013643 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.6/fft/ChangeLog0000644016036000116100000001027013373111455011422 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.6/fft/TODO0000644016036000116100000000126313373111455010342 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.6/fft/dft.c0000644016036000116100000000073213135126237010573 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.6/fft/fft.c0000644016036000116100000000465013135126237010600 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.6/fft/test.c0000644016036000116100000000630613135126237011000 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.6/fft/signals.c0000644016036000116100000000077313135126237011463 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.6/poly/0000755016036000116100000000000013527016561010137 500000000000000gsl-2.6/poly/Makefile.in0000644016036000116100000010515013527016363012126 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = poly DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslpoly_la_LIBADD = am_libgslpoly_la_OBJECTS = dd.lo eval.lo solve_quadratic.lo \ solve_cubic.lo zsolve_quadratic.lo zsolve_cubic.lo zsolve.lo \ zsolve_init.lo deriv.lo libgslpoly_la_OBJECTS = $(am_libgslpoly_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslpoly.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la ../sort/libgslsort.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslpoly_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslpoly_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslpoly.la pkginclude_HEADERS = gsl_poly.h AM_CPPFLAGS = -I$(top_srcdir) libgslpoly_la_SOURCES = dd.c eval.c solve_quadratic.c solve_cubic.c zsolve_quadratic.c zsolve_cubic.c zsolve.c zsolve_init.c deriv.c noinst_HEADERS = balance.c companion.c qr.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslpoly.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../sort/libgslsort.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu poly/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu poly/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslpoly.la: $(libgslpoly_la_OBJECTS) $(libgslpoly_la_DEPENDENCIES) $(EXTRA_libgslpoly_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslpoly_la_OBJECTS) $(libgslpoly_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve_cubic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve_quadratic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_cubic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zsolve_quadratic.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/poly/Makefile.am0000644016036000116100000000100613373111456012106 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.6/poly/balance.c0000644016036000116100000000615113135126237011610 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.6/poly/companion.c0000644016036000116100000000226413135126237012207 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.6/poly/qr.c0000644016036000116100000001253613373111456010652 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.6/poly/gsl_poly.h0000644016036000116100000001244013373111456012057 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.6/poly/ChangeLog0000644016036000116100000000720613373111456011634 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.6/poly/TODO0000644016036000116100000001333213373111456010547 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.6/poly/dd.c0000644016036000116100000000636613373111456010623 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.6/poly/eval.c0000644016036000116100000000175313373111456011156 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.6/poly/solve_quadratic.c0000644016036000116100000000405613373111456013413 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.6/poly/solve_cubic.c0000644016036000116100000000565513373111456012531 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.6/poly/zsolve_quadratic.c0000644016036000116100000000505713135126237013606 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.6/poly/zsolve_cubic.c0000644016036000116100000001017413373111456012713 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.6/poly/zsolve.c0000644016036000116100000000412213135126237011541 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.6/poly/zsolve_init.c0000644016036000116100000000346713373111456012600 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.6/poly/deriv.c0000644016036000116100000000304313373111456011332 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.6/poly/test.c0000644016036000116100000005543113373111456011210 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.6/fit/0000755016036000116100000000000013527016561007736 500000000000000gsl-2.6/fit/Makefile.in0000644016036000116100000010351513527016362011727 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = fit DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslfit_la_LIBADD = am_libgslfit_la_OBJECTS = linear.lo libgslfit_la_OBJECTS = $(am_libgslfit_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslfit.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la \ ../sys/libgslsys.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslfit_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslfit_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslfit.la pkginclude_HEADERS = gsl_fit.h AM_CPPFLAGS = -I$(top_srcdir) libgslfit_la_SOURCES = linear.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslfit.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu fit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu fit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslfit.la: $(libgslfit_la_OBJECTS) $(libgslfit_la_DEPENDENCIES) $(EXTRA_libgslfit_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslfit_la_OBJECTS) $(libgslfit_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #demo_SOURCES = demo.c #demo_LDADD = libgslfit.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/fit/Makefile.am0000644016036000116100000000101013373111455011677 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.6/fit/gsl_fit.h0000644016036000116100000000531413135126237011456 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.6/fit/ChangeLog0000644016036000116100000000104513373111455011425 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.6/fit/linear.c0000644016036000116100000002034113135126237011271 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.6/fit/test.c0000644016036000116100000001405013135126237010776 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.6/multifit/0000755016036000116100000000000013527016561011011 500000000000000gsl-2.6/multifit/Makefile.in0000644016036000116100000011332613527016363013004 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multifit DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultifit_la_LIBADD = am_libgslmultifit_la_OBJECTS = gcv.lo multilinear.lo multiwlinear.lo \ work.lo lmniel.lo lmder.lo fsolver.lo fdfsolver.lo fdfridge.lo \ fdjac.lo convergence.lo gradient.lo covar.lo multirobust.lo \ robust_wfun.lo multireg.lo libgslmultifit_la_OBJECTS = $(am_libgslmultifit_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultifit.la ../linalg/libgsllinalg.la \ ../permutation/libgslpermutation.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../matrix/libgslmatrix.la \ ../sort/libgslsort.la ../statistics/libgslstatistics.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la \ ../sys/libgslsys.la ../rng/libgslrng.la \ ../specfunc/libgslspecfunc.la ../min/libgslmin.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultifit_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultifit_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultifit.la pkginclude_HEADERS = gsl_multifit.h gsl_multifit_nlin.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultifit_la_SOURCES = gcv.c multilinear.c multiwlinear.c work.c lmniel.c lmder.c fsolver.c fdfsolver.c fdfridge.c fdjac.c convergence.c gradient.c covar.c multirobust.c robust_wfun.c multireg.c noinst_HEADERS = \ linear_common.c \ lmutil.c \ lmpar.c \ lmset.c \ lmiterate.c \ lmmisc.c \ qrsolv.c \ test_bard.c \ test_beale.c \ test_biggs.c \ test_box.c \ test_boxbod.c \ test_brown1.c \ test_brown2.c \ test_brown3.c \ test_eckerle.c \ test_enso.c \ test_estimator.c \ test_exp1.c \ test_filip.c \ test_gaussian.c \ test_hahn1.c \ test_helical.c \ test_jennrich.c \ test_kirby2.c \ test_kowalik.c \ test_lin1.c \ test_lin2.c \ test_lin3.c \ test_linear.c \ test_longley.c \ test_meyer.c \ test_meyerscal.c \ test_nelson.c \ test_nonlinear.c \ test_osborne.c \ test_penalty1.c \ test_penalty2.c \ test_pontius.c \ test_powell1.c \ test_powell2.c \ test_powell3.c \ test_rat42.c \ test_rat43.c \ test_reg.c \ test_rosenbrock.c \ test_rosenbrocke.c \ test_roth.c \ test_shaw.c \ test_thurber.c \ test_vardim.c \ test_watson.c \ test_wnlin.c \ test_wood.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../sort/libgslsort.la ../statistics/libgslstatistics.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../min/libgslmin.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multifit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multifit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultifit.la: $(libgslmultifit_la_OBJECTS) $(libgslmultifit_la_DEPENDENCIES) $(EXTRA_libgslmultifit_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultifit_la_OBJECTS) $(libgslmultifit_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfridge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gradient.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lmniel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multilinear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multireg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multirobust.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiwlinear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/robust_wfun.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #demo_SOURCES = demo.c #demo_LDADD = libgslmultifit.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../randist/libgslrandist.la ../rng/libgslrng.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multifit/Makefile.am0000644016036000116100000000527013373111456012767 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.6/multifit/linear_common.c0000644016036000116100000001362013373111456013717 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.6/multifit/lmutil.c0000644016036000116100000000504013373111456012400 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.6/multifit/lmpar.c0000644016036000116100000002612013373111456012207 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.6/multifit/lmset.c0000644016036000116100000000373413373111456012226 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.6/multifit/lmiterate.c0000644016036000116100000001257613373111456013074 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.6/multifit/lmmisc.c0000644016036000116100000000553013373111456012362 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.6/multifit/qrsolv.c0000644016036000116100000001324713135126237012427 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.6/multifit/test_bard.c0000644016036000116100000000515613373111456013051 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.6/multifit/test_beale.c0000644016036000116100000000326213373111456013205 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.6/multifit/test_biggs.c0000644016036000116100000000463113373111456013231 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.6/multifit/test_box.c0000644016036000116100000000342013373111456012721 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.6/multifit/test_boxbod.c0000644016036000116100000000412513373111456013411 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.6/multifit/test_brown1.c0000644016036000116100000000415713373111456013351 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.6/multifit/test_brown2.c0000644016036000116100000000466013373111456013351 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.6/multifit/test_brown3.c0000644016036000116100000000304313373111456013344 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.6/multifit/test_eckerle.c0000644016036000116100000000624313373111456013551 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.6/multifit/test_enso.c0000644016036000116100000001253313373111456013102 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.6/multifit/test_estimator.c0000644016036000116100000000206413135126237014142 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.6/multifit/test_exp1.c0000644016036000116100000000461213373111456013012 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.6/multifit/test_filip.c0000644016036000116100000002603713373111456013245 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.6/multifit/test_gaussian.c0000644016036000116100000000436013373111456013747 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.6/multifit/test_hahn1.c0000644016036000116100000002236013373111456013134 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.6/multifit/test_helical.c0000644016036000116100000000374213373111456013541 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.6/multifit/test_jennrich.c0000644016036000116100000000342113373111456013732 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.6/multifit/test_kirby2.c0000644016036000116100000001520513373111456013337 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.6/multifit/test_kowalik.c0000644016036000116100000000630013373111456013572 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.6/multifit/test_lin1.c0000644016036000116100000000321613373111456012777 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.6/multifit/test_lin2.c0000644016036000116100000000323313373111456012777 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.6/multifit/test_lin3.c0000644016036000116100000000345713373111456013010 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.6/multifit/test_linear.c0000644016036000116100000000373313373111456013412 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.6/multifit/test_longley.c0000644016036000116100000001453113373111456013607 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.6/multifit/test_meyer.c0000644016036000116100000000417513373111456013262 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.6/multifit/test_meyerscal.c0000644016036000116100000000446113373111456014123 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.6/multifit/test_nelson.c0000644016036000116100000001364613373111456013442 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.6/multifit/test_nonlinear.c0000644016036000116100000004441413373111456014126 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.6/multifit/test_osborne.c0000644016036000116100000000460313373111456013604 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.6/multifit/test_penalty1.c0000644016036000116100000000347713373111456013702 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.6/multifit/test_penalty2.c0000644016036000116100000000557613373111456013705 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.6/multifit/test_pontius.c0000644016036000116100000001157413373111456013643 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.6/multifit/test_powell1.c0000644016036000116100000000430713373111456013521 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.6/multifit/test_powell2.c0000644016036000116100000000276113373111456013524 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.6/multifit/test_powell3.c0000644016036000116100000000316613373111456013525 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.6/multifit/test_rat42.c0000644016036000116100000000454313373111456013074 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.6/multifit/test_rat43.c0000644016036000116100000000501713373111456013072 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.6/multifit/test_reg.c0000644016036000116100000004320413373111456012712 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.6/multifit/test_rosenbrock.c0000644016036000116100000000274413373111456014310 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.6/multifit/test_rosenbrocke.c0000644016036000116100000000374513373111456014457 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.6/multifit/test_roth.c0000644016036000116100000000347713373111456013121 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.6/multifit/test_shaw.c0000644016036000116100000002302613521373264013101 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.6/multifit/test_thurber.c0000644016036000116100000000646713373111456013622 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.6/multifit/test_vardim.c0000644016036000116100000000342213373111456013415 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.6/multifit/test_watson.c0000644016036000116100000000525313373111456013452 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.6/multifit/test_wnlin.c0000644016036000116100000000744413373111456013272 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.6/multifit/test_wood.c0000644016036000116100000000374313373111456013111 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.6/multifit/gsl_multifit.h0000644016036000116100000003432513373111456013611 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_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.6/multifit/gsl_multifit_nlin.h0000644016036000116100000002613513373111456014631 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.6/multifit/ChangeLog0000644016036000116100000001301313373111456012477 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.6/multifit/TODO0000644016036000116100000000116213373111456011417 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.6/multifit/gcv.c0000644016036000116100000002516213373111456011660 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.6/multifit/multilinear.c0000644016036000116100000002326713373111456013432 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.6/multifit/multiwlinear.c0000644016036000116100000001177613373111456013623 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.6/multifit/work.c0000644016036000116100000000573213373111456012064 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.6/multifit/lmniel.c0000644016036000116100000002505413521373150012355 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.6/multifit/lmder.c0000644016036000116100000002545613373111456012212 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.6/multifit/fsolver.c0000644016036000116100000001046513373111456012561 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.6/multifit/fdfsolver.c0000644016036000116100000002235413373111456013073 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.6/multifit/fdfridge.c0000644016036000116100000003116713373111456012655 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.6/multifit/fdjac.c0000644016036000116100000000761613373111456012154 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.6/multifit/convergence.c0000644016036000116100000000756513373111456013406 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.6/multifit/gradient.c0000644016036000116100000000220013373111456012662 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.6/multifit/covar.c0000644016036000116100000001140713373111456012210 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.6/multifit/multirobust.c0000644016036000116100000004776213373111456013504 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.6/multifit/robust_wfun.c0000644016036000116100000001321113373111456013446 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.6/multifit/multireg.c0000644016036000116100000010726313521373237012736 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_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.6/multifit/test.c0000644016036000116100000000301413373111456012050 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.6/multifit_nlinear/0000755016036000116100000000000013527016561012521 500000000000000gsl-2.6/multifit_nlinear/Makefile.in0000644016036000116100000011162713527016363014516 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multifit_nlinear DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultifit_nlinear_la_LIBADD = am_libgslmultifit_nlinear_la_OBJECTS = cholesky.lo convergence.lo \ covar.lo dogleg.lo fdf.lo fdfvv.lo fdjac.lo lm.lo 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultifit_nlinear_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultifit_nlinear_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultifit_nlinear.la pkginclude_HEADERS = gsl_multifit_nlinear.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultifit_nlinear_la_SOURCES = cholesky.c convergence.c covar.c dogleg.c fdf.c fdfvv.c fdjac.c lm.c 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultifit_nlinear.la: $(libgslmultifit_nlinear_la_OBJECTS) $(libgslmultifit_nlinear_la_DEPENDENCIES) $(EXTRA_libgslmultifit_nlinear_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultifit_nlinear_la_OBJECTS) $(libgslmultifit_nlinear_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dogleg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfvv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subspace2D.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multifit_nlinear/Makefile.am0000644016036000116100000000367613473544531014514 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.6/multifit_nlinear/common.c0000644016036000116100000000621213373111456014074 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.6/multifit_nlinear/nielsen.c0000644016036000116100000000532213373111456014242 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.6/multifit_nlinear/qrsolv.c0000644016036000116100000001302613373111456014133 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.6/multifit_nlinear/test_bard.c0000644016036000116100000000652713373111456014564 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.6/multifit_nlinear/test_beale.c0000644016036000116100000000445313373111456014720 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.6/multifit_nlinear/test_biggs.c0000644016036000116100000000704113373111456014737 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.6/multifit_nlinear/test_box.c0000644016036000116100000000647513373111456014446 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.6/multifit_nlinear/test_boxbod.c0000644016036000116100000000561213373111456015123 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.6/multifit_nlinear/test_brown1.c0000644016036000116100000000554113373111456015057 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.6/multifit_nlinear/test_brown2.c0000644016036000116100000000651113373111456015056 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.6/multifit_nlinear/test_brown3.c0000644016036000116100000000403013373111456015051 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.6/multifit_nlinear/test_eckerle.c0000644016036000116100000000741613373111456015264 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.6/multifit_nlinear/test_enso.c0000644016036000116100000001204113373111456014604 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.6/multifit_nlinear/test_exp1.c0000644016036000116100000000634613373111456014530 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.6/multifit_nlinear/test_fdf.c0000644016036000116100000002470713373111456014413 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.6/multifit_nlinear/test_gaussian.c0000644016036000116100000000677513373111456015473 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.6/multifit_nlinear/test_hahn1.c0000644016036000116100000001741113373111456014645 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.6/multifit_nlinear/test_helical.c0000644016036000116100000000522313373111456015245 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.6/multifit_nlinear/test_jennrich.c0000644016036000116100000000462413373111456015450 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.6/multifit_nlinear/test_kirby2.c0000644016036000116100000001562113373111456015051 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.6/multifit_nlinear/test_kowalik.c0000644016036000116100000001021213373111456015277 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.6/multifit_nlinear/test_lin1.c0000644016036000116100000000400413373111456014503 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.6/multifit_nlinear/test_lin2.c0000644016036000116100000000402013373111456014502 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.6/multifit_nlinear/test_lin3.c0000644016036000116100000000432513373111456014513 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.6/multifit_nlinear/test_meyer.c0000644016036000116100000000601713373111456014767 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.6/multifit_nlinear/test_meyerscal.c0000644016036000116100000000635013373111456015632 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.6/multifit_nlinear/test_osborne.c0000644016036000116100000000652113373111456015315 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.6/multifit_nlinear/test_penalty1.c0000644016036000116100000000446513373111456015410 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.6/multifit_nlinear/test_penalty2.c0000644016036000116100000001026313373111456015402 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.6/multifit_nlinear/test_powell1.c0000644016036000116100000000552413373111456015233 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.6/multifit_nlinear/test_powell2.c0000644016036000116100000000375213373111456015235 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.6/multifit_nlinear/test_powell3.c0000644016036000116100000000417613373111456015237 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.6/multifit_nlinear/test_rat42.c0000644016036000116100000000657613373111456014614 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.6/multifit_nlinear/test_rat43.c0000644016036000116100000000553213373111456014604 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.6/multifit_nlinear/test_rosenbrock.c0000644016036000116100000000363413373111456016017 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.6/multifit_nlinear/test_rosenbrocke.c0000644016036000116100000000477713373111456016175 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.6/multifit_nlinear/test_roth.c0000644016036000116100000000437713373111456014631 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.6/multifit_nlinear/test_thurber.c0000644016036000116100000000731713373111456015325 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.6/multifit_nlinear/test_vardim.c0000644016036000116100000000447513373111456015136 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.6/multifit_nlinear/test_watson.c0000644016036000116100000000671213373111456015163 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.6/multifit_nlinear/test_wnlin.c0000644016036000116100000001077413373111456015002 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.6/multifit_nlinear/test_wood.c0000644016036000116100000000514713373111456014621 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.6/multifit_nlinear/gsl_multifit_nlinear.h0000644016036000116100000002756313473544542017046 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.6/multifit_nlinear/TODO0000644016036000116100000000044113373111456013126 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.6/multifit_nlinear/cholesky.c0000644016036000116100000001721613521373361014433 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.6/multifit_nlinear/convergence.c0000644016036000116100000000676213373111456015114 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.6/multifit_nlinear/covar.c0000644016036000116100000001156713373111456013727 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.6/multifit_nlinear/dogleg.c0000644016036000116100000003340313373111456014047 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.6/multifit_nlinear/fdf.c0000644016036000116100000003320013373111456013340 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.6/multifit_nlinear/fdfvv.c0000644016036000116100000000720113373111456013716 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.6/multifit_nlinear/fdjac.c0000644016036000116100000001274513373111456013663 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.6/multifit_nlinear/lm.c0000644016036000116100000002235013373111456013215 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.6/multifit_nlinear/mcholesky.c0000644016036000116100000001774413521373403014613 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.6/multifit_nlinear/qr.c0000644016036000116100000001617513373111456013237 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.6/multifit_nlinear/scaling.c0000644016036000116100000001031713373111456014225 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.6/multifit_nlinear/subspace2D.c0000644016036000116100000005313513373111456014605 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.6/multifit_nlinear/svd.c0000644016036000116100000001457013373111456013406 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.6/multifit_nlinear/trust.c0000644016036000116100000004204313373111456013767 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.6/multifit_nlinear/test.c0000644016036000116100000000707213473545125013575 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.6/multilarge/0000755016036000116100000000000013527016561011321 500000000000000gsl-2.6/multilarge/Makefile.in0000644016036000116100000010513113527016363013307 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multilarge DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultilarge_la_LIBADD = am_libgslmultilarge_la_OBJECTS = multilarge.lo normal.lo tsqr.lo libgslmultilarge_la_OBJECTS = $(am_libgslmultilarge_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultilarge.la ../test/libgsltest.la \ ../multifit/libgslmultifit.la ../eigen/libgsleigen.la \ ../linalg/libgsllinalg.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../permutation/libgslpermutation.la \ ../matrix/libgslmatrix.la ../vector/libgslvector.la \ ../block/libgslblock.la ../sys/libgslsys.la \ ../utils/libutils.la ../rng/libgslrng.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../complex/libgslcomplex.la ../min/libgslmin.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultilarge_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultilarge_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultilarge.la pkginclude_HEADERS = gsl_multilarge.h libgslmultilarge_la_SOURCES = multilarge.c normal.c tsqr.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmultilarge.la ../test/libgsltest.la ../multifit/libgslmultifit.la ../eigen/libgsleigen.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../sys/libgslsys.la ../utils/libutils.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../complex/libgslcomplex.la ../min/libgslmin.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multilarge/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multilarge/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultilarge.la: $(libgslmultilarge_la_OBJECTS) $(libgslmultilarge_la_DEPENDENCIES) $(EXTRA_libgslmultilarge_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultilarge_la_OBJECTS) $(libgslmultilarge_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multilarge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsqr.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multilarge/Makefile.am0000644016036000116100000000127513510453604013275 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.6/multilarge/gsl_multilarge.h0000644016036000116100000001244313510453541014423 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 *); void (*free) (void *); } gsl_multilarge_linear_type; typedef struct { const gsl_multilarge_linear_type * type; void * state; size_t p; } gsl_multilarge_linear_workspace; /* available types */ GSL_VAR const gsl_multilarge_linear_type * gsl_multilarge_linear_normal; GSL_VAR const gsl_multilarge_linear_type * gsl_multilarge_linear_tsqr; /* * Prototypes */ gsl_multilarge_linear_workspace * gsl_multilarge_linear_alloc(const gsl_multilarge_linear_type * T, const size_t p); void gsl_multilarge_linear_free(gsl_multilarge_linear_workspace * w); const char *gsl_multilarge_linear_name(const gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_reset(gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_accumulate(gsl_matrix * X, gsl_vector * y, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_solve(const double lambda, gsl_vector * c, double * rnorm, double * snorm, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_rcond(double *rcond, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_lcurve(gsl_vector * reg_param, gsl_vector * rho, gsl_vector * eta, gsl_multilarge_linear_workspace * w); int gsl_multilarge_linear_wstdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_stdform1 (const gsl_vector * L, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_L_decomp (gsl_matrix * L, gsl_vector * tau); int gsl_multilarge_linear_wstdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * w, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_stdform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_matrix * X, const gsl_vector * y, gsl_matrix * Xs, gsl_vector * ys, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_genform1 (const gsl_vector * L, const gsl_vector * cs, gsl_vector * c, gsl_multilarge_linear_workspace * work); int gsl_multilarge_linear_genform2 (const gsl_matrix * LQR, const gsl_vector * Ltau, const gsl_vector * cs, gsl_vector * c, gsl_multilarge_linear_workspace * work); __END_DECLS #endif /* __GSL_MULTILARGE_H__ */ gsl-2.6/multilarge/multilarge.c0000644016036000116100000002471413475030747013566 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; } } gsl-2.6/multilarge/normal.c0000644016036000116100000003026313521373657012707 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 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; } /* 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_free }; const gsl_multilarge_linear_type * gsl_multilarge_linear_normal = &normal_type; gsl-2.6/multilarge/tsqr.c0000644016036000116100000002720313521373676012411 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 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_TR_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 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_free }; const gsl_multilarge_linear_type * gsl_multilarge_linear_tsqr = &tsqr_type; gsl-2.6/multilarge/test.c0000644016036000116100000003524113510453660012366 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.6/multilarge_nlinear/0000755016036000116100000000000013527016562013032 500000000000000gsl-2.6/multilarge_nlinear/Makefile.in0000644016036000116100000011101113527016363015011 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multilarge_nlinear DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultilarge_nlinear_la_LIBADD = am_libgslmultilarge_nlinear_la_OBJECTS = cgst.lo cholesky.lo \ convergence.lo dogleg.lo dummy.lo fdf.lo lm.lo 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultilarge_nlinear_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultilarge_nlinear_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultilarge_nlinear.la pkginclude_HEADERS = gsl_multilarge_nlinear.h libgslmultilarge_nlinear_la_SOURCES = cgst.c cholesky.c convergence.c dogleg.c dummy.c fdf.c lm.c 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultilarge_nlinear.la: $(libgslmultilarge_nlinear_la_OBJECTS) $(libgslmultilarge_nlinear_la_DEPENDENCIES) $(EXTRA_libgslmultilarge_nlinear_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultilarge_nlinear_la_OBJECTS) $(libgslmultilarge_nlinear_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dogleg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcholesky.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subspace2D.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trust.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multilarge_nlinear/Makefile.am0000644016036000116100000000341013473542210014776 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.6/multilarge_nlinear/common.c0000644016036000116100000001011413473543237014407 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.6/multilarge_nlinear/nielsen.c0000644016036000116100000000537313473557151014567 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.6/multilarge_nlinear/test_fdf.c0000644016036000116100000002631713373111456014722 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.6/multilarge_nlinear/test_bard.c0000644016036000116100000000733313373111456015070 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.6/multilarge_nlinear/test_beale.c0000644016036000116100000000522713373111456015230 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.6/multilarge_nlinear/test_biggs.c0000644016036000116100000001054613373111456015253 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.6/multilarge_nlinear/test_box.c0000644016036000116100000000724113373111456014746 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.6/multilarge_nlinear/test_boxbod.c0000644016036000116100000000636313373111456015437 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.6/multilarge_nlinear/test_brown1.c0000644016036000116100000000634013373111456015365 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.6/multilarge_nlinear/test_brown2.c0000644016036000116100000000727513373111456015376 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.6/multilarge_nlinear/test_brown3.c0000644016036000116100000000464413373111456015374 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.6/multilarge_nlinear/test_eckerle.c0000644016036000116100000001020513373111456015562 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.6/multilarge_nlinear/test_enso.c0000644016036000116100000001265213373111456015124 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.6/multilarge_nlinear/test_exp1.c0000644016036000116100000000713213373111456015032 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.6/multilarge_nlinear/test_hahn1.c0000644016036000116100000002021413373111456015150 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.6/multilarge_nlinear/test_helical.c0000644016036000116100000000610613373111456015556 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.6/multilarge_nlinear/test_gaussian.c0000644016036000116100000000761113373111456015771 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.6/multilarge_nlinear/test_jennrich.c0000644016036000116100000000543013373111456015754 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.6/multilarge_nlinear/test_kirby2.c0000644016036000116100000001641613373111456015364 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.6/multilarge_nlinear/test_kowalik.c0000644016036000116100000001105613373111456015616 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.6/multilarge_nlinear/test_lin1.c0000644016036000116100000000454013373111456015020 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.6/multilarge_nlinear/test_lin2.c0000644016036000116100000000455413373111456015026 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.6/multilarge_nlinear/test_lin3.c0000644016036000116100000000507113373111456015022 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.6/multilarge_nlinear/test_meyer.c0000644016036000116100000000660313373111456015300 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.6/multilarge_nlinear/test_meyerscal.c0000644016036000116100000000717413373111456016147 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.6/multilarge_nlinear/test_osborne.c0000644016036000116100000000734313373111456015630 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.6/multilarge_nlinear/test_penalty1.c0000644016036000116100000000527113373111456015714 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.6/multilarge_nlinear/test_penalty2.c0000644016036000116100000001111713373111456015711 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.6/multilarge_nlinear/test_powell1.c0000644016036000116100000000650013373111456015536 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.6/multilarge_nlinear/test_powell2.c0000644016036000116100000000456113373111456015544 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.6/multilarge_nlinear/test_powell3.c0000644016036000116100000000501113373111456015534 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.6/multilarge_nlinear/test_rat42.c0000644016036000116100000000734613373111456015120 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.6/multilarge_nlinear/test_rat43.c0000644016036000116100000000631113373111456015110 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.6/multilarge_nlinear/test_rosenbrock.c0000644016036000116100000000450013373111456016320 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.6/multilarge_nlinear/test_rosenbrocke.c0000644016036000116100000000565313373111456016477 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.6/multilarge_nlinear/test_roth.c0000644016036000116100000000516313373111456015133 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.6/multilarge_nlinear/test_thurber.c0000644016036000116100000001014313373111456015624 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.6/multilarge_nlinear/test_vardim.c0000644016036000116100000000527113373111456015441 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.6/multilarge_nlinear/test_watson.c0000644016036000116100000000752613373111456015477 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.6/multilarge_nlinear/test_wood.c0000644016036000116100000000602313373111456015123 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.6/multilarge_nlinear/test_wnlin.c0000644016036000116100000001006213373111456015300 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.6/multilarge_nlinear/gsl_multilarge_nlinear.h0000644016036000116100000003142513473542235017653 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.6/multilarge_nlinear/TODO0000644016036000116100000000015713373111456013442 000000000000001. finite difference J and fvv for cholesky solver 2. Fix biggs test x0 and dogleg / ddogleg convergence issue gsl-2.6/multilarge_nlinear/cgst.c0000644016036000116100000002411213373111456014053 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.6/multilarge_nlinear/cholesky.c0000644016036000116100000002075613521373532014746 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.6/multilarge_nlinear/convergence.c0000644016036000116100000000557013373111456015420 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.6/multilarge_nlinear/dogleg.c0000644016036000116100000003415213373111456014361 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.6/multilarge_nlinear/dummy.c0000644016036000116100000000543713373111456014257 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.6/multilarge_nlinear/fdf.c0000644016036000116100000003626513473543610013670 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.6/multilarge_nlinear/lm.c0000644016036000116100000002434313373111456013531 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.6/multilarge_nlinear/mcholesky.c0000644016036000116100000002133613521373566015125 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.6/multilarge_nlinear/scaling.c0000644016036000116100000001026213373111456014534 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.6/multilarge_nlinear/subspace2D.c0000644016036000116100000005466513521373604015126 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.6/multilarge_nlinear/trust.c0000644016036000116100000004242213373111456014300 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.6/multilarge_nlinear/test.c0000644016036000116100000000606413473543345014107 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.6/filter/0000755016036000116100000000000013527016562010442 500000000000000gsl-2.6/filter/Makefile.in0000644016036000116100000010536113527016362012433 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = filter DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(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` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslfilter.la: $(libgslfilter_la_OBJECTS) $(libgslfilter_la_DEPENDENCIES) $(EXTRA_libgslfilter_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslfilter_la_OBJECTS) $(libgslfilter_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaussian.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impulse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/median.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmedian.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/filter/Makefile.am0000644016036000116100000000141713517226277012426 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.6/filter/ringbuf.c0000644016036000116100000001121413373111455012155 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.6/filter/test_impulse.c0000644016036000116100000001230613373111455013241 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.6/filter/test_gaussian.c0000644016036000116100000001500013373111455013367 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.6/filter/test_median.c0000644016036000116100000001056613373111455013026 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.6/filter/test_rmedian.c0000644016036000116100000001127013373111455013201 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.6/filter/gsl_filter.h0000644016036000116100000000772213373111455012671 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.6/filter/TODO0000644016036000116100000000004313310514157011040 00000000000000gaussian - tests (derivative test) gsl-2.6/filter/gaussian.c0000644016036000116100000002154013373111455012336 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.6/filter/impulse.c0000644016036000116100000002223213373111455012201 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.6/filter/median.c0000644016036000116100000000406213373111455011761 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.6/filter/rmedian.c0000644016036000116100000001362513377336115012156 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.6/filter/test.c0000644016036000116100000000376213373111455011511 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.6/movstat/0000755016036000116100000000000013527016562010652 500000000000000gsl-2.6/movstat/Makefile.in0000644016036000116100000011112513527016363012637 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = movstat DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(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` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmovstat.la: $(libgslmovstat_la_OBJECTS) $(libgslmovstat_la_DEPENDENCIES) $(EXTRA_libgslmovstat_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmovstat_la_OBJECTS) $(libgslmovstat_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apply.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fill.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/funcacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/madacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/medacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movQn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movSn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movmad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movmean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movmedian.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movminmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movqqr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movsum.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movvariance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mvacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qnacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qqracc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sumacc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/movstat/Makefile.am0000644016036000116100000000246213517226440012627 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.6/movstat/deque.c0000644016036000116100000001154513373111455012043 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.6/movstat/ringbuf.c0000644016036000116100000001140413373111456012367 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.6/movstat/test_mad.c0000644016036000116100000001420613373111456012536 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.6/movstat/test_mean.c0000644016036000116100000001123513373111456012714 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.6/movstat/test_median.c0000644016036000116100000001513213373111456013231 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.6/movstat/test_minmax.c0000644016036000116100000002362713373111456013275 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.6/movstat/test_Qn.c0000644016036000116100000001257213373111456012357 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.6/movstat/test_qqr.c0000644016036000116100000001224513373111456012601 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.6/movstat/test_Sn.c0000644016036000116100000001231013373111456012347 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.6/movstat/test_sum.c0000644016036000116100000001177613373111456012612 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.6/movstat/test_variance.c0000644016036000116100000001463513373111456013573 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.6/movstat/gsl_movstat.h0000644016036000116100000001376413377336115013322 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.6/movstat/TODO0000644016036000116100000000017013301320735011246 000000000000001. medacc: add delete function and convert to movstat_apply format 2. remove gsl_math.h / gsl_function_vec -- not used? gsl-2.6/movstat/alloc.c0000644016036000116100000001036013373111455012024 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.6/movstat/apply.c0000644016036000116100000001471113377336115012071 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.6/movstat/fill.c0000644016036000116100000000600713373111455011663 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.6/movstat/funcacc.c0000644016036000116100000000541613373111455012342 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.6/movstat/madacc.c0000644016036000116100000001054613373111455012150 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.6/movstat/medacc.c0000644016036000116100000001616613373111455012160 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.6/movstat/mmacc.c0000644016036000116100000001651013373111455012015 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.6/movstat/movmad.c0000644016036000116100000000623113373111456012220 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.6/movstat/movmean.c0000644016036000116100000000260313373111456012376 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.6/movstat/movmedian.c0000644016036000116100000000261713373111456012720 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.6/movstat/movminmax.c0000644016036000116100000000464313373111456012755 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.6/movstat/movsum.c0000644016036000116100000000257513373111456012272 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.6/movstat/movSn.c0000644016036000116100000000315013373111456012034 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.6/movstat/movQn.c0000644016036000116100000000315013373111455012031 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.6/movstat/movqqr.c0000644016036000116100000000364113373111456012264 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.6/movstat/movvariance.c0000644016036000116100000000354113373111456013250 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.6/movstat/mvacc.c0000644016036000116100000001125513373111456012030 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.6/movstat/qnacc.c0000644016036000116100000000630413373111456012023 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.6/movstat/qqracc.c0000644016036000116100000000602113373111456012204 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.6/movstat/snacc.c0000644016036000116100000000563113373111456012027 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.6/movstat/sumacc.c0000644016036000116100000000507013373111456012210 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.6/movstat/test.c0000644016036000116100000000502513373111456011714 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.6/rstat/0000755016036000116100000000000013527016562010312 500000000000000gsl-2.6/rstat/Makefile.in0000644016036000116100000010424413527016364012304 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = rstat DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslrstat_la_LIBADD = am_libgslrstat_la_OBJECTS = rstat.lo rquantile.lo libgslrstat_la_OBJECTS = $(am_libgslrstat_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslrstat.la ../statistics/libgslstatistics.la \ ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la \ ../randist/libgslrandist.la ../rng/libgslrng.la \ ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la ../vector/libgslvector.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslrstat_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslrstat_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslrstat.la pkginclude_HEADERS = gsl_rstat.h AM_CPPFLAGS = -I$(top_srcdir) libgslrstat_la_SOURCES = rstat.c rquantile.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslrstat.la ../statistics/libgslstatistics.la ../sort/libgslsort.la ../ieee-utils/libgslieeeutils.la ../randist/libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../vector/libgslvector.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rstat/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu rstat/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslrstat.la: $(libgslrstat_la_OBJECTS) $(libgslrstat_la_DEPENDENCIES) $(EXTRA_libgslrstat_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslrstat_la_OBJECTS) $(libgslrstat_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rquantile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rstat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/rstat/Makefile.am0000644016036000116100000000105113373111456012260 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.6/rstat/gsl_rstat.h0000644016036000116100000000552013373111456012404 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__ #undef __BEGIN_DECLS #undef __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.6/rstat/rstat.c0000644016036000116100000001105713373111456011534 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.6/rstat/rquantile.c0000644016036000116100000001215113373111456012377 00000000000000/* rstat/rquantile.c * * Copyright (C) 2015 Patrick Alken * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include /* * Running quantile calculation based on the paper * * [1] R. Jain and I. Chlamtac, "The P^2 algorithm for dynamic * calculation of quantiles and histograms without storing * observations", Communications of the ACM, October 1985 */ static double calc_psq(const double qp1, const double q, const double qm1, const double d, const double np1, const double n, const double nm1); gsl_rstat_quantile_workspace * gsl_rstat_quantile_alloc(const double p) { gsl_rstat_quantile_workspace *w; w = calloc(1, sizeof(gsl_rstat_quantile_workspace)); if (w == 0) { GSL_ERROR_NULL ("failed to allocate space for workspace", GSL_ENOMEM); } w->p = p; gsl_rstat_quantile_reset(w); return w; } /* gsl_rstat_quantile_alloc() */ void gsl_rstat_quantile_free(gsl_rstat_quantile_workspace *w) { free(w); } /* gsl_rstat_quantile_free() */ int gsl_rstat_quantile_reset(gsl_rstat_quantile_workspace *w) { const double p = w->p; size_t i; /* initialize positions n */ for (i = 0; i < 5; ++i) w->npos[i] = i + 1; /* initialize n' */ w->np[0] = 1.0; w->np[1] = 1.0 + 2.0 * p; w->np[2] = 1.0 + 4.0 * p; w->np[3] = 3.0 + 2.0 * p; w->np[4] = 5.0; /* initialize dn' */ w->dnp[0] = 0.0; w->dnp[1] = 0.5 * p; w->dnp[2] = p; w->dnp[3] = 0.5 * (1.0 + p); w->dnp[4] = 1.0; w->n = 0; return GSL_SUCCESS; } int gsl_rstat_quantile_add(const double x, gsl_rstat_quantile_workspace *w) { if (w->n < 5) { w->q[w->n] = x; } else { int i; int k = -1; if (w->n == 5) { /* initialization: sort the first five heights */ gsl_sort(w->q, 1, w->n); } /* step B1: find k such that q_k <= x < q_{k+1} */ if (x < w->q[0]) { w->q[0] = x; k = 0; } else if (x >= w->q[4]) { w->q[4] = x; k = 3; } else { for (i = 0; i <= 3; ++i) { if (w->q[i] <= x && x < w->q[i + 1]) { k = i; break; } } } if (k < 0) { /* we could get here if x is nan */ GSL_ERROR ("invalid input argument x", GSL_EINVAL); } /* step B2(a): update n_i */ for (i = k + 1; i <= 4; ++i) ++(w->npos[i]); /* step B2(b): update n_i' */ for (i = 0; i < 5; ++i) w->np[i] += w->dnp[i]; /* step B3: update heights */ for (i = 1; i <= 3; ++i) { double ni = (double) w->npos[i]; double d = w->np[i] - ni; if ((d >= 1.0 && (w->npos[i + 1] - w->npos[i] > 1)) || (d <= -1.0 && (w->npos[i - 1] - w->npos[i] < -1))) { int dsign = (d > 0.0) ? 1 : -1; double qp1 = w->q[i + 1]; double qi = w->q[i]; double qm1 = w->q[i - 1]; double np1 = (double) w->npos[i + 1]; double nm1 = (double) w->npos[i - 1]; double qp = calc_psq(qp1, qi, qm1, (double) dsign, np1, ni, nm1); if (qm1 < qp && qp < qp1) w->q[i] = qp; else { /* use linear formula */ w->q[i] += dsign * (w->q[i + dsign] - qi) / ((double) w->npos[i + dsign] - ni); } w->npos[i] += dsign; } } } ++(w->n); return GSL_SUCCESS; } /* gsl_rstat_quantile_add() */ double gsl_rstat_quantile_get(gsl_rstat_quantile_workspace *w) { if (w->n >= 5) { return w->q[2]; } else { /* not yet initialized */ gsl_sort(w->q, 1, w->n); return gsl_stats_quantile_from_sorted_data(w->q, 1, w->n, w->p); } } /* gsl_rstat_quantile_get() */ static double calc_psq(const double qp1, const double q, const double qm1, const double d, const double np1, const double n, const double nm1) { double outer = d / (np1 - nm1); double inner_left = (n - nm1 + d) * (qp1 - q) / (np1 - n); double inner_right = (np1 - n - d) * (q - qm1) / (n - nm1); return q + outer * (inner_left + inner_right); } /* calc_psq() */ gsl-2.6/rstat/test.c0000644016036000116100000001544313373111456011361 00000000000000/* rstat/test.c * * Copyright (C) 2015 Patrick Alken * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include double * random_data(const size_t n, gsl_rng *r) { size_t i; double *data = malloc(n * sizeof(double)); for (i = 0; i < n; ++i) data[i] = gsl_rng_uniform(r); return data; } void test_basic(const size_t n, const double data[], const double tol) { gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_sd_mean = expected_sd / sqrt((double) n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); double expected_rms = 0.0; double mean, var, sd, sd_mean, rms, skew, kurtosis; size_t i, num; int status; /* compute expected rms */ for (i = 0; i < n; ++i) expected_rms += data[i] * data[i]; expected_rms = sqrt(expected_rms / n); /* add data to rstat workspace */ for (i = 0; i < n; ++i) gsl_rstat_add(data[i], rstat_workspace_p); mean = gsl_rstat_mean(rstat_workspace_p); var = gsl_rstat_variance(rstat_workspace_p); sd = gsl_rstat_sd(rstat_workspace_p); sd_mean = gsl_rstat_sd_mean(rstat_workspace_p); rms = gsl_rstat_rms(rstat_workspace_p); skew = gsl_rstat_skew(rstat_workspace_p); kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); num = gsl_rstat_n(rstat_workspace_p); gsl_test_int(num, n, "n n=%zu" , n); gsl_test_rel(mean, expected_mean, tol, "mean n=%zu", n); gsl_test_rel(var, expected_var, tol, "variance n=%zu", n); gsl_test_rel(sd, expected_sd, tol, "stddev n=%zu", n); gsl_test_rel(sd_mean, expected_sd_mean, tol, "stddev_mean n=%zu", n); gsl_test_rel(rms, expected_rms, tol, "rms n=%zu", n); gsl_test_rel(skew, expected_skew, tol, "skew n=%zu", n); gsl_test_rel(kurtosis, expected_kurtosis, tol, "kurtosis n=%zu", n); status = gsl_rstat_reset(rstat_workspace_p); gsl_test_int(status, GSL_SUCCESS, "rstat returned success"); num = gsl_rstat_n(rstat_workspace_p); gsl_test_int(num, 0, "n n=%zu" , n); gsl_rstat_free(rstat_workspace_p); } void test_quantile(const double p, const double data[], const size_t n, const double expected, const double tol, const char *desc) { gsl_rstat_quantile_workspace *w = gsl_rstat_quantile_alloc(p); double result; size_t i; for (i = 0; i < n; ++i) gsl_rstat_quantile_add(data[i], w); result = gsl_rstat_quantile_get(w); if (fabs(expected) < 1.0e-4) gsl_test_abs(result, expected, tol, "%s p=%g", desc, p); else gsl_test_rel(result, expected, tol, "%s p=%g", desc, p); gsl_rstat_quantile_free(w); } int main() { gsl_rng *r = gsl_rng_alloc(gsl_rng_default); const double tol1 = 1.0e-8; const double tol2 = 1.0e-3; gsl_ieee_env_setup(); { const size_t N = 2000000; double *data = random_data(N, r); double data2[] = { 4.0, 7.0, 13.0, 16.0, -5.0 }; size_t i; test_basic(2, data, tol1); test_basic(100, data, tol1); test_basic(1000, data, tol1); test_basic(10000, data, tol1); test_basic(50000, data, tol1); test_basic(80000, data, tol1); test_basic(1500000, data, tol1); test_basic(2000000, data, tol1); for (i = 0; i < 5; ++i) data2[i] += 1.0e9; test_basic(5, data2, tol1); free(data); } { /* dataset from Jain and Chlamtac paper */ const size_t n_jain = 20; const double data_jain[] = { 0.02, 0.15, 0.74, 3.39, 0.83, 22.37, 10.15, 15.43, 38.62, 15.92, 34.60, 10.28, 1.47, 0.40, 0.05, 11.39, 0.27, 0.42, 0.09, 11.37 }; double expected_jain = 4.44063435326; test_quantile(0.5, data_jain, n_jain, expected_jain, tol1, "jain"); } { size_t n = 1000000; double *data = malloc(n * sizeof(double)); double *sorted_data = malloc(n * sizeof(double)); gsl_rstat_workspace *rstat_workspace_p = gsl_rstat_alloc(); double p; size_t i; for (i = 0; i < n; ++i) { data[i] = gsl_ran_gaussian_tail(r, 1.3, 1.0); gsl_rstat_add(data[i], rstat_workspace_p); } memcpy(sorted_data, data, n * sizeof(double)); gsl_sort(sorted_data, 1, n); /* test quantile calculation */ for (p = 0.1; p <= 0.9; p += 0.1) { double expected = gsl_stats_quantile_from_sorted_data(sorted_data, 1, n, p); test_quantile(p, data, n, expected, tol2, "gauss"); } /* test mean, variance */ { const double expected_mean = gsl_stats_mean(data, 1, n); const double expected_var = gsl_stats_variance(data, 1, n); const double expected_sd = gsl_stats_sd(data, 1, n); const double expected_skew = gsl_stats_skew(data, 1, n); const double expected_kurtosis = gsl_stats_kurtosis(data, 1, n); const double expected_median = gsl_stats_quantile_from_sorted_data(sorted_data, 1, n, 0.5); const double mean = gsl_rstat_mean(rstat_workspace_p); const double var = gsl_rstat_variance(rstat_workspace_p); const double sd = gsl_rstat_sd(rstat_workspace_p); const double skew = gsl_rstat_skew(rstat_workspace_p); const double kurtosis = gsl_rstat_kurtosis(rstat_workspace_p); const double median = gsl_rstat_median(rstat_workspace_p); gsl_test_rel(mean, expected_mean, tol1, "mean"); gsl_test_rel(var, expected_var, tol1, "variance"); gsl_test_rel(sd, expected_sd, tol1, "stddev"); gsl_test_rel(skew, expected_skew, tol1, "skew"); gsl_test_rel(kurtosis, expected_kurtosis, tol1, "kurtosis"); gsl_test_abs(median, expected_median, tol2, "median"); } free(data); free(sorted_data); gsl_rstat_free(rstat_workspace_p); } gsl_rng_free(r); exit (gsl_test_summary()); } gsl-2.6/statistics/0000755016036000116100000000000013527016562011347 500000000000000gsl-2.6/statistics/Makefile.in0000644016036000116100000011150613527016364013340 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = statistics DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslstatistics_la_LIBADD = am_libgslstatistics_la_OBJECTS = mean.lo variance.lo absdev.lo skew.lo \ kurtosis.lo lag1.lo p_variance.lo minmax.lo ttest.lo 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslstatistics_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslstatistics_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslstatistics.la pkginclude_HEADERS = gsl_statistics.h gsl_statistics_char.h gsl_statistics_double.h gsl_statistics_float.h gsl_statistics_int.h gsl_statistics_long.h gsl_statistics_long_double.h gsl_statistics_short.h gsl_statistics_uchar.h gsl_statistics_uint.h gsl_statistics_ulong.h gsl_statistics_ushort.h AM_CPPFLAGS = -I$(top_srcdir) libgslstatistics_la_SOURCES = mean.c variance.c absdev.c skew.c kurtosis.c lag1.c p_variance.c minmax.c ttest.c 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslstatistics.la: $(libgslstatistics_la_OBJECTS) $(libgslstatistics_la_DEPENDENCIES) $(EXTRA_libgslstatistics_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslstatistics_la_OBJECTS) $(libgslstatistics_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Qn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/absdev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/covariance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gastwirth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kurtosis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lag1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/median.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p_variance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quantiles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/select.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skew.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_nist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_robust.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trmean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variance.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wabsdev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wkurtosis.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmean.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wskew.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wvariance.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/statistics/Makefile.am0000644016036000116100000000261013373111456013317 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.6/statistics/mean_source.c0000644016036000116100000000230313135126237013725 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.6/statistics/variance_source.c0000644016036000116100000000731013373111456014601 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.6/statistics/covariance_source.c0000644016036000116100000001373513373111456015133 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.6/statistics/absdev_source.c0000644016036000116100000000305013135126237014251 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.6/statistics/skew_source.c0000644016036000116100000000335513135126237013766 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.6/statistics/kurtosis_source.c0000644016036000116100000000364413135126237014701 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.6/statistics/lag1_source.c0000644016036000116100000000327513135126237013642 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.6/statistics/p_variance_source.c0000644016036000116100000000266413135126237015126 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.6/statistics/minmax_source.c0000644016036000116100000001021613135126237014300 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.6/statistics/ttest_source.c0000644016036000116100000000324113135126237014152 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.6/statistics/mad_source.c0000644016036000116100000000366613373111456013564 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.6/statistics/median_source.c0000644016036000116100000000350613373111456014251 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.6/statistics/quantiles_source.c0000644016036000116100000000272513135126237015022 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.6/statistics/select_source.c0000644016036000116100000000630513373111456014273 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.6/statistics/Sn_source.c0000644016036000116100000002035013373111456013370 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.6/statistics/Qn_source.c0000644016036000116100000002402713373111456013373 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.6/statistics/gastwirth_source.c0000644016036000116100000000264713373111456015035 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.6/statistics/trmean_source.c0000644016036000116100000000275713373111456014311 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.6/statistics/wmean_source.c0000644016036000116100000000263013135126237014117 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.6/statistics/wvariance_source.c0000644016036000116100000001235013373111456014770 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.6/statistics/wabsdev_source.c0000644016036000116100000000327113135126237014445 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.6/statistics/wskew_source.c0000644016036000116100000000400713135126237014150 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.6/statistics/wkurtosis_source.c0000644016036000116100000000427013135126237015064 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.6/statistics/test_float_source.c0000644016036000116100000004305613373111456015164 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.6/statistics/test_int_source.c0000644016036000116100000003072413373111456014647 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.6/statistics/gsl_statistics.h0000644016036000116100000000100713135126237014471 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.6/statistics/gsl_statistics_char.h0000644016036000116100000001332513373111456015475 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.6/statistics/gsl_statistics_double.h0000644016036000116100000001741613373111456016037 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.6/statistics/gsl_statistics_float.h0000644016036000116100000002000213373111456015653 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.6/statistics/gsl_statistics_int.h0000644016036000116100000001315613373111456015354 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.6/statistics/gsl_statistics_long.h0000644016036000116100000001332513373111456015517 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.6/statistics/gsl_statistics_long_double.h0000644016036000116100000002157213373111456017054 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.6/statistics/gsl_statistics_short.h0000644016036000116100000001347413373111456015724 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.6/statistics/gsl_statistics_uchar.h0000644016036000116100000001441413373111456015662 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.6/statistics/gsl_statistics_uint.h0000644016036000116100000001424513373111456015541 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.6/statistics/gsl_statistics_ulong.h0000644016036000116100000001441413373111456015704 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.6/statistics/gsl_statistics_ushort.h0000644016036000116100000001456313373111456016111 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.6/statistics/ChangeLog0000644016036000116100000000771113373111456013044 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.6/statistics/TODO0000644016036000116100000000603713373111456011762 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.6/statistics/mean.c0000644016036000116100000000250313135126237012347 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.6/statistics/variance.c0000644016036000116100000000260213135126237013217 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.6/statistics/absdev.c0000644016036000116100000000255213135126237012677 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.6/statistics/skew.c0000644016036000116100000000252613135126237012405 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.6/statistics/kurtosis.c0000644016036000116100000000260113135126237013311 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.6/statistics/lag1.c0000644016036000116100000000250313135126237012253 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.6/statistics/p_variance.c0000644016036000116100000000260613135126237013542 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.6/statistics/minmax.c0000644016036000116100000000260713135126237012725 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.6/statistics/ttest.c0000644016036000116100000000254113135126237012574 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.6/statistics/mad.c0000644016036000116100000000252313373111456012173 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.6/statistics/median.c0000644016036000116100000000253213135126237012666 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.6/statistics/covariance.c0000644016036000116100000000515213373111456013545 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.6/statistics/quantiles.c0000644016036000116100000000257313135126237013443 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.6/statistics/select.c0000644016036000116100000000261713373111456012715 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.6/statistics/Sn.c0000644016036000116100000000254213373111456012013 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.6/statistics/Qn.c0000644016036000116100000000254213373111456012011 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.6/statistics/gastwirth.c0000644016036000116100000000257313373111456013453 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.6/statistics/trmean.c0000644016036000116100000000256313373111456012724 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.6/statistics/wmean.c0000644016036000116100000000064513135126237012543 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.6/statistics/wvariance.c0000644016036000116100000000070213135126237013405 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.6/statistics/wabsdev.c0000644016036000116100000000067413135126237013071 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.6/statistics/wskew.c0000644016036000116100000000066713135126237012600 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.6/statistics/wkurtosis.c0000644016036000116100000000070213135126237013500 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.6/statistics/test.c0000644016036000116100000000600613373111456012411 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.6/statistics/test_nist.c0000644016036000116100000006357213373111456013461 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.6/statistics/test_robust.c0000644016036000116100000001334713373111456014015 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.6/siman/0000755016036000116100000000000013527016562010264 500000000000000gsl-2.6/siman/Makefile.in0000644016036000116100000010574113527016364012261 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) noinst_PROGRAMS = siman_tsp$(EXEEXT) subdir = siman DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsiman_la_LIBADD = am_libgslsiman_la_OBJECTS = siman.lo libgslsiman_la_OBJECTS = $(am_libgslsiman_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = PROGRAMS = $(noinst_PROGRAMS) am_siman_tsp_OBJECTS = siman_tsp.$(OBJEXT) siman_tsp_OBJECTS = $(am_siman_tsp_OBJECTS) siman_tsp_DEPENDENCIES = libgslsiman.la ../rng/libgslrng.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../sys/libgslsys.la ../utils/libutils.la am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslsiman.la ../rng/libgslrng.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsiman_la_SOURCES) $(siman_tsp_SOURCES) \ $(test_SOURCES) DIST_SOURCES = $(libgslsiman_la_SOURCES) $(siman_tsp_SOURCES) \ $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsiman.la TESTS = $(check_PROGRAMS) EXTRA_DIST = siman_test_driver.sh test_SOURCES = test.c test_LDADD = libgslsiman.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la siman_tsp_SOURCES = siman_tsp.c siman_tsp_LDADD = libgslsiman.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../sys/libgslsys.la ../utils/libutils.la CLEANFILES = siman_test.out libgslsiman_la_SOURCES = siman.c pkginclude_HEADERS = gsl_siman.h AM_CPPFLAGS = -I$(top_srcdir) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu siman/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu siman/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsiman.la: $(libgslsiman_la_OBJECTS) $(libgslsiman_la_DEPENDENCIES) $(EXTRA_libgslsiman_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsiman_la_OBJECTS) $(libgslsiman_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list siman_tsp$(EXEEXT): $(siman_tsp_OBJECTS) $(siman_tsp_DEPENDENCIES) $(EXTRA_siman_tsp_DEPENDENCIES) @rm -f siman_tsp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(siman_tsp_OBJECTS) $(siman_tsp_LDADD) $(LIBS) test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siman.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siman_tsp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/siman/Makefile.am0000644016036000116100000000127513373111456012242 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.6/siman/gsl_siman.h0000644016036000116100000000571213135126237012332 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.6/siman/ChangeLog0000644016036000116100000001105713373111456011757 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.6/siman/TODO0000644016036000116100000000050713373111456010673 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.6/siman/siman.c0000644016036000116100000001772713135126237011471 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.6/siman/siman_tsp.c0000644016036000116100000002242313135126237012344 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.6/siman/test.c0000644016036000116100000001122713135126237011326 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.6/siman/siman_test_driver.sh0000755016036000116100000000107613135126237014264 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.6/sum/0000755016036000116100000000000013527016562007761 500000000000000gsl-2.6/sum/Makefile.in0000644016036000116100000010373413527016364011756 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = sum DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsum_la_LIBADD = am_libgslsum_la_OBJECTS = levin_u.lo levin_utrunc.lo work_u.lo \ work_utrunc.lo libgslsum_la_OBJECTS = $(am_libgslsum_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslsum.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsum_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsum_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsum.la pkginclude_HEADERS = gsl_sum.h AM_CPPFLAGS = -I$(top_srcdir) libgslsum_la_SOURCES = levin_u.c levin_utrunc.c work_u.c work_utrunc.c TESTS = $(check_PROGRAMS) test_LDADD = libgslsum.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sum/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sum/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsum.la: $(libgslsum_la_OBJECTS) $(libgslsum_la_DEPENDENCIES) $(EXTRA_libgslsum_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsum_la_OBJECTS) $(libgslsum_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levin_u.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/levin_utrunc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_u.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_utrunc.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/sum/Makefile.am0000644016036000116100000000060513373111456011733 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.6/sum/gsl_sum.h0000644016036000116100000001253413135126237011524 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.6/sum/ChangeLog0000644016036000116100000000673513373111456011463 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.6/sum/levin_u.c0000644016036000116100000001617513373111456011515 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.6/sum/levin_utrunc.c0000644016036000116100000001355013135126237012562 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.6/sum/work_u.c0000644016036000116100000000413713373111456011355 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.6/sum/work_utrunc.c0000644016036000116100000000272713373111456012434 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.6/sum/test.c0000644016036000116100000001225113373111456011022 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.6/integration/0000755016036000116100000000000013527016563011501 500000000000000gsl-2.6/integration/Makefile.in0000644016036000116100000011176713527016362013500 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = integration DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslintegration_la_LIBADD = am_libgslintegration_la_OBJECTS = qk15.lo qk21.lo qk31.lo qk41.lo \ qk51.lo qk61.lo qk.lo qng.lo qag.lo qags.lo qagp.lo \ workspace.lo qcheb.lo qawc.lo qmomo.lo qaws.lo qmomof.lo \ qawo.lo qawf.lo glfixed.lo cquad.lo 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslintegration_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslintegration_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslintegration.la AM_CPPFLAGS = -I$(top_srcdir) libgslintegration_la_SOURCES = qk15.c qk21.c qk31.c qk41.c qk51.c qk61.c qk.c qng.c qng.h qag.c qags.c qagp.c workspace.c qcheb.c qawc.c qmomo.c qaws.c qmomof.c qawo.c qawf.c glfixed.c cquad.c 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslintegration.la: $(libgslintegration_la_OBJECTS) $(libgslintegration_la_DEPENDENCIES) $(EXTRA_libgslintegration_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslintegration_la_OBJECTS) $(libgslintegration_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chebyshev.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chebyshev2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cquad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fixed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gegenbauer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glfixed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hermite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jacobi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laguerre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legendre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qagp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qags.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qawo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qaws.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qcheb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk15.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk21.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk31.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk41.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk51.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qk61.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qmomo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qmomof.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qng.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rational.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/romberg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/workspace.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/integration/Makefile.am0000644016036000116100000000161113373111455013447 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.6/integration/qpsrt.c0000644016036000116100000000545613135126237012743 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.6/integration/qpsrt2.c0000644016036000116100000000371213135126237013016 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.6/integration/qelg.c0000644016036000116100000001311613135126237012512 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.6/integration/qc25c.c0000644016036000116100000000606013135126237012477 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.6/integration/qc25s.c0000644016036000116100000001332713135126237012523 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.6/integration/qc25f.c0000644016036000116100000001035113135126237012500 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.6/integration/ptsort.c0000644016036000116100000000306213135126237013114 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.6/integration/util.c0000644016036000116100000000714013135126237012537 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.6/integration/err.c0000644016036000116100000000315013135126237012347 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.6/integration/positivity.c0000644016036000116100000000054213135126237014004 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.6/integration/append.c0000644016036000116100000000233513135126237013032 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.6/integration/initialise.c0000644016036000116100000000240313135126237013711 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.6/integration/set_initial.c0000644016036000116100000000054613135126237014071 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.6/integration/reset.c0000644016036000116100000000032313135126237012700 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.6/integration/cquad_const.c0000644016036000116100000022571413373111455014076 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.6/integration/gsl_integration.h0000644016036000116100000003303713373111455014763 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.6/integration/ChangeLog0000644016036000116100000001265313373111455013175 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.6/integration/TODO0000644016036000116100000000232513373111455012106 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.6/integration/qk15.c0000644016036000116100000000465013135126237012346 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.6/integration/qk21.c0000644016036000116100000000533713135126237012346 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.6/integration/qk31.c0000644016036000116100000000627113135126237012345 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.6/integration/qk41.c0000644016036000116100000000725613373111455012352 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.6/integration/qk51.c0000644016036000116100000001034513135126237012344 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.6/integration/qk61.c0000644016036000116100000001117413135126237012346 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.6/integration/qk.c0000644016036000116100000000622413373111455012177 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.6/integration/qng.c0000644016036000116100000001236513373111455012354 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.6/integration/qng.h0000644016036000116100000001543513135126237012362 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.6/integration/qag.c0000644016036000116100000001541713373111455012340 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.6/integration/qags.c0000644016036000116100000003254013373111455012517 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.6/integration/qagp.c0000644016036000116100000002706613373111455012523 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.6/integration/workspace.c0000644016036000116100000000744413373111455013567 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.6/integration/qcheb.c0000644016036000116100000001341313135126237012644 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.6/integration/qawc.c0000644016036000116100000001273113373111455012517 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.6/integration/qmomo.c0000644016036000116100000001043313373111455012711 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.6/integration/qaws.c0000644016036000116100000001323713373111455012541 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.6/integration/qmomof.c0000644016036000116100000002144113373111455013060 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.6/integration/qawo.c0000644016036000116100000002510713373111455012534 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.6/integration/qawf.c0000644016036000116100000001423113135126237012517 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.6/integration/glfixed.c0000644016036000116100000032023713373111455013211 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.6/integration/cquad.c0000644016036000116100000003776313373111455012675 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.6/integration/fixed.c0000644016036000116100000002154613373111455012667 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.6/integration/chebyshev.c0000644016036000116100000000430113373111455013536 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.6/integration/chebyshev2.c0000644016036000116100000000423613373111455013627 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.6/integration/legendre.c0000644016036000116100000000404513373111455013350 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.6/integration/hermite.c0000644016036000116100000000416313373111455013221 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.6/integration/laguerre.c0000644016036000116100000000420013373111455013362 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.6/integration/gegenbauer.c0000644016036000116100000000503013373111455013662 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.6/integration/jacobi.c0000644016036000116100000000560113373111455013011 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.6/integration/exponential.c0000644016036000116100000000460313373111455014111 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.6/integration/rational.c0000644016036000116100000000613213373111455013373 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.6/integration/romberg.c0000644016036000116100000001025413373111455013217 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.6/integration/test.c0000644016036000116100000031550313525676723012563 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.6/integration/tests.c0000644016036000116100000002110313373111455012717 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.6/integration/tests.h0000644016036000116100000000601213373111455012726 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.6/interpolation/0000755016036000116100000000000013527016563012045 500000000000000gsl-2.6/interpolation/Makefile.in0000644016036000116100000010702313527016362014032 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = interpolation DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslinterpolation_la_LIBADD = am_libgslinterpolation_la_OBJECTS = accel.lo akima.lo cspline.lo \ interp.lo linear.lo spline.lo poly.lo steffen.lo inline.lo \ interp2d.lo bilinear.lo bicubic.lo spline2d.lo libgslinterpolation_la_OBJECTS = $(am_libgslinterpolation_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslinterpolation.la ../poly/libgslpoly.la \ ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la \ ../blas/libgslblas.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../complex/libgslcomplex.la ../cblas/libgslcblas.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslinterpolation_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslinterpolation_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslinterpolation.la pkginclude_HEADERS = gsl_interp.h gsl_spline.h gsl_interp2d.h gsl_spline2d.h libgslinterpolation_la_SOURCES = accel.c akima.c cspline.c interp.c linear.c integ_eval.h spline.c poly.c steffen.c inline.c interp2d.c bilinear.c bicubic.c spline2d.c noinst_HEADERS = test2d.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslinterpolation.la ../poly/libgslpoly.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu interpolation/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu interpolation/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslinterpolation.la: $(libgslinterpolation_la_OBJECTS) $(libgslinterpolation_la_DEPENDENCIES) $(EXTRA_libgslinterpolation_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslinterpolation_la_OBJECTS) $(libgslinterpolation_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/akima.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bicubic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bilinear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cspline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linear.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poly.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steffen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/interpolation/Makefile.am0000644016036000116100000000145413373111455014020 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.6/interpolation/test2d.c0000644016036000116100000003326713431326075013345 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); } } /* Then check additional points provided */ for (i = 0; i < test_size; i++) { double x = xval[i]; double y = yval[i]; test_single_low_level(&gsl_interp2d_eval, &gsl_interp2d_eval_e, interp, xarr, yarr, zarr, x, y, xa, ya, zval, i); test_single_low_level(&gsl_interp2d_eval_deriv_x, &gsl_interp2d_eval_deriv_x_e, interp, xarr, yarr, zarr, x, y, xa, ya, zxval, i); test_single_low_level(&gsl_interp2d_eval_deriv_y, &gsl_interp2d_eval_deriv_y_e, interp, xarr, yarr, zarr, x, y, xa, ya, zyval, i); test_single_low_level(&gsl_interp2d_eval_deriv_xx,&gsl_interp2d_eval_deriv_xx_e, interp, xarr, yarr, zarr, x, y, xa, ya, zxxval, i); test_single_low_level(&gsl_interp2d_eval_deriv_yy,&gsl_interp2d_eval_deriv_yy_e, interp, xarr, yarr, zarr, x, y, xa, ya, zyyval, i); test_single_low_level(&gsl_interp2d_eval_deriv_xy,&gsl_interp2d_eval_deriv_xy_e, interp, xarr, yarr, zarr, x, y, xa, ya, zxyval, i); test_single_high_level(&gsl_spline2d_eval, &gsl_spline2d_eval_e, interp_s, x, y, xa, ya, zval, i); test_single_high_level(&gsl_spline2d_eval_deriv_x, &gsl_spline2d_eval_deriv_x_e, interp_s, x, y, xa, ya, zxval, i); test_single_high_level(&gsl_spline2d_eval_deriv_y, &gsl_spline2d_eval_deriv_y_e, interp_s, x, y, xa, ya, zyval, i); test_single_high_level(&gsl_spline2d_eval_deriv_xx,&gsl_spline2d_eval_deriv_xx_e, interp_s, x, y, xa, ya, zxxval, i); test_single_high_level(&gsl_spline2d_eval_deriv_yy,&gsl_spline2d_eval_deriv_yy_e, interp_s, x, y, xa, ya, zyyval, i); test_single_high_level(&gsl_spline2d_eval_deriv_xy,&gsl_spline2d_eval_deriv_xy_e, interp_s, x, y, xa, ya, zxyval, i); test_single_low_level(&gsl_interp2d_eval_extrap, &gsl_interp2d_eval_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.6/interpolation/gsl_interp.h0000644016036000116100000001546113373111455014306 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.6/interpolation/gsl_spline.h0000644016036000116100000000533513135126237014276 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.6/interpolation/gsl_interp2d.h0000644016036000116100000002216013431326247014530 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.6/interpolation/gsl_spline2d.h0000644016036000116100000001100613373111455014514 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_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.6/interpolation/ChangeLog0000644016036000116100000001063513373111455013537 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.6/interpolation/TODO0000644016036000116100000000066413373111455012456 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.6/interpolation/accel.c0000644016036000116100000000271013373111455013173 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.6/interpolation/akima.c0000644016036000116100000002226213373111455013212 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.6/interpolation/cspline.c0000644016036000116100000003046413373111455013570 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.6/interpolation/interp.c0000644016036000116100000001463013373111455013431 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.6/interpolation/linear.c0000644016036000116100000001071613135126237013403 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.6/interpolation/integ_eval.h0000644016036000116100000000254313135126237014252 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.6/interpolation/spline.c0000644016036000116100000001205613373111455013422 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.6/interpolation/poly.c0000644016036000116100000001035513135126237013113 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.6/interpolation/steffen.c0000644016036000116100000002421713373111455013564 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.6/interpolation/inline.c0000644016036000116100000000175713373111455013414 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.6/interpolation/interp2d.c0000644016036000116100000003306213431326204013652 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.6/interpolation/bilinear.c0000644016036000116100000001420613373111455013714 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.6/interpolation/bicubic.c0000644016036000116100000006735713373111455013546 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.6/interpolation/spline2d.c0000644016036000116100000002031013373111455013640 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_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.6/interpolation/test.c0000644016036000116100000011644713373111455013120 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.6/histogram/0000755016036000116100000000000013527016563011153 500000000000000gsl-2.6/histogram/Makefile.in0000644016036000116100000011130313527016362013134 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = histogram DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslhistogram_la_LIBADD = am_libgslhistogram_la_OBJECTS = add.lo get.lo init.lo params.lo \ reset.lo file.lo pdf.lo add2d.lo get2d.lo init2d.lo \ params2d.lo reset2d.lo file2d.lo pdf2d.lo calloc_range.lo \ calloc_range2d.lo copy.lo copy2d.lo maxval.lo maxval2d.lo \ oper.lo oper2d.lo stat.lo stat2d.lo libgslhistogram_la_OBJECTS = $(am_libgslhistogram_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test1d.$(OBJEXT) test2d.$(OBJEXT) \ test1d_resample.$(OBJEXT) test2d_resample.$(OBJEXT) \ test1d_trap.$(OBJEXT) test2d_trap.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslhistogram.la ../block/libgslblock.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../test/libgsltest.la ../sys/libgslsys.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslhistogram_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslhistogram_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslhistogram.la pkginclude_HEADERS = gsl_histogram.h gsl_histogram2d.h AM_CPPFLAGS = -I$(top_srcdir) libgslhistogram_la_SOURCES = add.c get.c init.c params.c reset.c file.c pdf.c gsl_histogram.h add2d.c get2d.c init2d.c params2d.c reset2d.c file2d.c pdf2d.c gsl_histogram2d.h calloc_range.c calloc_range2d.c copy.c copy2d.c maxval.c maxval2d.c oper.c oper2d.c stat.c stat2d.c noinst_HEADERS = urand.c find.c find2d.c TESTS = $(check_PROGRAMS) EXTRA_DIST = urand.c test_SOURCES = test.c test1d.c test2d.c test1d_resample.c test2d_resample.c test1d_trap.c test2d_trap.c test_LDADD = libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la CLEANFILES = test.txt test.dat all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu histogram/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu histogram/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslhistogram.la: $(libgslhistogram_la_OBJECTS) $(libgslhistogram_la_DEPENDENCIES) $(EXTRA_libgslhistogram_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslhistogram_la_OBJECTS) $(libgslhistogram_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calloc_range.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calloc_range2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxval2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/params2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d_resample.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test1d_trap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d_resample.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test2d_trap.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/histogram/Makefile.am0000644016036000116100000000144713373111455013130 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.6/histogram/urand.c0000644016036000116100000000173613135126237012352 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.6/histogram/find.c0000644016036000116100000000361613135126237012160 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.6/histogram/find2d.c0000644016036000116100000000255513135126237012407 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.6/histogram/gsl_histogram.h0000644016036000116100000001005413135126237014101 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.6/histogram/gsl_histogram2d.h0000644016036000116100000001301213135126237014324 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.6/histogram/ChangeLog0000644016036000116100000001172613373111455012647 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.6/histogram/TODO0000644016036000116100000000020713373111455011555 00000000000000# -*- org -*- #+CATEGORY: histogram * Implement N-d histograms (Simone Piccardi is working on something here). gsl-2.6/histogram/add.c0000644016036000116100000000265013135126237011765 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.6/histogram/get.c0000644016036000116100000000331413135126237012012 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.6/histogram/init.c0000644016036000116100000000753513373111455012207 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.6/histogram/params.c0000644016036000116100000000217413135126237012521 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.6/histogram/reset.c0000644016036000116100000000202313135126237012351 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.6/histogram/file.c0000644016036000116100000000565413135126237012163 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.6/histogram/pdf.c0000644016036000116100000000671313373111455012012 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.6/histogram/add2d.c0000644016036000116100000000333013135126237012207 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.6/histogram/get2d.c0000644016036000116100000000472313135126237012245 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.6/histogram/init2d.c0000644016036000116100000001523013373111455012424 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.6/histogram/params2d.c0000644016036000116100000000263513135126237012751 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.6/histogram/reset2d.c0000644016036000116100000000207613135126237012607 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.6/histogram/file2d.c0000644016036000116100000001064413135126237012404 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.6/histogram/pdf2d.c0000644016036000116100000001055013373111455012232 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.6/histogram/calloc_range.c0000644016036000116100000000533313373111455013647 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.6/histogram/calloc_range2d.c0000644016036000116100000000734013373111455014075 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.6/histogram/copy.c0000644016036000116100000000414513373111455012210 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.6/histogram/copy2d.c0000644016036000116100000000447613373111455012445 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.6/histogram/maxval.c0000644016036000116100000000457613373111455012536 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.6/histogram/maxval2d.c0000644016036000116100000000640113373111455012751 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.6/histogram/oper.c0000644016036000116100000000750513373111455012206 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.6/histogram/oper2d.c0000644016036000116100000001025613373111455012431 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.6/histogram/stat.c0000644016036000116100000000621313373111455012207 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.6/histogram/stat2d.c0000644016036000116100000001327213373111455012440 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.6/histogram/test.c0000644016036000116100000000236413135126237012216 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.6/histogram/test1d.c0000644016036000116100000002430513135126237012442 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.6/histogram/test2d.c0000644016036000116100000004355713135126237012455 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.6/histogram/test1d_resample.c0000644016036000116100000000506613135126237014335 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.6/histogram/test2d_resample.c0000644016036000116100000000631313135126237014332 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.6/histogram/test1d_trap.c0000644016036000116100000001017013135126237013463 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.6/histogram/test2d_trap.c0000644016036000116100000001606713135126237013477 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.6/ode-initval/0000755016036000116100000000000013527016563011371 500000000000000gsl-2.6/ode-initval/Makefile.in0000644016036000116100000010677413527016363013373 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = ode-initval DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslodeiv_la_LIBADD = am_libgslodeiv_la_OBJECTS = control.lo cstd.lo cscal.lo evolve.lo \ step.lo rk2.lo rk2imp.lo rk2simp.lo rk4.lo rk4imp.lo rkf45.lo \ rk8pd.lo rkck.lo bsimp.lo gear1.lo gear2.lo libgslodeiv_la_OBJECTS = $(am_libgslodeiv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslodeiv.la ../linalg/libgsllinalg.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslodeiv_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslodeiv_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslodeiv.la pkginclude_HEADERS = gsl_odeiv.h AM_CPPFLAGS = -I$(top_srcdir) libgslodeiv_la_SOURCES = control.c cstd.c cscal.c evolve.c step.c rk2.c rk2imp.c rk2simp.c rk4.c rk4imp.c rkf45.c rk8pd.c rkck.c bsimp.c gear1.c gear2.c noinst_HEADERS = odeiv_util.h TESTS = $(check_PROGRAMS) test_LDADD = libgslodeiv.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ode-initval/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ode-initval/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslodeiv.la: $(libgslodeiv_la_OBJECTS) $(libgslodeiv_la_DEPENDENCIES) $(EXTRA_libgslodeiv_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslodeiv_la_OBJECTS) $(libgslodeiv_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsimp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cstd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gear1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gear2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2simp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk8pd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkf45.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/ode-initval/Makefile.am0000644016036000116100000000132013373111456013335 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.6/ode-initval/odeiv_util.h0000644016036000116100000000021313135126237013614 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.6/ode-initval/gsl_odeiv.h0000644016036000116100000001712013373111456013432 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.6/ode-initval/ChangeLog0000644016036000116100000001316713373111456013067 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.6/ode-initval/TODO0000644016036000116100000000737113373111456012005 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.6/ode-initval/control.c0000644016036000116100000000431613373111456013135 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.6/ode-initval/cstd.c0000644016036000116100000001056713135126237012416 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.6/ode-initval/cscal.c0000644016036000116100000001115713135126237012542 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.6/ode-initval/evolve.c0000644016036000116100000001272113373111456012754 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.6/ode-initval/step.c0000644016036000116100000000415513373111456012431 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.6/ode-initval/rk2.c0000644016036000116100000001216413373111456012153 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.6/ode-initval/rk2imp.c0000644016036000116100000001617013135126237012661 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.6/ode-initval/rk2simp.c0000644016036000116100000002165313373111456013047 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.6/ode-initval/rk4.c0000644016036000116100000001657513373111456012167 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.6/ode-initval/rk4imp.c0000644016036000116100000002147413135126237012666 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.6/ode-initval/rkf45.c0000644016036000116100000002056013135126237012406 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.6/ode-initval/rk8pd.c0000644016036000116100000002742213135126237012507 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.6/ode-initval/rkck.c0000644016036000116100000002046213135126237012406 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.6/ode-initval/bsimp.c0000644016036000116100000003275213135126237012573 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.6/ode-initval/gear1.c0000644016036000116100000001404113135126237012447 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.6/ode-initval/gear2.c0000644016036000116100000002065713373111456012463 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.6/ode-initval/test.c0000644016036000116100000006442613373111456012444 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.6/ode-initval2/0000755016036000116100000000000013527016563011453 500000000000000gsl-2.6/ode-initval2/Makefile.in0000644016036000116100000010724013527016363013442 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = ode-initval2 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslodeiv2_la_LIBADD = am_libgslodeiv2_la_OBJECTS = control.lo cstd.lo cscal.lo evolve.lo \ step.lo rk2.lo rk2imp.lo rk4.lo rk4imp.lo rkf45.lo rk8pd.lo \ rkck.lo bsimp.lo rk1imp.lo msadams.lo msbdf.lo driver.lo libgslodeiv2_la_OBJECTS = $(am_libgslodeiv2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslodeiv2.la ../linalg/libgsllinalg.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslodeiv2_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslodeiv2_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslodeiv2.la pkginclude_HEADERS = gsl_odeiv2.h AM_CPPFLAGS = -I$(top_srcdir) libgslodeiv2_la_SOURCES = control.c cstd.c cscal.c evolve.c step.c rk2.c rk2imp.c rk4.c rk4imp.c rkf45.c rk8pd.c rkck.c bsimp.c rk1imp.c msadams.c msbdf.c driver.c noinst_HEADERS = odeiv_util.h step_utils.c rksubs.c modnewton1.c control_utils.c TESTS = $(check_PROGRAMS) test_LDADD = libgslodeiv2.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../matrix/libgslmatrix.la ../permutation/libgslpermutation.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ode-initval2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ode-initval2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslodeiv2.la: $(libgslodeiv2_la_OBJECTS) $(libgslodeiv2_la_DEPENDENCIES) $(EXTRA_libgslodeiv2_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslodeiv2_la_OBJECTS) $(libgslodeiv2_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsimp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cstd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msadams.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msbdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk1imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk2imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk4imp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk8pd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkf45.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/step.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/ode-initval2/Makefile.am0000644016036000116100000000142113373111456013421 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.6/ode-initval2/odeiv_util.h0000644016036000116100000000136513373111456013710 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.6/ode-initval2/step_utils.c0000644016036000116100000000175013373111456013731 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.6/ode-initval2/rksubs.c0000644016036000116100000000307713373111456013053 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.6/ode-initval2/modnewton1.c0000644016036000116100000002571613373111456013641 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.6/ode-initval2/control_utils.c0000644016036000116100000000176213373111456014441 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. */ return GSL_SUCCESS; } gsl-2.6/ode-initval2/gsl_odeiv2.h0000644016036000116100000003272513373111456013606 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.6/ode-initval2/ChangeLog0000644016036000116100000003177213373111456013153 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.6/ode-initval2/TODO0000644016036000116100000000653713373111456012072 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.6/ode-initval2/control.c0000644016036000116100000000553513373111456013223 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_NULL ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-2.6/ode-initval2/cstd.c0000644016036000116100000001217313373111456012474 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_NULL ("errlev <= zero", GSL_ESANITY); } return GSL_SUCCESS; } static void std_control_free (void *vstate) { std_control_state_t *state = (std_control_state_t *) vstate; free (state); } static const gsl_odeiv2_control_type std_control_type = { "standard", /* name */ &std_control_alloc, &std_control_init, &std_control_hadjust, &std_control_errlevel, &control_set_driver_null, &std_control_free }; const gsl_odeiv2_control_type *gsl_odeiv2_control_standard = &std_control_type; gsl_odeiv2_control * gsl_odeiv2_control_standard_new (double eps_abs, double eps_rel, double a_y, double a_dydt) { gsl_odeiv2_control *c = gsl_odeiv2_control_alloc (gsl_odeiv2_control_standard); int status = gsl_odeiv2_control_init (c, eps_abs, eps_rel, a_y, a_dydt); if (status != GSL_SUCCESS) { gsl_odeiv2_control_free (c); GSL_ERROR_NULL ("error trying to initialize control", status); } return c; } gsl_odeiv2_control * gsl_odeiv2_control_y_new (double eps_abs, double eps_rel) { return gsl_odeiv2_control_standard_new (eps_abs, eps_rel, 1.0, 0.0); } gsl_odeiv2_control * gsl_odeiv2_control_yp_new (double eps_abs, double eps_rel) { return gsl_odeiv2_control_standard_new (eps_abs, eps_rel, 0.0, 1.0); } gsl-2.6/ode-initval2/cscal.c0000644016036000116100000001262613373111456012627 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_NULL ("errlev <= zero", GSL_ESANITY); } return GSL_SUCCESS; } static void sc_control_free (void *vstate) { sc_control_state_t *state = (sc_control_state_t *) vstate; free (state->scale_abs); free (state); } static const gsl_odeiv2_control_type sc_control_type = { "scaled", /* name */ &sc_control_alloc, &sc_control_init, &sc_control_hadjust, &sc_control_errlevel, &control_set_driver_null, &sc_control_free }; const gsl_odeiv2_control_type *gsl_odeiv2_control_scaled = &sc_control_type; gsl_odeiv2_control * gsl_odeiv2_control_scaled_new (double eps_abs, double eps_rel, double a_y, double a_dydt, const double scale_abs[], size_t dim) { gsl_odeiv2_control *c = gsl_odeiv2_control_alloc (gsl_odeiv2_control_scaled); int status = gsl_odeiv2_control_init (c, eps_abs, eps_rel, a_y, a_dydt); if (status != GSL_SUCCESS) { gsl_odeiv2_control_free (c); GSL_ERROR_NULL ("error trying to initialize control", status); } { sc_control_state_t *s = (sc_control_state_t *) c->state; s->scale_abs = (double *) malloc (dim * sizeof (double)); if (s->scale_abs == 0) { free (s); GSL_ERROR_NULL ("failed to allocate space for scale_abs", GSL_ENOMEM); } memcpy (s->scale_abs, scale_abs, dim * sizeof (double)); } return c; } gsl-2.6/ode-initval2/evolve.c0000644016036000116100000002255713373111456013046 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_NULL ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-2.6/ode-initval2/step.c0000644016036000116100000000504413373111456012511 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_NULL ("driver pointer is null", GSL_EFAULT); } return GSL_SUCCESS; } gsl-2.6/ode-initval2/rk2.c0000644016036000116100000001236713373111456012242 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.6/ode-initval2/rk2imp.c0000644016036000116100000003353113373111456012744 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.6/ode-initval2/rk4.c0000644016036000116100000001662213373111456012242 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.6/ode-initval2/rk4imp.c0000644016036000116100000003113013373111456012737 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.6/ode-initval2/rkf45.c0000644016036000116100000002107413373111456012472 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.6/ode-initval2/rk8pd.c0000644016036000116100000002775313373111456012601 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.6/ode-initval2/rkck.c0000644016036000116100000002071313373111456012470 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.6/ode-initval2/bsimp.c0000644016036000116100000003316013373111456012650 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.6/ode-initval2/rk1imp.c0000644016036000116100000002741013373111456012742 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.6/ode-initval2/msadams.c0000644016036000116100000007715713373111456013201 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_NULL ("msadams_apply too large order change", GSL_ESANITY); } /* Modify Nordsieck matrix if order or step length has been changed */ /* If order increased by 1, initialize new Nordsieck vector */ if (deltaord == 1) { DBL_ZERO_MEMSET (&z[ord * dim], dim); #ifdef DEBUG printf ("-- order increase detected, Nordsieck modified\n"); #endif } /* If order decreased by 1, adjust Nordsieck matrix */ if (deltaord == -1) { double hsum = 0.0; size_t i, j; /* Calculate coefficients used in adjustment to l */ DBL_ZERO_MEMSET (l, MSADAMS_MAX_ORD + 1); l[1] = 1.0; for (i = 1; i < ord; i++) { hsum += hprev[i - 1]; for (j = i + 1; j > 0; j--) { l[j] *= hsum / hprev[0]; l[j] += l[j - 1]; } } for (i = 1; i < ord; i++) { l[i + 1] = (ord + 1) * l[i] / (i + 1); } /* Scale Nordsieck matrix */ for (i = 2; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += -l[i] * z[(ord + 1) * dim + j]; } #ifdef DEBUG printf ("-- order decrease detected, Nordsieck modified\n"); #endif } /* Scale Nordsieck vectors if step size has been changed */ if (state->ni > 0 && h != hprev[0]) { size_t i, j; const double hrel = h / hprev[0]; double coeff = hrel; for (i = 1; i < ord + 1; i++) { for (j = 0; j < dim; j++) { z[i * dim + j] *= coeff; } coeff *= hrel; } #ifdef DEBUG printf ("-- h != hprev, Nordsieck modified\n"); #endif } /* Calculate polynomial coefficients (l), error coefficient and auxiliary coefficients */ msadams_calccoeffs (ord, state->ordwait, h, hprev, pc, l, &errcoeff, º1coeff, &ordp1coeff, &ordp2coeff); /* Carry out the prediction step */ { size_t i, j, k; for (i = 1; i < ord + 1; i++) for (j = ord; j > i - 1; j--) for (k = 0; k < dim; k++) { z[(j - 1) * dim + k] += z[j * dim + k]; } #ifdef DEBUG { size_t di; printf ("-- predicted y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif } /* Calculate correction step to abscor */ { int s; s = msadams_corrector (vstate, sys, t, h, dim, z, errlev, l, errcoeff, abscor, relcor, ytmp, ytmp2); if (s != GSL_SUCCESS) { return s; } } { /* Add accepted final correction step to Nordsieck matrix */ size_t i, j; for (i = 0; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += l[i] * gsl_vector_get (abscor, j); } #ifdef DEBUG { size_t di; printf ("-- corrected y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif /* Derivatives at output */ if (dydt_out != NULL) { int s = GSL_ODEIV_FN_EVAL (sys, t + h, z, dydt_out); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msadams_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } /* Calculate error estimate */ for (i = 0; i < dim; i++) { yerr[i] = fabs (gsl_vector_get (abscor, i)) * errcoeff; } #ifdef DEBUG { size_t di; printf ("-- yerr: "); for (di = 0; di < dim; di++) { printf ("%.5e ", yerr[di]); } printf ("\n"); } #endif /* Save y values */ for (i = 0; i < dim; i++) { y[i] = z[0 * dim + i]; } } /* Scale abscor with errlev for later use in norm calculations */ { size_t i; for (i = 0; i < dim; i++) { gsl_vector_set (abscor, i, gsl_vector_get (abscor, i) / errlev[i]); } } /* Save items needed for evaluation of order increase on next call, if needed */ if (state->ordwait == 1 && ord < MSADAMS_MAX_ORD) { size_t i; state->ordp1coeffprev = ordp1coeff; state->ordm1coeff = ordm1coeff; for (i = 0; i < dim; i++) { gsl_vector_set (svec, i, gsl_vector_get (abscor, i)); } } /* Consider and execute order change for next step */ if (state->ordwait == 0) { msadams_eval_order (abscor, tempvec, svec, errcoeff, dim, errlev, state->ordm1coeff, ordp1coeff, state->ordp1coeffprev, ordp2coeff, hprev, h, z, &(state->ord), &(state->ordwait)); } /* Save information about current step in state and update counters */ { size_t i; state->ordprev = ord; for (i = MSADAMS_MAX_ORD - 1; i > 0; i--) { hprev[i] = hprev[i - 1]; } hprev[0] = h; #ifdef DEBUG { size_t di; printf ("-- hprev: "); for (di = 0; di < MSADAMS_MAX_ORD; di++) { printf ("%.5e ", hprev[di]); } printf ("\n"); } #endif state->tprev = t; state->ordwait--; state->ni++; } return GSL_SUCCESS; } static int msadams_set_driver (void *vstate, const gsl_odeiv2_driver * d) { msadams_state_t *state = (msadams_state_t *) vstate; state->driver = d; return GSL_SUCCESS; } static int msadams_reset (void *vstate, size_t dim) { msadams_state_t *state = (msadams_state_t *) vstate; state->ni = 0; state->ord = 1; state->ordprev = 1; state->ordprevbackup = 1; state->ordwait = 2; state->ordwaitbackup = 2; state->failord = 0; state->failt = GSL_NAN; state->failcount = 0; DBL_ZERO_MEMSET (state->hprev, MSADAMS_MAX_ORD); DBL_ZERO_MEMSET (state->z, (MSADAMS_MAX_ORD + 1) * dim); #ifdef DEBUG printf ("-- msadams_reset called\n"); #endif return GSL_SUCCESS; } static unsigned int msadams_order (void *vstate) { msadams_state_t *state = (msadams_state_t *) vstate; return state->ord; } static void msadams_free (void *vstate) { msadams_state_t *state = (msadams_state_t *) vstate; gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); free (state->errlev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->pc); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); } static const gsl_odeiv2_step_type msadams_type = { "msadams", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &msadams_alloc, &msadams_apply, &msadams_set_driver, &msadams_reset, &msadams_order, &msadams_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_msadams = &msadams_type; gsl-2.6/ode-initval2/msbdf.c0000644016036000116100000013104413373111456012631 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_NULL ("msbdf_apply too large order change", GSL_ESANITY); } /* Modify Nordsieck matrix if order or step length has been changed */ /* If order increased by 1, adjust Nordsieck matrix */ if (deltaord == 1) { if (ord > 2) { size_t i, j; double hsum = h; double coeff1 = -1.0; double coeff2 = 1.0; double hrelprev = 1.0; double hrelprod = 1.0; double hrel = 0.0; /* Calculate coefficients used in adjustment to l */ DBL_ZERO_MEMSET (l, MSBDF_MAX_ORD + 1); l[2] = 1.0; for (i = 1; i < ord - 1; i++) { hsum += hprev[i]; hrel = hsum / h; hrelprod *= hrel; coeff1 -= 1.0 / (i + 1); coeff2 += 1.0 / hrel; for (j = i + 2; j > 1; j--) { l[j] *= hrelprev; l[j] += l[j - 1]; } hrelprev = hrel; } /* Scale Nordsieck matrix */ { const double c = (-coeff1 - coeff2) / hrelprod; for (i = 0; i < dim; i++) { z[ord * dim + i] = c * gsl_vector_get (abscor, i); } } for (i = 2; i < ord; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += l[i] * z[ord * dim + j]; } } else { /* zero new vector for order incease from 1 to 2 */ DBL_ZERO_MEMSET (&z[ord * dim], dim); } #ifdef DEBUG printf ("-- order increase detected, Nordsieck modified\n"); #endif } /* If order decreased by 1, adjust Nordsieck matrix */ if (deltaord == -1) { size_t i, j; double hsum = 0.0; /* Calculate coefficients used in adjustment to l */ DBL_ZERO_MEMSET (l, MSBDF_MAX_ORD + 1); l[2] = 1.0; for (i = 1; i < ord; i++) { hsum += hprev[i - 1]; for (j = i + 2; j > 1; j--) { l[j] *= hsum / h; l[j] += l[j - 1]; } } /* Scale Nordsieck matrix */ for (i = 2; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += -l[i] * z[(ord + 1) * dim + j]; } #ifdef DEBUG printf ("-- order decrease detected, Nordsieck modified\n"); #endif } /* Scale Nordsieck vectors if step size has been changed */ if (state->ni > 0 && h != hprev[0]) { size_t i, j; const double hrel = h / hprev[0]; double coeff = hrel; for (i = 1; i < ord + 1; i++) { for (j = 0; j < dim; j++) { z[i * dim + j] *= coeff; } coeff *= hrel; } #ifdef DEBUG printf ("-- h != hprev, Nordsieck modified\n"); #endif } /* Calculate polynomial coefficients (l), error coefficient and auxiliary coefficients */ msbdf_calccoeffs (ord, state->ordwait, h, hprev, l, &errcoeff, º1coeff, &ordp1coeff, &ordp2coeff, &gamma); /* Carry out the prediction step */ { size_t i, j, k; for (i = 1; i < ord + 1; i++) for (j = ord; j > i - 1; j--) for (k = 0; k < dim; k++) { z[(j - 1) * dim + k] += z[j * dim + k]; } #ifdef DEBUG { size_t di; printf ("-- predicted y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif } /* Calculate correction step to abscor */ { int s; s = msbdf_corrector (vstate, sys, t, h, dim, z, errlev, l, errcoeff, abscor, relcor, ytmp, ytmp2, state->dfdy, state->dfdt, state->M, state->p, state->rhs, &(state->nJ), &(state->nM), state->tprev, state->failt, gamma, state->gammaprev, hprev[0]); if (s != GSL_SUCCESS) { return s; } } { /* Add accepted final correction step to Nordsieck matrix */ size_t i, j; for (i = 0; i < ord + 1; i++) for (j = 0; j < dim; j++) { z[i * dim + j] += l[i] * gsl_vector_get (abscor, j); } #ifdef DEBUG { size_t di; printf ("---- l: "); for (di = 0; di < ord + 1; di++) { printf ("%.5e ", l[di]); } printf ("\n"); printf ("-- corrected y: "); for (di = 0; di < dim; di++) { printf ("%.5e ", z[di]); } printf ("\n"); } #endif /* Derivatives at output */ if (dydt_out != NULL) { int s = GSL_ODEIV_FN_EVAL (sys, t + h, z, dydt_out); if (s == GSL_EBADFUNC) { return s; } if (s != GSL_SUCCESS) { msbdf_failurehandler (vstate, dim, t); #ifdef DEBUG printf ("-- FAIL at user function evaluation\n"); #endif return s; } } /* Calculate error estimate */ for (i = 0; i < dim; i++) { yerr[i] = fabs (gsl_vector_get (abscor, i)) * errcoeff; } #ifdef DEBUG { size_t di; printf ("-- yerr: "); for (di = 0; di < dim; di++) { printf ("%.5e ", yerr[di]); } printf ("\n"); } #endif /* Save y values */ for (i = 0; i < dim; i++) { y[i] = z[0 * dim + i]; } } /* Scale abscor with errlev for later use in norm calculations in order evaluation in msbdf_eval_order */ { size_t i; for (i = 0; i < dim; i++) { gsl_vector_set (abscorscaled, i, gsl_vector_get (abscor, i) / errlev[i]); } } /* Save items needed for evaluation of order increase on next call, if needed */ if (state->ordwait == 1 && ord < MSBDF_MAX_ORD) { size_t i; state->ordp1coeffprev = ordp1coeff; for (i = 0; i < dim; i++) { gsl_vector_set (svec, i, gsl_vector_get (abscorscaled, i)); } } /* Consider and execute order change for next step if order is unchanged. */ if (state->ordwait == 0) { if (ord - ordprev[0] == 0) { msbdf_eval_order (abscorscaled, tempvec, svec, errcoeff, dim, errlev, ordm1coeff, ordp1coeff, state->ordp1coeffprev, ordp2coeff, hprev, h, z, &(state->ord)); state->ordwait = state->ord + 2; } else { /* Postpone order evaluation if order has been modified elsewhere */ state->ordwait = 2; } } /* Save information about current step in state and update counters */ { size_t i; for (i = MSBDF_MAX_ORD - 1; i > 0; i--) { hprev[i] = hprev[i - 1]; ordprev[i] = ordprev[i - 1]; } } hprev[0] = h; ordprev[0] = ord; #ifdef DEBUG { size_t di; printf ("-- hprev: "); for (di = 0; di < MSBDF_MAX_ORD; di++) { printf ("%.5e ", hprev[di]); } printf ("\n"); } #endif state->tprev = t; state->ordwait--; state->ni++; state->gammaprev = gamma; state->nJ++; state->nM++; #ifdef DEBUG printf ("-- nJ=%d, nM=%d\n", (int) state->nJ, (int) state->nM); #endif } return GSL_SUCCESS; } static int msbdf_set_driver (void *vstate, const gsl_odeiv2_driver * d) { msbdf_state_t *state = (msbdf_state_t *) vstate; state->driver = d; return GSL_SUCCESS; } static int msbdf_reset (void *vstate, size_t dim) { msbdf_state_t *state = (msbdf_state_t *) vstate; size_t i; state->ni = 0; state->ord = 1; state->ordwait = 2; state->ordwaitbackup = 2; state->failord = 0; state->failt = GSL_NAN; state->tprev = GSL_NAN; state->gammaprev = 1.0; state->gammaprevbackup = 1.0; state->nJ = 0; state->nM = 0; state->failcount = 0; state->ordp1coeffprev = 0.0; DBL_ZERO_MEMSET (state->hprev, MSBDF_MAX_ORD); DBL_ZERO_MEMSET (state->hprevbackup, MSBDF_MAX_ORD); DBL_ZERO_MEMSET (state->z, (MSBDF_MAX_ORD + 1) * dim); DBL_ZERO_MEMSET (state->zbackup, (MSBDF_MAX_ORD + 1) * dim); for (i = 0; i < MSBDF_MAX_ORD; i++) { state->ordprev[i] = 1; state->ordprevbackup[i] = 1; } #ifdef DEBUG printf ("-- msbdf_reset called\n"); #endif return GSL_SUCCESS; } static unsigned int msbdf_order (void *vstate) { msbdf_state_t *state = (msbdf_state_t *) vstate; return state->ord; } static void msbdf_free (void *vstate) { msbdf_state_t *state = (msbdf_state_t *) vstate; gsl_vector_free (state->rhs); gsl_permutation_free (state->p); gsl_matrix_free (state->M); free (state->dfdt); gsl_matrix_free (state->dfdy); gsl_vector_free (state->tempvec); gsl_vector_free (state->svec); gsl_vector_free (state->relcor); gsl_vector_free (state->abscor); gsl_vector_free (state->abscorscaled); free (state->errlev); free (state->ordprevbackup); free (state->ordprev); free (state->hprevbackup); free (state->hprev); free (state->l); free (state->ytmp2); free (state->ytmp); free (state->zbackup); free (state->z); free (state); } static const gsl_odeiv2_step_type msbdf_type = { "msbdf", /* name */ 1, /* can use dydt_in? */ 1, /* gives exact dydt_out? */ &msbdf_alloc, &msbdf_apply, &msbdf_set_driver, &msbdf_reset, &msbdf_order, &msbdf_free }; const gsl_odeiv2_step_type *gsl_odeiv2_step_msbdf = &msbdf_type; gsl-2.6/ode-initval2/driver.c0000644016036000116100000003003413373111456013026 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_NULL ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } d->hmin = fabs (hmin); return GSL_SUCCESS; } int gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver * d, const double hmax) { /* Sets maximum allowed step size fabs(hmax) for driver. It is required that hmin <= fabs(h) <= hmax. */ if ((fabs (hmax) < fabs (d->h)) || (fabs (hmax) < d->hmin)) { GSL_ERROR_NULL ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } if (hmax > 0.0 || hmax < 0.0) { d->hmax = fabs (hmax); } else { GSL_ERROR_NULL ("invalid hmax", GSL_EINVAL); } return GSL_SUCCESS; } int gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver * d, const unsigned long int nmax) { /* Sets maximum number of allowed steps (nmax) for driver */ d->nmax = nmax; return GSL_SUCCESS; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_y_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel) { /* Initializes an ODE driver system with control object of type y_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_y_new (epsabs, epsrel); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel) { /* Initializes an ODE driver system with control object of type yp_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_yp_new (epsabs, epsrel); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_standard_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt) { /* Initializes an ODE driver system with control object of type standard_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_standard_new (epsabs, epsrel, a_y, a_dydt); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_scaled_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt, const double scale_abs[]) { /* Initializes an ODE driver system with control object of type scaled_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_scaled_new (epsabs, epsrel, a_y, a_dydt, scale_abs, sys->dimension); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; } int gsl_odeiv2_driver_apply (gsl_odeiv2_driver * d, double *t, const double t1, double y[]) { /* Main driver function that evolves the system from t to t1. In beginning vector y contains the values of dependent variables at t. This function returns values at t=t1 in y. In case of unrecoverable error, y and t contains the values after the last successful step. */ int sign = 0; d->n = 0; /* Determine integration direction sign */ if (d->h > 0.0) { sign = 1; } else { sign = -1; } /* Check that t, t1 and step direction are sensible */ if (sign * (t1 - *t) < 0.0) { GSL_ERROR_NULL ("integration limits and/or step direction not consistent", GSL_EINVAL); } /* Evolution loop */ while (sign * (t1 - *t) > 0.0) { int s = gsl_odeiv2_evolve_apply (d->e, d->c, d->s, d->sys, t, t1, &(d->h), y); if (s != GSL_SUCCESS) { return s; } /* Check for maximum allowed steps */ if ((d->nmax > 0) && (d->n > d->nmax)) { return GSL_EMAXITER; } /* Set step size if maximum size is exceeded */ if (fabs (d->h) > d->hmax) { d->h = sign * d->hmax; } /* Check for too small step size */ if (fabs (d->h) < d->hmin) { return GSL_ENOPROG; } d->n++; } return GSL_SUCCESS; } int gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver * d, double *t, const double h, const unsigned long int n, double y[]) { /* Alternative driver function that evolves the system from t using * n steps of size h. In the beginning vector y contains the values * of dependent variables at t. This function returns values at t = * t + n * h in y. In case of an unrecoverable error, y and t * contains the values after the last successful step. */ unsigned long int i; d->n = 0; /* Evolution loop */ for (i = 0; i < n; i++) { int s = gsl_odeiv2_evolve_apply_fixed_step (d->e, d->c, d->s, d->sys, t, h, y); if (s != GSL_SUCCESS) { return s; } d->n++; } return GSL_SUCCESS; } int gsl_odeiv2_driver_reset (gsl_odeiv2_driver * d) { /* Reset the driver. Resets evolve and step objects. */ { int s = gsl_odeiv2_evolve_reset (d->e); if (s != GSL_SUCCESS) { return s; } } { int s = gsl_odeiv2_step_reset (d->s); if (s != GSL_SUCCESS) { return s; } } return GSL_SUCCESS; } int gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver * d, const double hstart) { /* Resets current driver and sets initial step size to hstart */ gsl_odeiv2_driver_reset (d); if ((d->hmin > fabs (hstart)) || (fabs (hstart) > d->hmax)) { GSL_ERROR_NULL ("hmin <= fabs(h) <= hmax required", GSL_EINVAL); } if (hstart > 0.0 || hstart < 0.0) { d->h = hstart; } else { GSL_ERROR_NULL ("invalid hstart", GSL_EINVAL); } return GSL_SUCCESS; } void gsl_odeiv2_driver_free (gsl_odeiv2_driver * state) { if (state->c) gsl_odeiv2_control_free (state->c); if (state->e) gsl_odeiv2_evolve_free (state->e); if (state->s) gsl_odeiv2_step_free (state->s); free (state); } gsl-2.6/ode-initval2/test.c0000644016036000116100000016524013373111456012522 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.6/roots/0000755016036000116100000000000013527016563010324 500000000000000gsl-2.6/roots/Makefile.in0000644016036000116100000010524413527016364012316 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = roots DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslroots_la_LIBADD = am_libgslroots_la_OBJECTS = bisection.lo brent.lo falsepos.lo \ newton.lo secant.lo steffenson.lo convergence.lo fsolver.lo \ fdfsolver.lo libgslroots_la_OBJECTS = $(am_libgslroots_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslroots.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslroots_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslroots_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslroots.la pkginclude_HEADERS = gsl_roots.h noinst_HEADERS = roots.h AM_CPPFLAGS = -I$(top_srcdir) libgslroots_la_SOURCES = bisection.c brent.c falsepos.c newton.c secant.c steffenson.c convergence.c fsolver.c fdfsolver.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_funcs.c test.h test_LDADD = libgslroots.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu roots/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu roots/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslroots.la: $(libgslroots_la_OBJECTS) $(libgslroots_la_DEPENDENCIES) $(EXTRA_libgslroots_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslroots_la_OBJECTS) $(libgslroots_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bisection.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/falsepos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secant.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steffenson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/roots/Makefile.am0000644016036000116100000000077713373111456012307 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.6/roots/roots.h0000644016036000116100000000240313135126237011555 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.6/roots/gsl_roots.h0000644016036000116100000000722013135126237012424 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.6/roots/ChangeLog0000644016036000116100000001335713373111456012023 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.6/roots/TODO0000644016036000116100000000064413373111456010734 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.6/roots/bisection.c0000644016036000116100000000660113135126237012365 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.6/roots/brent.c0000644016036000116100000001146513135126237011524 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.6/roots/falsepos.c0000644016036000116100000001106113135126237012216 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.6/roots/newton.c0000644016036000116100000000505413135126237011721 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.6/roots/secant.c0000644016036000116100000000560613373111456011670 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.6/roots/steffenson.c0000644016036000116100000000673013135126237012563 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.6/roots/convergence.c0000644016036000116100000000447013135126237012706 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.6/roots/fsolver.c0000644016036000116100000000512313373111456012065 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.6/roots/fdfsolver.c0000644016036000116100000000416413373111456012403 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.6/roots/test.c0000644016036000116100000002346513373111456011375 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.6/roots/test_funcs.c0000644016036000116100000001044713373111456012567 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.6/roots/test.h0000644016036000116100000000620113373111456011367 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.6/multiroots/0000755016036000116100000000000013527016563011377 500000000000000gsl-2.6/multiroots/Makefile.in0000644016036000116100000010642013527016363013365 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multiroots DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultiroots_la_LIBADD = am_libgslmultiroots_la_OBJECTS = fdjac.lo fsolver.lo fdfsolver.lo \ convergence.lo newton.lo gnewton.lo dnewton.lo broyden.lo \ hybrid.lo hybridj.lo libgslmultiroots_la_OBJECTS = $(am_libgslmultiroots_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultiroots.la ../linalg/libgsllinalg.la \ ../blas/libgslblas.la ../cblas/libgslcblas.la \ ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultiroots_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultiroots_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultiroots.la pkginclude_HEADERS = gsl_multiroots.h noinst_HEADERS = enorm.c dogleg.c AM_CPPFLAGS = -I$(top_srcdir) libgslmultiroots_la_SOURCES = fdjac.c fsolver.c fdfsolver.c convergence.c newton.c gnewton.c dnewton.c broyden.c hybrid.c hybridj.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_funcs.c test_funcs.h test_LDADD = libgslmultiroots.la ../linalg/libgsllinalg.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multiroots/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multiroots/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultiroots.la: $(libgslmultiroots_la_OBJECTS) $(libgslmultiroots_la_DEPENDENCIES) $(EXTRA_libgslmultiroots_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultiroots_la_OBJECTS) $(libgslmultiroots_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/broyden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnewton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdjac.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnewton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hybridj.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multiroots/Makefile.am0000644016036000116100000000137113373111456013351 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.6/multiroots/enorm.c0000644016036000116100000000205313135126237012576 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.6/multiroots/dogleg.c0000644016036000116100000002255213135126237012725 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.6/multiroots/gsl_multiroots.h0000644016036000116100000001401013135126237014545 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.6/multiroots/ChangeLog0000644016036000116100000001034213373111456013065 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.6/multiroots/fdjac.c0000644016036000116100000000561213135126237012531 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.6/multiroots/fsolver.c0000644016036000116100000000754113373111456013146 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.6/multiroots/fdfsolver.c0000644016036000116100000001027213373111456013453 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.6/multiroots/convergence.c0000644016036000116100000000400113373111456013750 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.6/multiroots/newton.c0000644016036000116100000000727213373111456013001 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.6/multiroots/gnewton.c0000644016036000116100000001206113373111456013140 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.6/multiroots/dnewton.c0000644016036000116100000001047613135126237013144 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.6/multiroots/broyden.c0000644016036000116100000002331513135126237013124 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.6/multiroots/hybrid.c0000644016036000116100000003512413373111456012745 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.6/multiroots/hybridj.c0000644016036000116100000003364513373111456013125 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.6/multiroots/test.c0000644016036000116100000001560613135126237012445 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.6/multiroots/test_funcs.c0000644016036000116100000003755713135126237013654 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.6/multiroots/test_funcs.h0000644016036000116100000000705513135126237013647 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.6/min/0000755016036000116100000000000013527016563007741 500000000000000gsl-2.6/min/Makefile.in0000644016036000116100000010450613527016362011731 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = min DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmin_la_LIBADD = am_libgslmin_la_OBJECTS = fsolver.lo golden.lo brent.lo convergence.lo \ bracketing.lo quad_golden.lo libgslmin_la_OBJECTS = $(am_libgslmin_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmin.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la \ ../sys/libgslsys.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmin_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmin_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmin.la pkginclude_HEADERS = gsl_min.h noinst_HEADERS = min.h AM_CPPFLAGS = -I$(top_srcdir) libgslmin_la_SOURCES = fsolver.c golden.c brent.c convergence.c bracketing.c quad_golden.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_funcs.c test.h test_LDADD = libgslmin.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la ../sys/libgslsys.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu min/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu min/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmin.la: $(libgslmin_la_OBJECTS) $(libgslmin_la_DEPENDENCIES) $(EXTRA_libgslmin_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmin_la_OBJECTS) $(libgslmin_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bracketing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsolver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quad_golden.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/min/Makefile.am0000644016036000116100000000070113373111455011706 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.6/min/min.h0000644016036000116100000000174313135126237010615 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.6/min/gsl_min.h0000644016036000116100000000770713373111455011470 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.6/min/ChangeLog0000644016036000116100000000602113373111455011425 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.6/min/fsolver.c0000644016036000116100000001165013373111455011503 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.6/min/golden.c0000644016036000116100000000655513135126237011303 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.6/min/brent.c0000644016036000116100000001162213373111455011134 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.6/min/convergence.c0000644016036000116100000000332413135126237012320 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.6/min/bracketing.c0000644016036000116100000000775113135126237012143 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.6/min/quad_golden.c0000644016036000116100000002656713373111455012322 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.6/min/test.c0000644016036000116100000001443613373111455011007 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.6/min/test_funcs.c0000644016036000116100000000354513135126237012204 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.6/min/test.h0000644016036000116100000000306213135126237011005 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.6/multimin/0000755016036000116100000000000013527016563011014 500000000000000gsl-2.6/multimin/Makefile.in0000644016036000116100000010762713527016363013014 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = multimin DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmultimin_la_LIBADD = am_libgslmultimin_la_OBJECTS = fdfminimizer.lo steepest_descent.lo \ conjugate_fr.lo conjugate_pr.lo convergence.lo diff.lo \ vector_bfgs.lo vector_bfgs2.lo fminimizer.lo simplex.lo \ simplex2.lo libgslmultimin_la_OBJECTS = $(am_libgslmultimin_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_funcs.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmultimin.la ../min/libgslmin.la \ ../poly/libgslpoly.la ../blas/libgslblas.la \ ../cblas/libgslcblas.la ../linalg/libgsllinalg.la \ ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la \ ../vector/libgslvector.la ../block/libgslblock.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmultimin_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmultimin_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmultimin.la pkginclude_HEADERS = gsl_multimin.h AM_CPPFLAGS = -I$(top_srcdir) libgslmultimin_la_SOURCES = fdfminimizer.c steepest_descent.c conjugate_fr.c conjugate_pr.c convergence.c diff.c vector_bfgs.c vector_bfgs2.c fminimizer.c simplex.c simplex2.c noinst_HEADERS = directional_minimize.c linear_minimize.c linear_wrapper.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_funcs.c test_funcs.h test_LDADD = libgslmultimin.la ../min/libgslmin.la ../poly/libgslpoly.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu multimin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu multimin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmultimin.la: $(libgslmultimin_la_OBJECTS) $(libgslmultimin_la_DEPENDENCIES) $(EXTRA_libgslmultimin_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmultimin_la_OBJECTS) $(libgslmultimin_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conjugate_fr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conjugate_pr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convergence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdfminimizer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fminimizer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplex2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/steepest_descent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_funcs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_bfgs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_bfgs2.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #demo_SOURCES = demo.c #demo_LDADD = libgslmultimin.la ../min/libgslmin.la ../blas/libgslblas.la ../cblas/libgslcblas.la ../linalg/libgsllinalg.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/multimin/Makefile.am0000644016036000116100000000232613373111456012767 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.6/multimin/directional_minimize.c0000644016036000116100000001325313373111456015276 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.6/multimin/linear_minimize.c0000644016036000116100000001415013135126237014247 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.6/multimin/linear_wrapper.c0000644016036000116100000000773413135126237014120 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.6/multimin/gsl_multimin.h0000644016036000116100000001521313373111456013606 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.6/multimin/ChangeLog0000644016036000116100000001330313373111456012502 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.6/multimin/TODO0000644016036000116100000000033613373111456011422 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.6/multimin/fdfminimizer.c0000644016036000116100000001014213373111456013555 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.6/multimin/steepest_descent.c0000644016036000116100000001015513373111456014437 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.6/multimin/conjugate_fr.c0000644016036000116100000001474013135126237013547 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.6/multimin/conjugate_pr.c0000644016036000116100000001523013135126237013554 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.6/multimin/convergence.c0000644016036000116100000000264613135126237013401 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.6/multimin/diff.c0000644016036000116100000000305613135126237012007 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.6/multimin/vector_bfgs.c0000644016036000116100000002074113135126237013402 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.6/multimin/vector_bfgs2.c0000644016036000116100000002033613373111456013465 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.6/multimin/fminimizer.c0000644016036000116100000000626013373111456013251 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.6/multimin/simplex.c0000644016036000116100000002605713373111456012567 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.6/multimin/simplex2.c0000644016036000116100000004142413373111456012644 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.6/multimin/test.c0000644016036000116100000001372013373111456012056 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.6/multimin/test_funcs.c0000644016036000116100000001713413373111456013257 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.6/multimin/test_funcs.h0000644016036000116100000000574513373111456013271 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.6/monte/0000755016036000116100000000000013527016563010300 500000000000000gsl-2.6/monte/Makefile.in0000644016036000116100000010442313527016362012266 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = monte DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog README TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslmonte_la_LIBADD = am_libgslmonte_la_OBJECTS = miser.lo plain.lo vegas.lo libgslmonte_la_OBJECTS = $(am_libgslmonte_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslmonte.la ../rng/libgslrng.la \ ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la \ ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslmonte_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslmonte_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslmonte.la libgslmonte_la_SOURCES = miser.c plain.c gsl_monte_vegas.h gsl_monte_miser.h gsl_monte_plain.h gsl_monte.h vegas.c pkginclude_HEADERS = gsl_monte.h gsl_monte_vegas.h gsl_monte_miser.h gsl_monte_plain.h AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslmonte.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la noinst_HEADERS = test_main.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu monte/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu monte/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslmonte.la: $(libgslmonte_la_OBJECTS) $(libgslmonte_la_DEPENDENCIES) $(EXTRA_libgslmonte_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslmonte_la_OBJECTS) $(libgslmonte_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vegas.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #demo_SOURCES= demo.c #demo_LDADD = libgslmonte.la ../rng/libgslrng.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../utils/libutils.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/monte/Makefile.am0000644016036000116100000000131613373111455012250 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.6/monte/test_main.c0000644016036000116100000000277413373111455012354 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.6/monte/gsl_monte.h0000644016036000116100000000310113135126237012346 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__ #undef __BEGIN_DECLS #undef __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.6/monte/gsl_monte_vegas.h0000644016036000116100000000624213373111455013544 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.6/monte/gsl_monte_miser.h0000644016036000116100000000514613373111455013560 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.6/monte/gsl_monte_plain.h0000644016036000116100000000353413135126237013543 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.6/monte/ChangeLog0000644016036000116100000001625113373111455011772 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.6/monte/README0000644016036000116100000000302113135126237011067 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.6/monte/TODO0000644016036000116100000000230313373111455010701 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.6/monte/miser.c0000644016036000116100000004201613373111455011501 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.6/monte/plain.c0000644016036000116100000000656113373111455011472 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.6/monte/vegas.c0000644016036000116100000005507013373111455011473 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.6/monte/test.c0000644016036000116100000004010413373111455011335 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.6/ntuple/0000755016036000116100000000000013527016563010465 500000000000000gsl-2.6/ntuple/Makefile.in0000644016036000116100000010454213527016363012456 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = ntuple DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslntuple_la_LIBADD = am_libgslntuple_la_OBJECTS = ntuple.lo libgslntuple_la_OBJECTS = $(am_libgslntuple_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslntuple.la ../histogram/libgslhistogram.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslntuple_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslntuple_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslntuple.la pkginclude_HEADERS = gsl_ntuple.h AM_CPPFLAGS = -I$(top_srcdir) libgslntuple_la_SOURCES = ntuple.c TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la #demo_SOURCES = demo.c #demo_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la #demo1_SOURCES = demo1.c #demo1_LDADD = libgslntuple.la ../histogram/libgslhistogram.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la CLEANFILES = test.dat all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ntuple/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ntuple/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslntuple.la: $(libgslntuple_la_OBJECTS) $(libgslntuple_la_DEPENDENCIES) $(EXTRA_libgslntuple_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslntuple_la_OBJECTS) $(libgslntuple_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntuple.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/ntuple/Makefile.am0000644016036000116100000000160713373111456012441 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.6/ntuple/gsl_ntuple.h0000644016036000116100000000414513135126237012731 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.6/ntuple/ChangeLog0000644016036000116100000000042013373111456012147 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.6/ntuple/ntuple.c0000644016036000116100000001047113135126237012056 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.6/ntuple/test.c0000644016036000116100000000677013373111456011536 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.6/diff/0000755016036000116100000000000013527016564010067 500000000000000gsl-2.6/diff/Makefile.in0000644016036000116100000010362613527016361012057 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = diff DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgsldiff_la_LIBADD = am_libgsldiff_la_OBJECTS = diff.lo libgsldiff_la_OBJECTS = $(am_libgsldiff_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgsldiff.la ../vector/libgslvector.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsldiff_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgsldiff_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgsldiff.la AM_CPPFLAGS = -I$(top_srcdir) libgsldiff_la_SOURCES = diff.c pkginclude_HEADERS = gsl_diff.h TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgsldiff.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu diff/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu diff/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgsldiff.la: $(libgsldiff_la_OBJECTS) $(libgsldiff_la_DEPENDENCIES) $(EXTRA_libgsldiff_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgsldiff_la_OBJECTS) $(libgsldiff_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #demo_SOURCES = demo.c #demo_LDADD = libgsldiff.la ../vector/libgslvector.la ../block/libgslblock.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/diff/Makefile.am0000644016036000116100000000104713373111454012036 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.6/diff/gsl_diff.h0000644016036000116100000000302613373111454011727 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.6/diff/ChangeLog0000644016036000116100000000126313373111454011554 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.6/diff/diff.c0000644016036000116100000001130113373111454011050 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.6/diff/test.c0000644016036000116100000001025513373111454011126 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.6/deriv/0000755016036000116100000000000013527016564010270 500000000000000gsl-2.6/deriv/Makefile.in0000644016036000116100000010365613527016361012263 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = deriv DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslderiv_la_LIBADD = am_libgslderiv_la_OBJECTS = deriv.lo libgslderiv_la_OBJECTS = $(am_libgslderiv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslderiv.la ../vector/libgslvector.la \ ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslderiv_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslderiv_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslderiv.la AM_CPPFLAGS = -I$(top_srcdir) libgslderiv_la_SOURCES = deriv.c pkginclude_HEADERS = gsl_deriv.h TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslderiv.la ../vector/libgslvector.la ../block/libgslblock.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu deriv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu deriv/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslderiv.la: $(libgslderiv_la_OBJECTS) $(libgslderiv_la_DEPENDENCIES) $(EXTRA_libgslderiv_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslderiv_la_OBJECTS) $(libgslderiv_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS #demo_SOURCES = demo.c #demo_LDADD = libgslderiv.la ../vector/libgslvector.la ../block/libgslblock.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/deriv/Makefile.am0000644016036000116100000000105513373111454012236 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.6/deriv/gsl_deriv.h0000644016036000116100000000303413135126237012331 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.6/deriv/ChangeLog0000644016036000116100000000056513373111454011761 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.6/deriv/deriv.c0000644016036000116100000001343013135126237011460 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.6/deriv/test.c0000644016036000116100000001105613135126237011330 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.6/cdf/0000755016036000116100000000000013527016564007713 500000000000000gsl-2.6/cdf/Makefile.in0000644016036000116100000011340513527016361011677 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = cdf DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslcdf_la_LIBADD = am_libgslcdf_la_OBJECTS = beta.lo betainv.lo cauchy.lo cauchyinv.lo \ chisq.lo chisqinv.lo exponential.lo exponentialinv.lo \ exppow.lo fdist.lo fdistinv.lo flat.lo flatinv.lo gamma.lo \ gammainv.lo gauss.lo gaussinv.lo gumbel1.lo gumbel1inv.lo \ gumbel2.lo gumbel2inv.lo laplace.lo laplaceinv.lo logistic.lo \ logisticinv.lo lognormal.lo lognormalinv.lo pareto.lo \ paretoinv.lo rayleigh.lo rayleighinv.lo tdist.lo tdistinv.lo \ weibull.lo weibullinv.lo binomial.lo poisson.lo geometric.lo \ nbinomial.lo pascal.lo hypergeometric.lo libgslcdf_la_OBJECTS = $(am_libgslcdf_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslcdf.la ../randist/libgslrandist.la \ ../rng/libgslrng.la ../specfunc/libgslspecfunc.la \ ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslcdf_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslcdf_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslcdf.la pkginclude_HEADERS = gsl_cdf.h AM_CPPFLAGS = -I$(top_srcdir) libgslcdf_la_SOURCES = beta.c betainv.c cauchy.c cauchyinv.c chisq.c chisqinv.c exponential.c exponentialinv.c exppow.c fdist.c fdistinv.c flat.c flatinv.c gamma.c gammainv.c gauss.c gaussinv.c gumbel1.c gumbel1inv.c gumbel2.c gumbel2inv.c laplace.c laplaceinv.c logistic.c logisticinv.c lognormal.c lognormalinv.c pareto.c paretoinv.c rayleigh.c rayleighinv.c tdist.c tdistinv.c weibull.c weibullinv.c binomial.c poisson.c geometric.c nbinomial.c pascal.c hypergeometric.c noinst_HEADERS = beta_inc.c rat_eval.h test_auto.c error.h TESTS = $(check_PROGRAMS) test_SOURCES = test.c test_LDADD = libgslcdf.la ../randist/libgslrandist.la ../rng/libgslrng.la ../specfunc/libgslspecfunc.la ../complex/libgslcomplex.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cdf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu cdf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslcdf.la: $(libgslcdf_la_OBJECTS) $(libgslcdf_la_DEPENDENCIES) $(EXTRA_libgslcdf_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslcdf_la_OBJECTS) $(libgslcdf_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/beta.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/betainv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cauchyinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chisqinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponential.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exponentialinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exppow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdistinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flatinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gammainv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gauss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaussinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometric.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel1inv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gumbel2inv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hypergeometric.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laplaceinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logistic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logisticinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormalinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nbinomial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pareto.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paretoinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pascal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poisson.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleigh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rayleighinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdistinv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibull.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weibullinv.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/cdf/Makefile.am0000644016036000116100000000176313373111454011667 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.6/cdf/beta_inc.c0000644016036000116100000001204213373111454011533 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.6/cdf/rat_eval.h0000644016036000116100000000055413135126237011577 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.6/cdf/test_auto.c0000644016036000116100000036201013135126237012002 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.6/cdf/error.h0000644016036000116100000000021413135126237011124 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.6/cdf/gsl_cdf.h0000644016036000116100000001631513373111454011404 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.6/cdf/ChangeLog0000644016036000116100000000773513373111454011412 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.6/cdf/TODO0000644016036000116100000000257413373111454010324 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.6/cdf/beta.c0000644016036000116100000000260713373111454010710 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.6/cdf/betainv.c0000644016036000116100000001126413373111454011424 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.6/cdf/cauchy.c0000644016036000116100000000243613135126237011252 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.6/cdf/cauchyinv.c0000644016036000116100000000275413135126237011772 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.6/cdf/chisq.c0000644016036000116100000000206513373111454011102 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.6/cdf/chisqinv.c0000644016036000116100000000210013373111454011605 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.6/cdf/exponential.c0000644016036000116100000000250113135126237012315 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.6/cdf/exponentialinv.c0000644016036000116100000000213113135126237013031 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.6/cdf/exppow.c0000644016036000116100000000345113135126237011316 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.6/cdf/fdist.c0000644016036000116100000000340613373111454011104 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.6/cdf/fdistinv.c0000644016036000116100000000431713373111454011623 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.6/cdf/flat.c0000644016036000116100000000245613135126237010726 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.6/cdf/flatinv.c0000644016036000116100000000240713135126237011437 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.6/cdf/gamma.c0000644016036000116100000000276113373111454011060 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.6/cdf/gammainv.c0000644016036000116100000001055013373111454011570 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.6/cdf/gauss.c0000644016036000116100000001577013373111454011124 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.6/cdf/gaussinv.c0000644016036000116100000001004613373111454011630 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.6/cdf/gumbel1.c0000644016036000116100000000241613373111454011327 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.6/cdf/gumbel1inv.c0000644016036000116100000000254513135126237012050 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.6/cdf/gumbel2.c0000644016036000116100000000244213135126237011330 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.6/cdf/gumbel2inv.c0000644016036000116100000000253513135126237012050 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.6/cdf/laplace.c0000644016036000116100000000242513135126237011375 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.6/cdf/laplaceinv.c0000644016036000116100000000272013135126237012110 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.6/cdf/logistic.c0000644016036000116100000000245113135126237011610 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.6/cdf/logisticinv.c0000644016036000116100000000247513135126237012333 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.6/cdf/lognormal.c0000644016036000116100000000232313135126237011763 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.6/cdf/lognormalinv.c0000644016036000116100000000267013135126237012505 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.6/cdf/pareto.c0000644016036000116100000000234313135126237011265 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.6/cdf/paretoinv.c0000644016036000116100000000251613135126237012004 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.6/cdf/rayleigh.c0000644016036000116100000000217113135126237011576 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.6/cdf/rayleighinv.c0000644016036000116100000000253413135126237012316 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.6/cdf/tdist.c0000644016036000116100000001313213373111454011117 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.6/cdf/tdistinv.c0000644016036000116100000001206013373111454011633 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.6/cdf/weibull.c0000644016036000116100000000215213135126237011434 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.6/cdf/weibullinv.c0000644016036000116100000000253113135126237012152 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.6/cdf/binomial.c0000644016036000116100000000472413135126237011572 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.6/cdf/poisson.c0000644016036000116100000000357613373111454011475 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.6/cdf/geometric.c0000644016036000116100000000337713373111454011760 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.6/cdf/nbinomial.c0000644016036000116100000000342413373111454011743 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.6/cdf/pascal.c0000644016036000116100000000240113135126237011231 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.6/cdf/hypergeometric.c0000644016036000116100000001021613373111454013016 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.6/cdf/test.c0000644016036000116100000021355313373111454010760 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.6/wavelet/0000755016036000116100000000000013527016564010626 500000000000000gsl-2.6/wavelet/Makefile.in0000644016036000116100000010456413527016364012623 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = wavelet DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslwavelet_la_LIBADD = am_libgslwavelet_la_OBJECTS = dwt.lo wavelet.lo bspline.lo \ daubechies.lo haar.lo libgslwavelet_la_OBJECTS = $(am_libgslwavelet_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslwavelet.la ../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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslwavelet_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslwavelet_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslwavelet.la pkginclude_HEADERS = gsl_wavelet.h gsl_wavelet2d.h AM_CPPFLAGS = -I$(top_srcdir) libgslwavelet_la_SOURCES = dwt.c wavelet.c bspline.c daubechies.c haar.c TESTS = $(check_PROGRAMS) test_LDADD = libgslwavelet.la ../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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslwavelet.la: $(libgslwavelet_la_OBJECTS) $(libgslwavelet_la_DEPENDENCIES) $(EXTRA_libgslwavelet_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslwavelet_la_OBJECTS) $(libgslwavelet_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bspline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daubechies.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavelet.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/wavelet/Makefile.am0000644016036000116100000000103513517226736012604 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.6/wavelet/gsl_wavelet.h0000644016036000116100000000574313373111456013237 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.6/wavelet/gsl_wavelet2d.h0000644016036000116100000001012713135126237013454 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.6/wavelet/ChangeLog0000644016036000116100000000171013373111456012312 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.6/wavelet/TODO0000644016036000116100000000076213373111456011236 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.6/wavelet/dwt.c0000644016036000116100000002512113373111456011504 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.6/wavelet/wavelet.c0000644016036000116100000000613313373111456012357 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.6/wavelet/bspline.c0000644016036000116100000003674613135126237012360 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.6/wavelet/daubechies.c0000644016036000116100000003000413135126237012775 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.6/wavelet/haar.c0000644016036000116100000000373013135126237011622 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.6/wavelet/test.c0000644016036000116100000001466513373111456011700 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.6/bspline/0000755016036000116100000000000013527016564010613 500000000000000gsl-2.6/bspline/Makefile.in0000644016036000116100000010463113527016361012600 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = bspline DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver ChangeLog TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslbspline_la_LIBADD = am_libgslbspline_la_OBJECTS = bspline.lo greville.lo libgslbspline_la_OBJECTS = $(am_libgslbspline_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslbspline.la ../linalg/libgsllinalg.la \ ../permutation/libgslpermutation.la ../blas/libgslblas.la \ ../matrix/libgslmatrix.la ../vector/libgslvector.la \ ../block/libgslblock.la ../complex/libgslcomplex.la \ ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la \ ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la \ ../utils/libutils.la ../statistics/libgslstatistics.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslbspline_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslbspline_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslbspline.la pkginclude_HEADERS = gsl_bspline.h AM_CPPFLAGS = -I$(top_srcdir) libgslbspline_la_SOURCES = bspline.c greville.c noinst_HEADERS = bspline.h TESTS = $(check_PROGRAMS) test_LDADD = libgslbspline.la ../linalg/libgsllinalg.la ../permutation/libgslpermutation.la ../blas/libgslblas.la ../matrix/libgslmatrix.la ../vector/libgslvector.la ../block/libgslblock.la ../complex/libgslcomplex.la ../cblas/libgslcblas.la ../ieee-utils/libgslieeeutils.la ../err/libgslerr.la ../test/libgsltest.la ../sys/libgslsys.la ../utils/libutils.la ../statistics/libgslstatistics.la test_SOURCES = test.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu bspline/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu bspline/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslbspline.la: $(libgslbspline_la_OBJECTS) $(libgslbspline_la_DEPENDENCIES) $(EXTRA_libgslbspline_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslbspline_la_OBJECTS) $(libgslbspline_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bspline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/greville.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/bspline/Makefile.am0000644016036000116100000000121313373111454012555 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.6/bspline/bspline.h0000644016036000116100000000140213373111454012326 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.6/bspline/gsl_bspline.h0000644016036000116100000000662113373111454013203 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.6/bspline/ChangeLog0000644016036000116100000000300513373111454012274 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.6/bspline/TODO0000644016036000116100000000037713373111454011223 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.6/bspline/bspline.c0000644016036000116100000006701513373111454012335 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.6/bspline/greville.c0000644016036000116100000001370713373111454012511 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.6/bspline/test.c0000644016036000116100000004440213373111454011653 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.6/spblas/0000755016036000116100000000000013527016564010443 500000000000000gsl-2.6/spblas/Makefile.in0000644016036000116100000010420013527016364012423 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = spblas DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslspblas_la_LIBADD = am_libgslspblas_la_OBJECTS = spdgemm.lo spdgemv.lo libgslspblas_la_OBJECTS = $(am_libgslspblas_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslspblas.la ../spmatrix/libgslspmatrix.la \ ../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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslspblas_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslspblas_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslspblas.la pkginclude_HEADERS = gsl_spblas.h libgslspblas_la_SOURCES = spdgemm.c spdgemv.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslspblas.la ../spmatrix/libgslspmatrix.la ../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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslspblas.la: $(libgslspblas_la_OBJECTS) $(libgslspblas_la_DEPENDENCIES) $(EXTRA_libgslspblas_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslspblas_la_OBJECTS) $(libgslspblas_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spdgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spdgemv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/spblas/Makefile.am0000644016036000116100000000102213377336121012407 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.6/spblas/gsl_spblas.h0000644016036000116100000000341313377336121012663 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.6/spblas/spdgemm.c0000644016036000116100000001230013377336121012154 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.6/spblas/spdgemv.c0000644016036000116100000001010213377336121012163 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.6/spblas/test.c0000644016036000116100000001620213373111456011502 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.6/spmatrix/0000755016036000116100000000000013527016564011026 500000000000000gsl-2.6/spmatrix/Makefile.in0000644016036000116100000010656213527016364013023 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = spmatrix DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(noinst_HEADERS) $(pkginclude_HEADERS) \ $(top_srcdir)/test-driver TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslspmatrix_la_LIBADD = am_libgslspmatrix_la_OBJECTS = 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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslspmatrix_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslspmatrix_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslspmatrix.la pkginclude_HEADERS = gsl_spmatrix.h 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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslspmatrix.la: $(libgslspmatrix_la_OBJECTS) $(libgslspmatrix_la_DEPENDENCIES) $(EXTRA_libgslspmatrix_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslspmatrix_la_OBJECTS) $(libgslspmatrix_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/spmatrix/Makefile.am0000644016036000116100000000214713521374466013010 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.6/spmatrix/compress_source.c0000644016036000116100000001455513377620266014342 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.6/spmatrix/copy_source.c0000644016036000116100000000606613377336121013451 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.6/spmatrix/file_source.c0000644016036000116100000002670613377336121013421 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.6/spmatrix/getset_source.c0000644016036000116100000001457613377336121013777 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.6/spmatrix/getset_complex_source.c0000644016036000116100000001502713377336121015516 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.6/spmatrix/init_source.c0000644016036000116100000002631213377336121013436 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); } 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)); m->work.work_void = malloc(GSL_MAX(n1, n2) * MULTIPLICITY * GSL_MAX(sizeof(int), sizeof(BASE))); if (!m->p || !m->work.work_void) { 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)); m->work.work_void = malloc(GSL_MAX(n1, n2) * MULTIPLICITY * GSL_MAX(sizeof(int), sizeof(BASE))); if (!m->p || !m->work.work_void) { 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.6/spmatrix/minmax_source.c0000644016036000116100000000612413445210340013751 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.6/spmatrix/oper_source.c0000644016036000116100000002716413445207037013445 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_add_to_dense() Add two sparse matrices Inputs: a - (output) a + b (dense matrix) b - (input) sparse matrix Return: success or error */ int FUNCTION (gsl_spmatrix, add_to_dense) (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.6/spmatrix/oper_complex_source.c0000644016036000116100000003402613404510446015163 00000000000000/* spmatrix/oper_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 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_add_to_dense() Add two sparse matrices Inputs: a - (output) a + b (dense matrix) b - (input) sparse matrix Return: success or error */ int FUNCTION (gsl_spmatrix, add_to_dense) (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.6/spmatrix/prop_source.c0000644016036000116100000000700713377336121013453 00000000000000/* spmatrix/prop_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, 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; } } gsl-2.6/spmatrix/swap_source.c0000644016036000116100000001303413377336121013442 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.6/spmatrix/test_source.c0000644016036000116100000006056513445211234013453 00000000000000/* spmatrix/test_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. */ /* 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, add_to_dense) (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, add_to_dense) (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) "_add_to_dense[%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); } 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, add_to_dense) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, add_to_dense) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, add_to_dense) (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); 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.6/spmatrix/test_complex_source.c0000644016036000116100000006105713404510367015203 00000000000000/* spmatrix/test_complex_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. */ /* 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) (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)); if (GSL_REAL(bij) != GSL_REAL(cij) || GSL_IMAG(bij) != GSL_IMAG(cij)) 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 = *(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)); if (GSL_REAL(bij) != GSL_REAL(cij) || GSL_IMAG(bij) != GSL_IMAG(cij)) 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 ((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, add_to_dense) (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, add_to_dense) (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) "_add_to_dense[%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, add_to_dense) (M, N, GSL_SPMATRIX_COO, density, r); FUNCTION (test, add_to_dense) (M, N, GSL_SPMATRIX_CSC, density, r); FUNCTION (test, add_to_dense) (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.6/spmatrix/gsl_spmatrix.h0000644016036000116100000000414713377336121013636 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.6/spmatrix/gsl_spmatrix_char.h0000644016036000116100000001364513445210502014624 00000000000000/* spmatrix/gsl_spmatrix_char.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_char_equal (const gsl_spmatrix_char * a, const gsl_spmatrix_char * b); /* 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.6/spmatrix/gsl_spmatrix_double.h0000644016036000116100000001302013445210502015144 00000000000000/* spmatrix/gsl_spmatrix_double.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_equal (const gsl_spmatrix * a, const gsl_spmatrix * b); /* 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.6/spmatrix/gsl_spmatrix_float.h0000644016036000116100000001401313445210500015000 00000000000000/* spmatrix/gsl_spmatrix_float.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_float_equal (const gsl_spmatrix_float * a, const gsl_spmatrix_float * b); /* 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.6/spmatrix/gsl_spmatrix_int.h0000644016036000116100000001347713445210502014504 00000000000000/* spmatrix/gsl_spmatrix_int.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_int_equal (const gsl_spmatrix_int * a, const gsl_spmatrix_int * b); /* 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.6/spmatrix/gsl_spmatrix_long_double.h0000644016036000116100000001515713445210502016200 00000000000000/* spmatrix/gsl_spmatrix_long_double.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_long_double_equal (const gsl_spmatrix_long_double * a, const gsl_spmatrix_long_double * b); /* 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.6/spmatrix/gsl_spmatrix_long.h0000644016036000116100000001364513445210502014646 00000000000000/* spmatrix/gsl_spmatrix_long.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_long_equal (const gsl_spmatrix_long * a, const gsl_spmatrix_long * b); /* 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.6/spmatrix/gsl_spmatrix_short.h0000644016036000116100000001401313445210502015034 00000000000000/* spmatrix/gsl_spmatrix_short.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_short_equal (const gsl_spmatrix_short * a, const gsl_spmatrix_short * b); /* 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.6/spmatrix/gsl_spmatrix_uchar.h0000644016036000116100000001412313445210502015001 00000000000000/* spmatrix/gsl_spmatrix_uchar.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_uchar_equal (const gsl_spmatrix_uchar * a, const gsl_spmatrix_uchar * b); /* 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.6/spmatrix/gsl_spmatrix_uint.h0000644016036000116100000001375513445210502014670 00000000000000/* spmatrix/gsl_spmatrix_uint.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_uint_equal (const gsl_spmatrix_uint * a, const gsl_spmatrix_uint * b); /* 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.6/spmatrix/gsl_spmatrix_ulong.h0000644016036000116100000001412313445210502015023 00000000000000/* spmatrix/gsl_spmatrix_ulong.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_ulong_equal (const gsl_spmatrix_ulong * a, const gsl_spmatrix_ulong * b); /* 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.6/spmatrix/gsl_spmatrix_ushort.h0000644016036000116100000001427113445210502015227 00000000000000/* spmatrix/gsl_spmatrix_ushort.h * * 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. */ #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_add_to_dense (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); /* properties */ int gsl_spmatrix_ushort_equal (const gsl_spmatrix_ushort * a, const gsl_spmatrix_ushort * b); /* 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.6/spmatrix/gsl_spmatrix_complex_float.h0000644016036000116100000001506513404507660016552 00000000000000/* spmatrix/gsl_spmatrix_float.h * * 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. */ #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_add_to_dense (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); /* 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.6/spmatrix/gsl_spmatrix_complex_double.h0000644016036000116100000001406413445210502016704 00000000000000/* spmatrix/gsl_spmatrix_double.h * * 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. */ #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_add_to_dense (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); /* 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.6/spmatrix/gsl_spmatrix_complex_long_double.h0000644016036000116100000001616513445210502017727 00000000000000/* spmatrix/gsl_spmatrix_long_double.h * * 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. */ #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_add_to_dense (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); /* 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.6/spmatrix/TODO0000644016036000116100000000123113471453340011426 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.6/spmatrix/compress.c0000644016036000116100000000347713377342160012755 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.6/spmatrix/copy.c0000644016036000116100000000344013377342225012064 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.6/spmatrix/file.c0000644016036000116100000000340713377342300012026 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.6/spmatrix/getset.c0000644016036000116100000000352413377342262012411 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.6/spmatrix/init.c0000644016036000116100000000344013377342314012054 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.6/spmatrix/minmax.c0000644016036000116100000000260413445207145012401 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.6/spmatrix/oper.c0000644016036000116100000000343713377342325012066 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.6/spmatrix/prop.c0000644016036000116100000000340713377342341012074 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.6/spmatrix/util.c0000644016036000116100000000276313377342374012103 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.6/spmatrix/swap.c0000644016036000116100000000344013377342355012070 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.6/spmatrix/test.c0000644016036000116100000000727513377341570012105 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.6/splinalg/0000755016036000116100000000000013527016564010770 500000000000000gsl-2.6/splinalg/Makefile.in0000644016036000116100000010442313527016364012757 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = splinalg DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(pkginclude_HEADERS) $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libgslsplinalg_la_LIBADD = am_libgslsplinalg_la_OBJECTS = itersolve.lo gmres.lo libgslsplinalg_la_OBJECTS = $(am_libgslsplinalg_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_test_OBJECTS = test.$(OBJEXT) test_OBJECTS = $(am_test_OBJECTS) test_DEPENDENCIES = libgslsplinalg.la ../spmatrix/libgslspmatrix.la \ ../spblas/libgslspblas.la ../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__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgslsplinalg_la_SOURCES) $(test_SOURCES) DIST_SOURCES = $(libgslsplinalg_la_SOURCES) $(test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgincludedir)" HEADERS = $(pkginclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GSLCBLAS_LDFLAGS = @GSLCBLAS_LDFLAGS@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_LDFLAGS = @GSL_LDFLAGS@ GSL_LIBADD = @GSL_LIBADD@ GSL_LIBM = @GSL_LIBM@ GSL_LIBS = @GSL_LIBS@ GSL_LT_CBLAS_VERSION = @GSL_LT_CBLAS_VERSION@ GSL_LT_VERSION = @GSL_LT_VERSION@ GSL_MAJOR_VERSION = @GSL_MAJOR_VERSION@ GSL_MINOR_VERSION = @GSL_MINOR_VERSION@ HAVE_AIX_IEEE_INTERFACE = @HAVE_AIX_IEEE_INTERFACE@ HAVE_DARWIN86_IEEE_INTERFACE = @HAVE_DARWIN86_IEEE_INTERFACE@ HAVE_DARWIN_IEEE_INTERFACE = @HAVE_DARWIN_IEEE_INTERFACE@ HAVE_FREEBSD_IEEE_INTERFACE = @HAVE_FREEBSD_IEEE_INTERFACE@ HAVE_GNUM68K_IEEE_INTERFACE = @HAVE_GNUM68K_IEEE_INTERFACE@ HAVE_GNUPPC_IEEE_INTERFACE = @HAVE_GNUPPC_IEEE_INTERFACE@ HAVE_GNUSPARC_IEEE_INTERFACE = @HAVE_GNUSPARC_IEEE_INTERFACE@ HAVE_GNUX86_IEEE_INTERFACE = @HAVE_GNUX86_IEEE_INTERFACE@ HAVE_HPUX11_IEEE_INTERFACE = @HAVE_HPUX11_IEEE_INTERFACE@ HAVE_HPUX_IEEE_INTERFACE = @HAVE_HPUX_IEEE_INTERFACE@ HAVE_IRIX_IEEE_INTERFACE = @HAVE_IRIX_IEEE_INTERFACE@ HAVE_NETBSD_IEEE_INTERFACE = @HAVE_NETBSD_IEEE_INTERFACE@ HAVE_OPENBSD_IEEE_INTERFACE = @HAVE_OPENBSD_IEEE_INTERFACE@ HAVE_OS2EMX_IEEE_INTERFACE = @HAVE_OS2EMX_IEEE_INTERFACE@ HAVE_SOLARIS_IEEE_INTERFACE = @HAVE_SOLARIS_IEEE_INTERFACE@ HAVE_SUNOS4_IEEE_INTERFACE = @HAVE_SUNOS4_IEEE_INTERFACE@ HAVE_TRU64_IEEE_INTERFACE = @HAVE_TRU64_IEEE_INTERFACE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libgslsplinalg.la pkginclude_HEADERS = gsl_splinalg.h libgslsplinalg_la_SOURCES = itersolve.c gmres.c AM_CPPFLAGS = -I$(top_srcdir) TESTS = $(check_PROGRAMS) test_LDADD = libgslsplinalg.la ../spmatrix/libgslspmatrix.la ../spblas/libgslspblas.la ../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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libgslsplinalg.la: $(libgslsplinalg_la_OBJECTS) $(libgslsplinalg_la_DEPENDENCIES) $(EXTRA_libgslsplinalg_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libgslsplinalg_la_OBJECTS) $(libgslsplinalg_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) $(EXTRA_test_DEPENDENCIES) @rm -f test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmres.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itersolve.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? test.log: test$(EXEEXT) @p='test$(EXEEXT)'; \ b='test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgincludeHEADERS .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgincludeHEADERS \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-pkgincludeHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsl-2.6/splinalg/Makefile.am0000644016036000116100000000111613377336121012740 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.6/splinalg/gsl_splinalg.h0000644016036000116100000000467113373111456013542 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.6/splinalg/itersolve.c0000644016036000116100000000447013373111456013070 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.6/splinalg/gmres.c0000644016036000116100000003123213373111456012165 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.6/splinalg/test.c0000644016036000116100000002300213373111456012023 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.6/doc/0000755016036000116100000000000013527016565007725 500000000000000gsl-2.6/doc/images/0000755016036000116100000000000013527016565011172 500000000000000gsl-2.6/doc/images/bspline.png0000644016036000116100000005747413373111455013266 00000000000000PNG  IHDRKbKGD IDATx{|ϒp]E.JPPԊB@TbUT*hQϪz x˂U@T-xzI&@ 0?;d$g6yF4)Nc~{^|ֶm]vi""(3w}پ}{ĿOgtF.A 2@]g""x3:V4)'Q.aÆuuƍO>]wK/9Bfl_T&g͚O 0 --_~o=hРضWDDd$ڴ>QV/ΈD<) {{""" L8̞=&DHēP JHBQqEDD,""`(8@XDD """PqEDD,""`(8@XDD """PqEDD,""`(8@XDD """PqEDD,""`(8@XDD """PqEDD,""`(8@XDD """PqEDDt\fʕ%%%{>Ҝn$8`IJKKz^ߟlDD$y p xdGq>W 82yuiXDD4-酅^: }ED$lEDQ+'鋈^iZDD$(8@XDD """PqEDD,""T.ZKDDbCI222+RaXDD".A׬Yseeddx|x (""/}>{a֬ylĈM6:t %"n&Oc. (..͵򰀳I|pZCDDPt˵𓪩3g#oS(O0!M,KKK֭3;pU""<4P{%Kj$nt|+rtA ^߹mX#DC 1z#>o}4G""<O0l F_`IDDɏuD~=Eb(qhc-+o_v୷:4ply\u:IL7q۷sa|Vqɱmz1wtSDD$WWs!lok&XD$9t.dHDo! jzڕ /0 ""Q7nOv9KDDB=`dgsMġp Nߟb&8 PQ1t(UU#شhKDDB=`O1y """qOx_Xt;DD$iz_NlYFKC$ ACvLN7EDDzxSVFJJMMʕ+KJJz}iE""_bժ@N&M*--5{^ߟVsbkܛo榛&Oeee|kצHID$Q(GEk h~xmjj׺a_lٲ1cD""SJŠ'Z(++8qbuuu|Mv66lY#ED$~)7n ٳg=;w6GqD['""qOqMudʧN_zÇADD$)7VxRa+,,TpyÓ9cƌ?|Ȑ!n$eA7yŹ34(wݺu$!EEϟgLSΧ\HBRW%=XSS|3: a酅^:._N)÷:6G72gl+^vS4X 8[ܹu㨫[9mڒ%Kjjjn ~ ۷FiU_]]=`6ee_C5tZ|k׮IqCN7MT@M׬9p g&1ͤ *a!hxG%&@ pG^s5fKxRtnݚI >`m^~۱$5&NX]]999ׯ~ڵ ggg*K$7?>=====}/ v W#໲O?ヒq$6], &L>}„ Yݺ=ӻt^w}5bĐٴ)&Ǹ4o߾}ȑ *)))))4hШQ5YSM}k@  P?8!5-\7p3 //+a #vg.^瓝M~̞֭Qj8˥2dȬY:wܹsYf <r]M V+***xTTyyy#_}En.{s|5{3i /;2Kp=Kz:Μ9z(7ި0, W:_z%^ziȑMN$ g̘a}'kle"qUUUMz߷s1wѱFvƄ ƪUM}`UgշD&zҥ{7oo{=z}ٟyK~J4>Vad@ `@0Cc{7â"*ot0|?D!m۶u~k׮[;vc9f}Qs,:33VN93>a)---0bӷ/ʢE|p3/4HkW#-ŋ9h>8g%"Jm۶m׮] ~df͛71`"77,) $??䁛^/]fi $-[eڽw8:K5{J}n`p^sXH0`3;,)Al O{ڴ1z[UUUx|8,0^{͡I.ы.߿>~ ldK1(KZj?!KR&6mvLfmuMUqtX}}O=uQ8O?~UXX8t(kߤu,F:KZj?Xh΂ڴOookpxM9)y 3KRϺ=йsnݺu֭zk>}on#Go/;wnff|ן_lY.r]H* n վ_CSSKAZ{ 222#Xlަh^pi6 㫯7n\N:u4nܸyW<̮]kʔ)ׯoɏAyvnm7J's 0ڷ7[$j믿%m0uiDV"ptSI?n̙eA׬ᗿCDFSM8C;Az-*///))ѣy7 /(x H߳,**'F?T"gk]wFxu֥o4ڵwGy qvnޜ޹ADE/Rh8VڴaHW^q)?0`j(|4QndE_lĉed| ?-kloDq:$_čd#{!xdKdܳ,#6˳!WpxAM(ǐ_ݻny0_]{6l„ Ybf6ˈO^LB;nĀp z(}u+~tSdY`A] ա|{4YK[$*5b<.c3f̸Mx"RxxSjj*AsS-\sW^I0ؚVH8vc=wԮ\rԚt9ᅹv:vEݭ[)S4س!<ëGy=gΜV6LDAeH1:}Ȥ{.|>ڵk/iVb 0_XxEu]n Qx߇/88:tjw#T Vp4f26sF s/̼<%ݻl7vMZXm[Ehr =k|Ҭv\&07_{mzi.y0>Ҷ HYY٩h"e!8K8FW8)츸MHؖy9V%n+#++|fRO2//o߾4TD49`sCwHs帥= ر|҅Ө fMi[x,K W{Vȏn%C6|.[¾9q5`n4:}U뫧Dd)ǎ`N9 [J%\FVވF6=k{UY"NQ)sR_^X+oLzm}fCIBF ,hjPSe?h!:wp6Q,iii8Y_rU߱8 Vm;zv<|i-Ix ˁF*;u.qHb~QQ+ mcz@!-91e˖9ݴjj)錌sxʧ|>_QQ 2?ֵeTn|0##U6n竪r+zBY1=}km~(IDuۍCl2s.\y877ך ̜'zĈ%{s1M 6G¯&"تl96$؂\sl, st_rͺuP%vgffVؖdӧGۺG"cʚ57llk]6(s'w t?_Nk<in4/k_A]롇:SOMxmb,}0H5SA Z}HQ)smsD (}jjj^\oL^qErz+O=tk$Z8 ~ `'?.l T>kV]]]גӏ@ `fz6mfHSܹs322> ^Vfooic[tS$-[=?339ƍwm`0hFUUUHG/R}n9;;K.:uj[]%IX&kfj~~͛77n$qEPer ^~==:'5۬v-t`8ph}sxU}tKdF1R5DG\pAFFƔ)S ~->@ CmUFQQ^vn /qyY=o̾lE6 xh^70wZxŋ hS!f?={"ȘF`0h{m[_ aM( y7zf\>q-T[[{:t:uj>;;0fŝ,n>wGt%`0hvR$ IDAT{ .f̘o=h6k}*|Y@_uWz%z뭽z5jkjjfϞ}gFq`.}jy lN5wϟ@!0cƌH8Qr4|lZ] o>M: JxJIIip>] /ҥ˅^Vuִ- E< x3`GehD96 "Sg_ 0Kh}4@mhDWM8l8WXqI'eggϝ;o[*9r">vN&L7+GeO Hb{ aGh;## !:Y x̴-}?Ų}p ]a˖bGN'x"!pLL3s1I> qiBB lwFu5ⅵ xX n^^^+ PW#8r2'0]t;}Tq0`NLX`lc|M%'+|eЎ?h/w4lpxvvvAAA$E+G[UGt; ҳgOσ㶃@%:=zލ7ME&ӁH(Az>@VVVVV%.qQ `hHI1ms)+ ~h -e$lϝvO6L"z>|9S:68#lSaFS!."2v5_9dG[$i̵ ?.2+++B„ ӧO0aBZZZi^KYa&#̙ճg617B_Bvvv>X{`Sjjj͛WVVB#cS< )L{5]!--m„ M {mCac3|kᮻJGk*{x 5qusOTVs[xz0#jFFF=2ZXfH'/'p6xqe˒%!g(%%%E#x`=2&Z&猓m_5DNȏRrW\pnL~ogPTT= ,kpmr`-%큇-|>^+X0 H @XCafc5z4Jh͛_t89AƜ-((hAwx^1cˍdoMt= ֵ*#B ''gSOSO%5g;Y0SW)PY!zgΜrc&N>ܳ Ȇ 3Rv+A+ QKuXH;&%lY|/ZTb`X@`[ 9j;>6 }̵:$ϝgP^X@^^^2 ՘3DyW0Ķq͆(=A\QI·r tS,$B $ϝERo޶* sJ3Ntx<@͆(px< #%K|>kPwYN7uςu&υERa;KKK֭0p. 駟:ٲȊRvu\poV"***||>FY50P c$nQa#_a 9ىTtBViP \ @fffl)bƅ 0;秂g,gW~MKXg~?Mܪ~ {`Ɖ?E AiF~b%b@mӬ@-?AX`N.Rr.jΆdff6MzNy% a7Kka8 jm]:}2ozC L`ӦMJŊ8s卥}3isrrO7;n,K$`w1*.4 LFNTx?.rrrn  -t4lQ555-=ztii\ |!ү߿W3VPVVvꩧ.Z(~ bF/0"jjj*++322̼'C6CG}踆 "UVV.жQ2<{]8ޅްʼ8 Gin9.uO>LUa&?ٰ}}{eb -o~t9@|b9i+*öU x>@QNˊ^HpiiǏom̂?D]۶Gyg !?Ӎ3s %1?wnsft ~_@#[`~΁0.Q[ qscN#Θ3GCR]ZɪNЫW/b5J dgg7R+ mns)FymZkcSgm uJui=SիW@J&xӦMsp/O u]?A <œ,` >n\Br>lڴQWp} 9TPC%Rrrr֭[g[ ?ܖjf!ͳC%-c.woVx<ǎT2#4kC5H<:&".++kŊuspT Ɋv\p[k>L ִz3Dy$d]a7쀞Sr6m! x <JdA3'+3bB)v5\uΚo*XHJ? Alc0 .8B-\ t(wdX][ vPY#T/pRY#WͰNMA9:Ic-f-m3fP:BY9Y ܐOjV?3tb%a%"˼u::~X˜f_r?07t[nJG+'_C5 fg;ky1=4zhHKK0au,Xx)\ ?Y0f,3p"`~9wy%.\QQ1<vh-ANrMc(y14Xl[Mς1f ՘1/3SQJ u\r\r!33nY@ 33s['K׷_Y`:#6p/P 3`_Hp|>?48pXsoq^{%ӧ[m/%[}iӦi)Y4{r £pٽz͙3_`ASc5?a4'0ƌp\3 ہ ׿f LK &;Wo0?:.o>Mnn4JSYy;Cz~?'''R8>^z5@݋Oa촮|1Tk>&P 5z[,J8<5('NX$e=+]& gƍ[jURe "-AWuK0 J8X#Cc}aBӖ Rv!VzB0BW9/d.n+Il@ |muO B^o[+4##c޼y`0z"n"P4Q6 #x gmosz 8(UUUuT^`o$C#5uW~]nc6ؒs`7mҥ _e Gd f ܹ{8$''gÆ Ȱ Wo,S7j-h=,}Nz.ZfV0?C{c_dfۂ ^Zoon4'--ߴi_xW_ TY0D}U䗮l:ML 2\ QPPMr9Iʚ`Ku`ubp-**2Ϸ o}oH+6 8p˖-p;6@+Ƨ/` /V'V&$iaǓZM /o~tSMӋƏ gWlMM͢EF]^^Y9#熯 klOuNeh=,_$d+0Gt: _Q^^X梧yyypl+|_RZZhmwoO òLl`***N`E<8K`A=0kT?'E ㉽\jqrNع{ toܸ`>d:BBvZZJ8X.}%ɷ502utǪBX YCʷ/ 6mw;|$ Ən8(gI&>l)k.up6<76'[ ` lcUTTNKKKs,_,++kcx꾉׮]$-07 \\4 gdsqe_i:~:N H 8LTMw‡X:/4>gΜO?=kG! ^|^xaʔ)c5Co۶M GFMlkrKÎ̄\k&8G^ܲe*,qƭZ壵4uZ8;O=͍Rvu\75͋ϢV2R U`\\9 ~|y|צMfK7=p~n*KыqZ/~u_j nK5`zxTm;[TskjȂM`\=%E %kӜ=%Uc e#Hvvj?\n[osg߅ҵOg^?*_A0f=@hJh۰aC L^d;XfOҞ8v*/9;0Ȃ8*i ]CX j{vajjj*++͍q~BLI7SKs34w9wpiqq-ҽp<)?}Ӆp?ۀ3/..6k<<5`<| XZZ='xu~ǏߴiS/6 >ETjjjV\YRRҽ{3gI}] oS{yatJ"+"J]q!Oߪ`p-@ 0{w|"%-eáζWyf]_cw X m)4ǬmϽӦ=dɒ8fu_<5~ϷnJ @*nP% r)ӶmFcDS}H!踗3}t{xڃ50fHnn… ZQBN7PZ^cp6& @vvvee zws_,{6uDxU'X{_=|qꩇ}EzrZYD8%LO7< fY@R|'榧`(|:S'.//Ϟhs3DGұ1;ڶYP{ ҳ,ѣ3~~M =^i9V Y}`<8Y̼E3=\կE$4ؾ }ff¬l |Z\\kt<\ycCo濰pUUՈ=`6)7|*? qE ؾ{8a>~O^M~r z7?A~ +0x͛/v`U;i:Cb-J=.$ohic۷;ݔȨ2o 8,tjxlٲoPz[WNM2挌 |h86 ft%Fu?cܸF\~~N"N^ »reb,e.[SVAefɓO8m~fVWW[Fȇ<8}c ڷ/߹Nvo }~6`φ[w~:A`pcNw^œ4׷LYYYYYY]<kǴ4#36>?|rk`u^—zpыqPk$nHUǿ7A^W\u5YYRVFϞNF"#|[$wZ{3gܸqՔww s|nEEE{l=zlڴ{&sB"(z"#P%^W+!0 wB{ҥ>NHQLb)..͵cKǎےo~y祥͟??UDoCI ыN(V0ΆPngnd"֭;8:-R@s+.\ԫ%%%*r"PN(֍RfJYYY8 j[LM&-R/5;HJ)J:bPWj/ÆqlwQQ]DyrXkQ\B+|a6&FJʵh51VV1_-ƠBy4ĉ΀01ar<@aϙ%{N2ٛ"vvI(VU}+){~t:MMbcc333233njyfqɐٳ|꫻w6.>z` ]qtiKzz7QWIIl ??ƌC>}ڼ\Mu .\ sPkɿBN¹GstҀ˥vVUU5^^^ JHHx׆x$,lC@" 2V3SJJJ&O--ˁZ[aS,^zݸqrݾ}޾}<ҥKcbb ݻ?9x|vNR`4dˢSKDRJ}_,W xbW_}brv/`Few-8 Zn2'q{^斀Z1555 N:ɓYYYL Iŏ݄_ j>ȥlf׽[$`Ceeecˇ [[xL3fLPP߹T DsA-@_\dy\-++fFp;E'm˳Yɦ{qIIIɘ1c ϳy x.==<Zlm֖zUCt+VDDD466ZFPXXXYYyΝ:;;;((wqzapOV>%饥KEEDL#`JU\\|̙Џ?>ӧ̓333w矟>/-""żXnPRRf 8{"!" XY,MThLIInkkxK;`VK*`;x tz$ҧO &-<._xy]{f`ټ ,X{8\uټ<F8gqYڰy9OCCFs7orA"RŭÑR2ΝCt4T*|5Zwv 6zÇKs=| f"%9eHFaD44p⫚'[INKII`n6GI3N =)z0!: :%طoߤI, zUo[H#`r#0kn~笗nvpɒ%VV>\r;t""OL(+s[UqGoVǞNDI  üyhi;,ڮ6޺NWѳgÈ7gOFb'"7ւV4 x xhΣֵ]vAѽ{x47㷿GDpLfAk%v 8|2dΎXP?yDDלwDDKЊf3 ^FY9::zV-(( 7wo(z0gA6ѣG@KK) TC^osHHȌ3,ױf͚㏷]Pt|ǎ!- yy<'""gr]%hE/((fPVm6pAoЀʩ/rҤI݅-]ǎ'?ANNHF=zvlڄ矇߱+Xݶ(/sǧ qp~+lj yޯ>h>Su6cšT[kyDDn %ԄdS'nѢN׷F#vd&``۷1c7G-;kȧNa/\kxG`R$͛7wޝ~_gnNNK^;}?z=}0`&O >͛:.##`0 <뀉{wgh<a"ܺ;ŁٗH7Aygݵw/+H.xڻ|1'DID$gM;C,8^21]~~~ӧO+/H};IV9޾F6g%"R#wbbbwVsGDD!pڌw a׈</AF1%%E:޵}YDD 첹&f^p&"&`ZFo}M""R2V" [Vϟ?gϞhd-]tRRRFC%"&`+>>^նi4V233zi$"8&`^E޽{oܸn閗|N""{͊9mjj",`ѡy2.00ߞ7o^sssssyrrr}\#`"{.**d2}c&"?~|}}}qq>(:"LDhѢq O>䭷=`"‘#G.]4eʔs?ȑ##"|)cbb"""\x1))4 @thD#`"HMM5g_Æ ={vFFب<GDDDpLDD$0LDDD0 LDD$06IENDB`gsl-2.6/doc/images/cheb.png0000644016036000116100000005476013373111455012526 00000000000000PNG  IHDRKbKGD IDATxw@SW !QXAAS* Nĉ*HJ>VkVlbZWEuP@u!D1H?y@rs'K_b1Gu` (` (` (\PPd2LaaW\9rł .0fl@ sbb~t҂'O;v̙uuuV@ HKKzzz4hѢ J[:T[[L^ w$/sjjlԩScccI"pNNlG!;;[EPx-ݻwrr;_pAܹs-unb2zٖzCCC---9RQQQQQqݻ:@g&!&,b-C-))~{D" Y~}^^Yh4rJh~P%PJB"5B"=⒙)ےR//$>/n޼ٵk#FZ!% `??(ٖiӦ)y޽{.]JB]#7.]z[x<di&/==](-_n̘1V@ r`$%%߿?11Դ , 4332esdd$PE ._WT(R%PJh~_!7a\`5 VB@* UB IViI F8 S@P @0@P @0@P @0@P @0@P @0@P @0@P @0@P uzhb:FӅo@9Hڳgϸ8cccE V=*..NKKȠݧ kGT%%%_~VVVT)ȋ].0t \PPd2LaaaK=###}nݺuڕfGFF666]!|>ۛfs8f}||ΟѣG#"" #""~? :ŋ:tH$Q] @CӈhiK``gHHHL&3++A WWת*ų0@ܸqk? ׀d[vܡ )A899EFF_B:#r8''MѣGr;~۷o޸qcΜ9V"B&88x…?z̙3^@gA[CCj:.m fffuuu;YfI[f̘qxP9gkkrL&PF[OA}>㼼<ų` $KfflKVV-$@r/**J%**jڴir;;--M޽{z">:ҥKܶnݺb ݛo>i٥G޽{ԨQbV\uuujjjZZZvv6)**gff"/V^HϮ];[?yΝ;%{ 0`͚5siu \hӧ37o^rrrMMMOL7o_0"0A-}[}|%?C$ٳgMMȑ# ܻwo[[[AOv( kGڪѣGl6[qOXCkkk֪#Gth QUU`0H}t ã%O>qssѝrѣ;AlڴxP 1ȈBTL(^p!--mC 9qN[ H$ yyyvڿmm-Aƍ.,E.Dڭt֭[]]F2eʶmHu]) ڃMИHd``:djK V =x⪪*.gccCa1_nNr eFA+R/_4h:dooYjp8A'ǐ@e,Yҿ/R]agg}={L !9h"JBzh\"/^xw\bnnNӧO?j???k .)h6Ž{Vފx}}}ծJ߼y啙KW_^f:z⅃ڦk vÇٳg~ҤIɎ7oޤ|KXliim6cccj́k@w}w -[,99… jN߂Gr^ROKͲ꫙3g8k׮=(#~-:;vaddtM5O~##]x144TqO>-]Ipp0N߶m[GP1==ٳgd .ףGo+{)Ajƍ|'Or\ Vy@Ν;okkkkkcǎ{OyH$rʛ7o:X\FFF!!!d .kkk @ĥK$-aaa׮],H$:vآEdwe111?իWr5__?x@InzaJ忎t!ڢ6$$ɩMDǏTU=x]iii>| ޽{}VUWW~)~嗍7wd.kaaAē'O|x>G$7nq***۷2"##O|Э[7RW]`Q]B~zСY>BP ;v055%`ݺuMVQQQ$۶m>SA(^tiܹ'OlϮ]VKOO<ۖR +++ "m 1$Y[[m۶M[lyg}&96<[bn|A,+""w؈buuu佀977wÆ zzz۶mիWB$L~C\k׮>ץKΘ {$''}6###;;;&&f޼y9].0bGh#G8pʕI.;y[n5 @IT޽{t֭[U8fG꒒Bk555*ÇݰB&OLfΜIb޽{/ŋ˗/}XJF-!/b%4MUoű~BF7n/_|DDDH*PTTk&LPfm۶榦P.\P\\\__ yˢ钍EbӧO_ŋs۔Ӆq4bF,թb)Lr *))WZjҤI.] k [lٴiAz ={!C////**2118p`'vA(Z=\^^z/BqOrrիWIz@N:;tݹsgqqq555M0Eׯ_xw:8T'V Xlll\__ ٽ{QnܸA\;wSSS;Yzpܓ'O>}:))Qd2yV??~۷_xAā/^LFCҵeuҍo@6'\^%7aUTT?OsrrtAzzzRRUUcXX&U̙3{~8prE8pjMȋ]X;b $H']lϛ7oX,F+..-[o߾LVQQQ\.wժUN"իWw(\ uÆ swwgXI"`%* ׏߿\2a33\kkNڵkϞ=ٺ @I* `q Èb6?]ڎ{Q=Zz5:::##gϞfX֭Ssa *# %n޼9%%i[ g@e:7p@:>dPp׀kr #Gcd~ K02  y {ptX,ׯ$c𺺺YfmݺU 1>N"= L&/,,l'MlUUU666d {ȑ*2Iބ󽽽-Zt 㓑!wk]vZ!@'ѵkׂF2]xqCCCMMU^=HKKzzzzH$rtt?[}$(I TpBBBPPlKPPP||2Ǟ;wbDn丹ɶ>zHcwgS=ykhhX]]Mӥ-B̬N>2eJ^^2׫p @I8 Vz ~`l677r-^juoe˖)?G${*,,Ln7#⒙)ے}͞=M{AH斔`,ɍf$7d[MP/+?~árxҥo޺u+x)))K,vh?uꔳsdhkkkkkkKKK  7 FRRRjjMMMO?a r)))eee CU~7111t<:n``  ;2NIIH$z董@1$dwﮯC.PJV͛ @XpwwGtfϞ=A\B.)h%utRReQQj@8 헕ٳ,믿' }:H֎X(uƍ#+b==ܞ={N D^uCƦTUU=[nH_Ӆ#VJ  K.* @0L߰P 0@P @00{捃9յa ~6} q,kȐ!TCNXJ722TLw@P @<%%%T ߞ={rrr<<<d)hΝ;999'N݄e\.ƍyyym=ȑ#At0N�V^ݦN8ADPP9u@ueԨQC iQgΜxCXtڪLaaar݊%33s„ Җ,gg:Z @gjӧO'䮀d[M&̙3/\ r9d:㌌ &9qDJ]/]m֭+V b޽)))v}j>>>Aqܹ/ɓV I/kI5ktF䮀 FRRRjjMMMv666>u˗zo?~|رVЙ1{l ta).]AYZZS]֝@cIӧOGP ӧO1o)h4-,, bnn.mNX ˆ VPPOu!q h  @0|1Յ"`]s%K\|B@06lf9a>>>@!EjyT!hiK``gHHju7CΝ;;L:o߾e2 Jh#m} )!!!((H%(((>>I:;w~k׮h&#t[[ۀlf V'bT 7y>~ʔ)8;ah0V#ϏBt%܄ Ϸlhh(,,Uׯ_w֍W.MX_.\6lX4 @9s 9s6><44ɓm2555.]"]~͛;FQ]6 @$''~zСmwrr 8p U@ ̩S6mZv**)hm"Ο?O|@u-!Xhv-vЅ'h0x<9˥t ` tĦMB.ܾD"N'B(5nh+"!~FAFх#VJ NAt"8W9F@P @0`gΜQׯQOUqpAA?d2UZZ[EΞ=[\\܏?sTGn|ooo6p8}͛I @+?~ 3f(dɒ[4H-E TDDDZZZtt%003$$DQ;wȈRr̬rݻ[XXztںVBBBPPlKPPP||C222IjaZĉƍSIF!7srrd[\]]=zRÇ3 R  A̝;WU\ 䭡auu-iB̬Nn+Vmڴ?4tbeeevvv*իWݻwTɀ:O[OAI|||NNΆ q,M0U>qqq"GU ɍf$}X,i˫WZivD}}vL0螓'O1g .`rW...-YYYr;:884_@4S]]]aa!N:u*յ) `??(ٖiӦ,nFHjɓ'vwުU;@U K޾}{֭<ㅇ,YD[閑gϞd"7 FRRRjjMMMI1b?R].<ǐǐڪS<y (Dp@s :<} @P |E6nHu!6`VQQTmCېlBmta)J+++KKˊ k @ǽ~*@}~>x Յ 'O8ɞ@y`vvvNX @'N%: @cǎ1oÃBt Z< remmE30NAP Љb @t: @ (PiӦ]zBz`ٳgOBBQhӦM;zJF5CIvvvJJ 7oJJHHxJF5NXjr!Xz߼ysƍsXd߾}A,ŽZ;ahrx-ݻwr 0~0jPɥ˗S]h{X,Ⲳp+ŋ߽{ŅB@Mֻ^j&z޼yPf" 4+K޾}{֭<ㅇKv]O81>>\(>|x=h)5fWWW v"7 FRRRjjMMMv^~}TTs.]<<<Ο?ɓ'Z!%ta)~WVKTƦZS~<h`U z9p@s[" Ku!rھ|ZNACG^|yFڵkAtf/hɋ-8q?xͪׯ+?HoV=}֭[-==f^ZUP??#iڵq㼼F1h 񱲲Zv"vHNN0aUugVaaazzz=T2P˿b##)S,X`ҤImƍbÆ ۼyfDQQE<=={=xꖞoI&=x@(v|(.ܾbPhggghh4u댌;TJOO߹s%?}}}w؁]B5kVJJʩSF)``@ﻸ Ȼ K 4HhĈK.3g&4.aaa111"h͚5|M;ԺwFFիMLL dhhgggGu]r  wAI]]ݵk޽KuiZ_~G}W]]?|pm9 c2FDGYYw}'?cL_(A_秦^`dff=zǎT}ܒ=jeed:NuEݾ}at﷒Ν;y޽{:uN_R,{:iXr}իW>}utzHHi8iҤkiQ 0 F.K---{EƤ...... K.'cЁKN:C~;{ɓ'MLLȨ d]xرc+W$u+Vx=9#^~Ms?~# .yX{9rɓ$ r?ꫯ_fggg=zTͯ88x…W.**8k֬;Œ3)G߾}###O̰9::Ν;)|2F[bEטuv…+W{gϞiۖ گoq&o 1sLHԑqA\\lKII/6v>}t 6lФ===]OON߹s݃I}}oݺȓSYYLϿɓ'ɓ'ϟ?oDZKvvv)S!/(~|! |xo]v,X^=3JUTT<|݇y/,--ٹ{8qD''vKS~:2P`W]vwzC]pFvXWW% ƍ׫W/&̇-ٳNr;8BK*++###<P__#i۷̜7ݻ ?~j #VmE^PjcHl6#Fhk*gggF@p wwwKKˎ ~aÆ+ӹ499955 wygɚuLLLaaԩS ~СC4668prM^LGGGGGGG>ǐ  <XGv^|ikk+ cgff]BΝ"H$RZ˗/bxǎSL8p`*V5Xܦr }#: l6_J?>|6o<̨.X,&F 8P$ٳoQ|TttttttK.Oʽ׷o߬,%l߅[@LǏ˽p6n+bX$-Y \tI\___%޾}VQQ1d:;bO./]D'|SN)VYY٫W5k ? vԹs^#<}wmEBP5kִ{۷o陚vίwJ9{4Vaa7oZV )S%iٱcᖈDwUcƌE>#E9rGIpww///o[JJʠAv֪%-[&ű>|rƍdT!!K.4˗*<..NٳU{T͛7-~zy͛7 В 6XZZ*ы/$[%0sY===77oߪXo> m=p̈́MT$`E$=<f9e>>>@ng//ݻw8p@󹸸ܽ{O?DC INN(,~A4hʕhUVX,rPv]9aSSSKKO>D 4Fl`ddgIW\`0_*.FD"===%vSG?~\z85(!!aᦦÇ?Ԋg#)%v O?n:_333,d gΜ<~UT );;[G>trr EȾYɓ'{)-----ݽ{d&Xlن ={]ַo?S:C޾}?gΜ7&do˫}3ZVr ?ѣS+<"xׯ_/$˗VuuucHDyyg̘1m4kQ_7nHJJ211͛7...t:]͵i>'Y5-IDAT55ݻwuh;w\zlO_^і-[6m$TڍFmڴin.\ؼysJJJy<{nn.TTEم:l̙3Ǐ,hϞ=ɧOnWvڵktP1cƌ3}ǒ1$uiilKII2Ǟ:uf+ӓo@6 Z1uTuV-kjj~$LLL$&"??IO'$8t#"77W577o0`)}}Gq[[ۧO*3lK޽ܝp학%$V{*.X!Bgaa!ҽ{w.\.wƍ'4^~SjuV==#F(3`C$-һw\zMK=z4HeelKJ988ܜI~Ǐ;vԴSmQxTTTٳ㗕5y3*--UfƖ{IM?H v :^__/R__ohhѣG'%%)9KK_#hhh(**u֯`+G :cŊ~܏‚%h X vvv[n<OJ`ccpAA XtU;I3j)袢"77W*?N7gF̙3A5Ouib111?Saaa}}}QQ?lmm#8HvXoܸQ]]/[LwA޹sGzKllQn277]^^XXXܽ{W;m ;v4 i׮]r; w\:bΝIzzqLLL,,,-[V^^nddԤA^z`aaѭ[E},wH{644(YX,C uEGGG}}}Czxxxxx+(O=}Yryے%KVXA޽{>ijj* {{7/?ö΂ǐ@\_dddP]PL[߆`0RSS߿(M&͛G__&B3fUUUgΜYxqTK֎X7oޜ4iՅtFO޹sÇ jժ@1]` z*--wdk """tywNmyy7{h s禧Ko7o~@+`BPvgPx̙\rª:3V A"z4tW=x 88[nr[PPd2Laa@6J&0@G-X֭[?l6p86#yC"t-NAh("""---::Z"?%?STJ AAA-AAA/I;466nٲiϞ=>|ϟ?/FԬZbɎ=ydSSSKK+VHׯ_466vpp8x`A!H&# 3,\SSsU.Ǐ<%%e…!!!/^_r RSS>ӑ#G>{L:~nnq&Mdi'O̞={'Nv횂Ѡ#tNhаefffuuurhM6m޼Yr…͛74n̙Ǐٳ'99ӒvdC 899mڴIyfIAAAnnnk׮|oIVrGkɵkd1cƌ3FqH^N-@4qDe[ [ODnnl 577;]޽ d[8t&X&?\ZF~oPLݣGD  Ur2Fk+"7ܜX,i˫W,,,d'gYYl *--GMmkaazzR|(^u4D...&Ldee9;;+8D6cXzH*{[˗}|Rg&ekk+w棵D>L܄@"??(ٖiӦIlll\__lvBBlٳglCƏ#"رc%wh:tj[t[h㨪O>\.nٲ_~|>_򩋋KlllCCZjŷn277? w*8ٳg,.-----駟ϟ/홝mkkWVVW*Auh4M~~3 1cƋ/]xQ___ڿM,ccc=<ydabb2vثWZn#|ϟ?/FԬZbɎ=ydSSSKK+VHׯ_466vpp8x`Ať:Ʒ%|_e(Y[[v.))iSڲlٲ 6<{_vo߾yܹcaa!yCYYѣGݻ'jѢE111o޼skw1mo::?0P*[aq8 hT!d&1``1gp62uF)ZX,_q}^7wp߶wTVV>֌WYrŘvv/ 7Ŭ 0WqqqYY"sm676֑~97ߤ, 9R]]cCUVVc4;X3JWT*ِm1%%%ɛ':#T*Uzzbtbg :**jhh9288(Jjmb׮]f̧ph)))(W:+kV-`0BBB#bFGG<ĂH$̑Ngas[n3G|A7-f֭ZY G=p#G$4oX}jjGA/J֑􁁁z[Gx-1--)ZRȼ}ccc^^>>>f駖d_5sU&9KvvvSSs)\n9B@m.V Fh4TTT P^^k2,&$$, M]]]z./^^gHHG}t:we+WŽ9r-<X+a޳O6%VP(D"H$R(֫ 6X/x_---BP(&''8qYfX,.**d޲g"H(򶶶6l~=gH>`0`pL)--uw]%(t G(/ gϞ(*;;>tħB@K%Bsr|&j{JR"tuup;>QWk(WAK %P!^Fv_#>诿JI@099m^v{,|9"].HR$#W?B@K%BrNN `>^H___||<'?3QܳwK/QU[[[__;=N#X$i4~I*JҟYV[g_{+ hΆ0`pLn  V<44TPPnݺu {JLww={ ;::y`??TJ .޽;&&F o۶U!N۰agU*;|+NHHyᇛ9(di WZ%S833SSScd҅"):{MBX,V*.܆'`ɔ)e2YVVԔG(JD-[TC-_޸qӧM&ӕ+WxZ4ϗm[N$}'ٳh4644444.dI۩zSw>jxxxxxȑ#{%Z6RVܹhhhw=-9719RXXxAϊlE*|ggg{{{ccc4uz5]+J%fրUFmY~KȤaU(Z-sDՊD"ry"322#!D. X.9s9r̙Lϊl۷599)tatpp000@<' {zzF#f̪pΝOmw\jj[oENMM=#?"7m$EQ!!!^^^vxU(J?! ׮]Im \~Q2]XtttFxܹ{W Nڪ3am6#f7j.lvp|| 6ωH^Weee֋ܬnyyyo߶H$===)\zu```]]^ d닌&6UB`( &>D7440GܵUgl 0+t FC2mӋqtt)<fʼnׯ'&&Nuh"## tcU;00G6t:/y CCC?\f >]cccbx||dV̑ryl/}}}B͛9+zאz{{#}}}Y›7on߾2++|ݜe.Ƥ$^OkhrEe.FאX&$$YyX~SO=%IaUxƍ$HRRҍ7Q~1nٲEјLN??4ґ 8779ؘ*O<|Iݜe.ǪhD;v͛ tcU)ɓ' QbO^yisXFEE]|9rҥH}E-@ 5FcLLLEEeFyyylldgb pƍ_|7aNGTQ|SN7Udff_~922b6믊˗/ۛ6m/q N릦laVWWK։ >?U$MO>dwwlI.r=~iZ* H$ 6^ج?$Zzy YEj4;vzyy\pW8{HZoYJի*i͛WNKK:%%ɓܴY*̙3d1wܴ4h"{?̙3QQQdLpǏYW@!޽[=PH$g~i '˓VXxb?uTWWsW^|4>r䈩i@@,--u/\Aw@z{{>tW@X\.  ݩSUI#paaY:,&ڈb28}t``g0B,kȸsӧO߻wa TQQaggW^^ޥK ݻw?tȋf˛:u}|}}J_ 뗕EoI`!袢)Sܹy<{_~ ‚}.}h`SLٴiӴih(3ggg?vMcI =5c>} 4:]ZZJv@gϞ999i>yz(Cz+ќ'!BQC.NA瀡jtuXi 62L(j6b h#|~=4q: 0Цg jkki) 2`M+֭[>}?NGEAmރ 6ZA0=fpjjU8/z >_\\L}=TbV/Z&11B 714mx%%%@%f )##"eee_M'[nQ_5#77A$kk/_R\@޽{k (((:  6bY͍q4PO,khB@01iEa gqO?TT " h10t8:ammA070C9`@=t& 0A?Qj4YI444rkk: 4Рv?<hPXX ,#`@' 0t`A`@@ `>KJJp[10Р655577/++$999l6fdzGDD 6XZZDz+xQh0vpeeH$JRT$UWWknݺ9<<\&d~iݺuVhqL ؑ&𔔔Ǐ[.\8rȵk6f%P(T<ӳ\Z>¢K]/_oSV@S}qqqAAA-AAAZ;5mٳ')} |%0cGngddxyyixzzfffjz_vիs裏HMj`0n IPXYYix<\͛ƍn9sfhh(|~t|TnCڳgOjjjLL\.111aaakX,&dh"}FzZ5;rr\so[RRhLvСcǎM0Aϙ3gr8ƍ-au z\B bayL===]E"i휛;|p͖ÇXС @nGGGkDGGh蘒ْ@b}@= ˖-qƎ; Bؾ}͛74֭[xq\\\iiB8sŋׯ_Oj@bq\#F9`~;woaa5klmmwC  w޹sZ!PE < cqrrwvv^"*D:ꓰi=*++)( z`Tuuu}}=ҧ3#J9UuX`@"}.VuX`@֎`@V0 F  !h8'''00f@LsCC<<222;44TDEE]iK.ũ9lذϓZP#`rGqqqAAA-AAAZ;9rd͚59`r8##K333Sk礤ǛXI&%&&ZP#`rXPXYYix<\sAA˗,Y"J={Θ1V9`݆7,]_~>h#I.ZU&0 bQB}D"U :4??ig;;{Y[[[BaUUuT*ѳMMUMM UQ_G"HܚLj1@b"gϞA¦U@r?::Z%::: @kYf5ܹs#F >VQQ'UFB0Vl2//;v\ ޼yC>Ϗ iӦqܹSNZ!P˗: lggGRIt!wbn߾-;w-,,v633ȑ#'O8q"4/.cE PFg?NvI@V݃ X16$0zm8caC`@PCuZ&0+0P !4+0Pfj.++J(҆AX[[|zEzl6(ՕPQ"7+++}}}E"T*J"ϯZ\Jr[n%6XkĠ0+r822;44rБ#GFEE+<pFFfgfffskjj=bH- ׶&pP(4[x<\.o ̙MjU@60CamH6mjü&ڈbCm׆`` Z5:B.+5_[RRhLq]aE^k CdbX밍 &w"Hܴv w(Ӟƭ`| `h͖耀MI-C< Ƈ^lٍ7vءP( o޼m'QSSSWW׶qbn߾-;w-,,H])0P۞¡({AB0&&/hs(U0Ġې , F  Thg",0>`B/&喗$z! yyyvvvmK.GL:"0PǮmG ?߿guX`|@:L%V`0>pNNN`` fف2W^7oϷ>s ٵ5ڼ"H*JRHW]]㋋Ϝ9~XEjy@'O0cDnGFFz{{r\.:rbO>;v#wIjy@v&>0Fp\\\PPfKPPPll{|7Ёd#Cngddxyyixzzfff3 <<<ȩ (CM2Baeey\. $4)&ކTXX8k֬C96b2A/^*(( YH߾}q>H%F yk4!VRPP0tf͝>}޽{\ [푑,BP^&6 /bkH$77M:5,,Lkg t J Rњ-Z;M2eΝVTzI;ARqrrnr^lٍ7vءP( o޼yx}ʔ)6m6m% 2&ٳg_C,+!!@ ܹs'>>Bkw.XRR+=HjB_C{AB0&&gq!QjcTo߾0oCQQQQ^^޷o/ Ȑ>f+Wܾ}74^%%%<π 젞.T*/^m۶GGG;99o?~oannׯ__YYvڭ[FEEmݺdnS`+TT`.kШ80y[nY毿<+ibb2uׯ/X`̘1 8x A۶mr뱻w>x{oiii _ziӦs熄ܿŊ...~iLLǏZ0 ggga ql9a=qㆋE=x˗ZA][[~ƍׯ7իW&M:t萍f;w޽{ɓm"1rovYƍ>, @=ѣGÆ "<$$… K.]bWZPPpҥ=zL0T]]]ϟ?腌 2hxADDA,h־aaaJRT>|ѣG<o]Q޽,X0{lKuvmv ݺu3 8'''00fV:!!aɒ%?T5:888qٳR9+V믿:mf)j`0& J___H$JRH$󫮮g^.yf''FSubo|{Ҳv , 'Jkkk L0pxxxJJ- .9rڵku šss?<$$GtE>foڴɀtww?q℧ `^~mjjJZ;wܺuk޼yyusqqqAAA-AAAtc666J2333%%e?ɸ&`OO{v]AA SRR4۳9?s>}6lؐ6|z"""ڼNAaOOL1,@wܹs/^"eddv`0zR/x7zabbbaaqF}n߾tҞ={׏ ݻwϜ93''Gד'Ovrr :thMLLz믿SWWN>N2ʕ+# wޒ y޽ҥK?s6m4`K?^111C駟Ǝܳ{̒jJ055l޽{32j+q…޽{;wN>r"hժU3fcǎ=w\CCC;ט}v.U*++-,,^~mŞ={vڴi]&dɒK.iN-..^d ۸qcBBBUURtWDλw~>޽{G6򫫫曒VE^0(ZmٲngϞUSsϹgϞ:ɀKHNNY~R_~ի?~(CBBR鯿5`L ~ᇲ/e퍖G}NNNvvvF? {HJJ2o2;;o߾YBk6/!>>~III?p9sRRo7nܨP(-aƍ03339sOCj666Ǐwygرl6{߾}zRlll~s<(H[ӧO?rH[[={\~}ݺu{ݻwG+B7qcǎXvm"88ޞㅄ\r%++Ks T666-{nq7Vv횅v߾}U_lu{⅃ôilmmǏc\→{>}zC233479444l\n%!44O>f{MM֭[Ujaaq믿VzUukhh8tЭ[N}ҥK9[o駟N4Iuɪǂ ۗ2dȐb;w kf̘q2ucǎ 4B*~駣F2773flRYWWl2KKKQ'Nj矾-AUn޼zR8TDž>y988;׮]:t]Ts5:bmmnݺ/ZhРA/^l,gg篿3W\ۀƌs2 @۷1B$66v˖-111Z?p8 .{zWVVv3fXXXܿ_s9UUU ~)ϟWXXhuE n KMMmt҈#>c326$+++SA~͛7Bȑ#/^wީS9rssswȑw}w޽Zŋwy9rݻ-ٳg;v_=nܸVͥ+Wzxx^K0ϟ5ѣG!!!7o޴.#!J_H4vv>q޽{ .fftgAWTTxyy\ =z4==]uVNvҥzJuuu۷o߱cǀ8NϞ= hhhp8999Gq޽KhgϞEFF^t)##cСB/^vڐ!Cի.]hSbn߾-;w[L_Խ{w}@ue˖ Dr%GGiӦT2 ={H_[_|_4nJܹs>>>v2xmT˛2eʚ5kjjj讥c())zQTzaH4z#F={V.7FB!C8p[ҡΙ3g޽ǏyCҹe*V0\JJJ߾}_zO/r斔TD:pҳg+Vܼyرc6l4o4,..޹s@ 7ozuLZZ'4?yf___5xgggGDD8;;?^}-aJJݻ}%^zxwy N]PPr8lذ7xٳgIΝ,F}Ç VUU}ν{ LNNV/L4f999J˗aaaT}ӧO|׍*--ݵk{xxxsWthӦM={v{Rf"/b!Ԙ=N>M^%_}uRii\T]]Y͹w T}v>}֯_n֬/LMMgΜyƍٳ)S 0`߾}5T*+** [@0iҤk׮]vM(zzz йs纺޽;99ٳ|ѣUGzvZ'aaa<ڵvvv1sYf͚5z֬Yu{]lmm.]jeetJ>yyynnnoO?TZZT*%{o]zuܹ=-_"={V5W;L˗/߿ŞCU#;;444̜9sՆ]ݍ7cG ;4o7ի .T]finn)H*?m\\Ruƍ;&HNqѢE}}]񞓓x+VU/:"JgfX,k:>W\;w55jTLL@Svsskn2RYQQѫW˽vڵ`??FBgk)J\pB 6:riV5666}{S۶msuumrM &Nxd//H}ւł 6lШy7(A*_S=z?nMAW۷SSS).!ixxxJJJ+9rڵM;޽[uAdO>mq-8L77xu֭[wIY=rvvr`ܤR)`:고₂4[bccv޳g:} pqqdlٲj*͏x *0` N  }lpFFFg{zzfff3 4V@˗/8ueeeɣG*܃ݻw~W^^=\.3fLddOk!h%%%͞=ʕ+_`. `:!),,5k֡CI_mb1eAѣm6}޽B,kh`,TX[[[Dbkkn/((:th~~~s ͝>}޽{_/FڴiSxxxrr:uAkH$nnn-!//oԩaaa/0//=sQQє)SvKjU`p&&&/싰***W\I=~^$??~kׂC@"z ۷o@ kls ^Hҁ` IǸ ` hY201m yH6''g7Ao}ZӧgLc[ɘ00E䎀+++}}}E"T*J"ϯZ\Jr[n%6%%<<<%%ꖅ 9rڵ: KKK{j1is-̄m#ุ ͖XEFFFDDZ ///OO=zbZ=Jн{*SSSuׯ{+W\ioo_oq8ݑa[˘6L}t#cmq6̫Ui[l 3ӶĐV}_rrV^RRbeeu7wڵ5YyR===]D"qss:{VVP(4@cBEXњ-Z;+P7Z$=O^QQrJ  o/?cee?GRmٲMɺ?Tk֬5jԕ+W._<|5kP[~c:6Gomc@w=zVːA.={{i{~-]ӧO9O>A=)==_~4ղݻwѢEʖ>7nѣG5[~ᇈzn)4%PXl,[[0yt[t꘶7]2dob:kހ;A=M8?l?}}}骧R):{ף_xQww8\I9zY\\RTT4i$l)CKnMƆڠ[0yt[ta@w=Z2voдZsogddxyyixzzfffUONE^\ԅ <<<(JIIIǏ777gX&MJLLPSStQEW:lH豥HիϟڵWΝ;>Bt-`5´zNe@{𡺽{6G7Cj2a4of]]]>%%% z*G<O ǻv횺Ê+nݪ'?{>>>ǎl9t~fΜ9s9z5 &nO& tףu*cZ zjMML& {jR;L6cV),,_F ƍ@Kaz255mzk„ Ϝ9݂9嚊>vXqqqqqѣGy}Ο?:t'N[jjjƌ ) M>=556++?\bzRkFMɺ?TgϞU(s}=pe[0ySǴzZ[-{:u*??ٳg۷oNIIQMmހ;A=eggϜ9bX3g6:d gxݺu yz/L Ƃu{\n=Fl _uss޽W__9U[J=_[Po5ɓ4m=r`A1moVKк7]m||YT{>},ZÇgo`<0@G` h` h` h` h` h` hj*cbb\!=-Zdcc,Jr[n%*z(JdҢcFwEFF&'']uVMMMPPѣGY,ݵYaÆ9sx{{]ɔTiq]gΜ񩫫nw F¯y %>>^ ?Kuf2m!ks-̄mk `w8# ma,cl 3a[MИh ϺΉfĪƸ:9Xwֶg*@Ŭ: 0lٲ Xƴ9f2m!1\f$E F:`R3fLRR݅P ˫̤ ~?&t@855uժUŇ^]zu޼y|>̙3d @N^hMbbb=Ǐ_\\|̙⨨(&x3Щ0mH!!!wV%ٳ>}%K,rt:mH{}޽~~~]20SXXT*o&MMwES\ED^^ԩSO_}u҅ L4I*v瀕hNݳ-%%eȐ!%bРA'UPA瀡JII>|fҥK=JW=ARRR 2bJ蔚*4[l[oU5@6jwtth2tPXjeee@0Ц `0t` :3fpjjU8/sN{T,--KKKJ E$&&]XF,--˩/ Jz_FF%Ed2Y߾}^EFyhs `@b>uͮIh# #u֣G*KL,kh$U`&qQhX,\3 N q@@'qhVa0FY$jkk\ns0C@bkkk#!?`@0hP\\N 4(**qN 4}0N 49`0 @zl6(ɚY__1l0cii)"""ɮ J___H$JRH$󫮮yݺu?sxxL&d?ӺuHhEXx21Rq)))ǏW,\pȑk׮mڙfK$Pnygyy`pzgX:X<}F^Đ; l ̬icϞ=I S]]]__b(47r8##K333SkիWϟ?ڵkW^;wG}Dj@RAq#mH Jr7oޜ6n8u̙3CCCI uҞ={RSScbbr\.IMM g^mb1%C[X[[  TZ5;rrVRRRhLvСcǎM0Aϙ3gr8ƍ-au -^*b62{zzfD"qss977w-Ç%>˗/1 75[vvttLIIlINNvpp >CII klٲ7nرCP(۷߼y388XAshnݺŋŕ*3g,^xV3\BZ{b%$$_~ΝA[XXhf[[;v<| ݻwܹVkUH*<ٳg@ r PFO͙3gΜ9d˗/) : 0y0(T*>M+kk뒒 J(P(zejjbOP(( z`' ڵ+ƝH`@)i`0j`@ dl6;00P&а~www333'O]PU` J___H$JRH$󫮮nU$ٳgˏ;v1Ra B"##CCCU }ATTڵkvtRnnn\\Æ ;<| #ุ ͖Qx IDATX9fRڵ4ncEngddxyyixzzfffj휔TYY9~xsss5iҤDR4 G<O.k\PP|%KHgϞ3f̸~:* oYt)ݻK}5F,\2˗/qH,kh腀ekk+Hlmm-Co޽{ãbPXUU{-&&n{葞Gۏ?&*1䎀5[$[sI-hW___^^r1#75[v5kVΝ;7bjp8]ٟVTTՑZ-Ƚxٲe^^^;vXr%AyÇ4|AӦM#ܹs!!!N"BR"K.G.ؐW-X۷o @pΝx ~}=rɓ''NHj@0x;&B(47љm;;Ǐ] Ơې蕔6>0V`Nnnn>}Z5 F`@/^۷U X!:21Burss[|>#`0J`L&spph,|>zhTTT(JKKVekk[XXHRI4"=srrl6 dUPPJk(bm8L x"H*JRHW]]{.Rx[ZPmlccS\\]!7###CCC\. 9rdTTmmm,X@jm@/^0AݻwP(d@#r8...((H%(((66V,iiikM*8 FllMMMPPѣGY,^x` ( JoذaΜ9ޤVh!h lllp'݆iӦ6kX,6tv8 L&F yk$u\.W.ڪ[JJJ6nߵk6W2_#`X,:l#/kH$777BadjTUU~a^(њ-Z;+P7Z$Pm7 (˖-qƎ; Bؾ}͛70$h5DnX۷o @pΝx RW F`Ƚ PT݇qh&`#`0R XbJeeeaKkoo1*4`@v`|@:Bacc%40.??!*666Asflv``L&kիW͛---Ϝ9Cvm@0rW$IRT*v?~|qq3g/H-K \ƈ r\.744tȑ'|?vXss#FDGGܹyyyvvvYCnijgw38^ HAbCpFFfgff>^pÃR? U `Baeery3}VPO K.P%Ў!Κ5СC>>>zbX,&LWA8 $Z5\.xјɓ'o޼yĉH  ,--۹\Z5-ͭyyySN #0AF`t `h͖耀LsN___R*!"7-[vƍ;v( B}7o;h^2eʦMMFjI@_#CnX۷o @pΝx ޽`FgKKKIKUpL7W  cbby~s@}|'Yڄ lҪyl̇ /^?}2^mѽ{!C 2Dx;}|uȓ'O xf]flv``L&kBJKK+OOA;wnƌYYYǏ7n/oG3gάfdsD`W^UUU]EDRT*D"??jPRRuDEE:ujѢE_HO?׷9뜜gggC- GÇ̙3gԨQl6[(t:22;44TDEE]yBCCgϞ} <8_7Ӄ eggP ZVQQs\KLsL#JKK\\\F(zѣ?}˗.]ڻwoqqq}fKPPЮ] aÆ=:33im۶999M0a塡L#3g lll.]dJeeT*zӧO?~KPheeemmWGGG{ځ={6%%8p#T78::FAWAJ$ͻ< {F'N̟?.??>zǽիeeeUUUYYYϟ?˫|뭷fϞmiiI^mo߾gϞ}wZ˗lrC-vUUUϟҥK`` e+affo߾}Νj@  ү_v^7S__y֭k׮ݸq#??0`K޽9eV {UUUׯ_իWg$cXǏ߸q%KV^訣T*rJrrrll,0`L&+..433ׯٳgFѿ@j]RiZZjРA}1gΜLC-.{jN"@4\@za=abvnn׵jOeUER"" EHHńy߼#qax> s<+W痖[N(:::fffz߄@ (,,,))puuc2MPtwwwvv>z޾>>>JM__ٲeFFFHQ~SSS cll3NT*UT(J==I|Uj_|H(DOB ¢"f #::Ç022rI8i rׯb2K.EڍÉ9pO8>!88رc%Ϟ=kll?O [{OXlT*LLLl̙3 FFFyyyUUUbXrG}TPPp۷ر#***<<ϏfZYY%$$444yK677Ǐ߾}NMM裏ݝ׮]Q]]݀C%''رGGR=<<###׮];:::::gBI}Ǚ&Oڐ_|ӧN}2LKKK]]]FPIDd?_)KREq:446lPqɓ'ʰw144=%%e޽_x</>w޽766677ZiժUvvv3 ظk?w܍7f3˗/ܹsjd-::ZB!ϷvrrR###B1mhhp]?>x믿Vy뭷}iFH$#Gq\"]ݹ4˗|>yf__r}ӑ#Gzv]:44dcc4g^WWWrr͛7R/V^f͚͛7GDDEQe2ˍOLLP(YYY999qh^`Dcccff5"Ǐ޽{߾}SZyx\0w^OOϤYd>v`0VXǙ0EXh4 a [ LUUR(SZƍxSZZ;GGGKJJk----`0{{{>J AP W^R]]]8P"D"GdSNxǏ_|_H#Wt={`\?P(#ooﺺ:t~ⅎGm޼9777 jGݱc7Nvvv|>ʕ+7oT(...L&dt###cccx422r/6mC`zr8Կ/Z." ===q˫~ӦMȟRtÆ ~-zݻwgqqqK֭[WSSSWW T944p\nBBB~~>FnmmD}}} B.#s___АNK$X<::1~&)HFFFfM }C~|ombb2ICsiadArȃA~vF{zz<흞d޹sFFFRT*DO<~ݻOi|222jkk ౔@ȻIK"  ,yCϜ9a+1ކ$CCCW_Q(:j!!!.]njjJHHxY||<i011zj@@Ν;mS8T>hiҥ.APÿo$bll|۷xzzjk׮5K.xof@@@^^B xP()))V{-|/_D?@xxxHP`/(JΝ;4Z",hhhصkKKKKVVV`` LWbDCXɱc Lq}؈!h]ǎXJ[lvtǪ?I,{{{DW}P(ܲeӧ´_/JEE?<3̏= Q(77z<>tuu}'twwoڴ)55U H(88/`tdd$rUJ^^֭[5ӳqP\[Lr)JVVVNNN}}ꉬ]{CܹskCp2EޞTVVFPX,s}}}t:{Pd9NEX`P@ `Pe!@r!BN )~mgggRRRii)BHKKt)XڪMx >`ȅR.BN6塡>>>>>>aaa߽{'|klr̙Z5歷ZfGRSS? r!BN6...C+,,Xܹs rc<==_5P\\\NNF50X%R1FFF BG|BJr!'Ex|655eddLcY2 rZHPV: 9-\p2 RR5fffӟTVV3.Y<>>11Bdee/_Vyr{!hgX,_~)++SU_`т]L6$P@ `P,ٹm6cccccm۶=}舴u޽x===kk^5"::ҥKt777ww .hM,;;; ˖-333H$ZfJ{t:]}#c7^{Ndffa`C [瀝 F#[oђ74%jSg?r~dl6O?JRO?uvv$:.edd|B//G"S)JHHHee`uu5=wc{w[[[ /i&y6l7ߐfff======ϟ_ 1PIDATn˗/U3h)\]]?Fݨ߿v[n ߼ywsDc~$0rnud 2ZFLzvZJMMA9{,QPkk+NG?1դz6MP\+//tӧOƎO֦sLdXL@}#c7*& gSwAA=VG;-%Io0iͰ7 o'P♡qࠞǣ;w^~{Z3000Ne˖􄇇#dJn \[XX4]sPM@;SIG {yxzz677ϴ#"Wv횻G*\h;wgɡhD9aC#;w޾}[&d7xF XM@;d 4beeERLfLL Wio0MT*UT(JR6눈QW𴤯`0g ۷U3۷O>QIjTfJYQxʕ+322pS[`d4VG;FKlomhhh~~H$R*mmm'NXbEMM 2u;A- Gh4Ǜpv1 ]]]&m۶{jG`غcbbLMM׭[}6suup8iiiStaԞQ]xߟNk^p$wA;VG;FK!7,** mllbcc|>zK^zgޟ#(  0@(  0@( |IENDB`gsl-2.6/doc/images/fft-complex-radix2.png0000644016036000116100000003510213373111455015225 00000000000000PNG  IHDRX pbKGD IDATxmlSqNn mTK"^iY!0MXyБ`puAŤMF/4TꦵiEDJfmM5F"QE R?pNmq;wQr|:si/ J!@4 A FD#Bh!@4 A f <}O?dɒիW?~7lp+W^xqΝ~; f^?_o^oמzO>*(LNNw޵ha/+V tpdd'x7j [3/X`C~( Eȵk~6lH&fyzm>O8nm%v(e+_OVFܼysƍ/)0pƍկ[]@mJN۹>]d}9[5ru}h+rѦQG޽{.A rF_rædnĨD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bhʃvz^ٛ@uym Ξ=RZ^RNnpu}lEEE>+kkk;666յjժ_pnf}q~ߝ8qߟ.߻wo8#^(l7n(++=E2@5[ѣG׬Ycu7[`Wukjj֮]788amwSF?YֶbŊEUUU9s&  3`p=A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4{wڕz p۶mgϞ^MӬ! w'R7F8WH$ z<`0k׮`0UPPPPP5´oDnhK;w0$=:L~6x}}}ԓ/]dգgǦ$-| dO?3'^8&%%%>zqq@2󧟙/kɨ{Dacc~SS% &O?O<a]]]KKK x<@!||7´oҲuVBŦ/#|LzW8Q@ŝM;43!P^AHL}A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bhʃի[lYxŋl200`peoSաP? LNND*U6Ν;rHl3(S/^/yG>c||Wiy ۷o?%yyy###3]رcccc]]]VZ~ V^_8qDUU… w_rM^o8V\/ pґfRXXSXX[2<_~~~~~  х^[Yu+[#b9bܳQo ,((/***&a[[WR#reF&&&|>_lɽ{ᄏwM}}}=$U^^~%0QoeÛL8>x`:N~zWE_~ԩEappPUq*PWWt'<c5žؒ+W 5e˖}'=$UVV&jX#/Y|Ṳ}%K}SOŖݻz7lll4~yyy~޽{K.ݺu맟~:119UU1b[pL.δgF6UVVر8pСCݳ~=Bp=Fsrr:;;JKKKKK?>ܰ.!5BGD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4о%(A_ Q^MӔ>իWxǭї8uԩS۷o/پ}'>(S/^/yG>c||Wiy ۷o?%yyy###3]رcccc]]]VZ~ VNSMMMLMMeeex|{ߛjV?3C)Gw[XXSXX[><X ٳgO[[ۊ+-ZTUU{R;O@@Bh!@4 A  z-[/^x-[ X]Q:N>O/YdǏ ^l'5== Xw_ܾ7x[Vnn%KBo_ĮΟ?k׮ܸW]q#vnӠ/GOWL'p||: BI뚳ߺuCCCÿcMM~ k׮]==='O=|Çc9ݻwlnnhnn~wYm۶ٳ7b6 r$1+F$Q_-L+׿kVՓӱ_b͗_~y۶m_usӦM3]ܾ4Mɹ|~˗srr?;Yg܈SL TL :::K:::'S&&&m~衇FGG|׏~KۗiAXPP١%VF+3$3h8> K'S}P(mNNN>?_w]n׿̙3Kۗip?}UV555E/uhkո9k:t$K$q||))' 'Ͼo>}:m?}b_+;;;//͛7o޼[o^ܾ4M޼y~͛c[Z`5n)ms'IҾMv׭[٩_6?^UUǖ#}>ߡCKz|;Kڗi.]{{K.oԡ BGOľNSS488XYY-ns,++r~;6ݺuK͛-ܾ4M ~~ɇ~ ?;5iF>IR:In˗[U|\~'|Wjjj.rn}}}@xb?8 Kڗvڣ>_裏^v-[3nm2Iy?%ӟVZٹ}yk0] _b MGFFx7|Zu:;;S6:б]\v?/aÆok\'צD_YbRfO>䫯Z]]mu-lt͛77nK/(7n_ՅѦo߾; Eї/{[/gQח/9m|}ݻ/qkk(7lJvq@Q!@4 A FD#ќH$ z<`0D.<*z{{Ν;'&&Y[@u_wp-tU!XpݻwKܹcU=u8Z%%%qK-\F755YXuuu---@[Z]a0>B ӭeeeq5'Q x޶6NaXrf#^ӭ@Fכ #yK>1 N"m$9d nq5i%]P FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4a$ YYY`0X]84.w911 ,//_Z^^~%+ǰT7?~׮]^w+{ N@Syn۶ٳ)^_>\IIIܒ H#yx*‹/ኊ c&sKtQuuu---@[Z]؝i2z}WWWC={8cǎuuuZj.\(k0~'Ns{ szDpcccҋ=4ƍeeegH4xf qڞ={VXhѢ3g΄B!$sa&,'`T#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 AAD`VVV0D"VÜjfu &}Ν_~̭AsrQ{vq-tYu9hNFfzv.\x];wU؝椺 t>’%ŖTĜ;~Wda=`7I%|@ ҲuVaNzܽ#@  A FD#Bh!@4 A FD#Bh!@4{wڕz p۶mgϞ^MӬ! w'R7FBh!@47p8lu] IGGa&,` X]Ww~f@{!0FBh!@4 A FD#Bh!@4 A FD#Ѥa$ YYY`0X]X4띥;wNLLD3:YG},!\tIq]`GY ޽{W$;;Ν;;rHT"-)..#1 lll_~SSqDa]]]KKK |@e֭V`$t#@  A FD#Bh!@4 A FD#Bh!@4 A FD#Bh!@4 A  IDATFDSW^ݲeŋ/^e˖+{. BPfrr&W)-Ұinn>wܑ#GbKy{K^7zһAԍzkNھ}~O8AH xbee~#<ܤ=J@m޾}/ǎZj/\Bpĉ'.\X\\{p8_2&nzztu0žؒ+W r7n_ezLEEEww~IOOS9PMmnڴU6ś=zt͚5 Kj7*UVVر8pСC~ˇ׭444]6//opp# F휺i4''>b)gϞ=mmm+VXhQUUUoo3gfMA R9u#Bh!@4 D"`0+++ F"0r7;wNLLDSV؂ӧ 򾾾%.]RP؈ӧAhdN… ޽_}u8}qf)))[R\\lI%`&Lacc~zL º@ @KK֭[. cD>B%Bh!@4 A FD#Bh!@4PH$ `$ÔNWmۓnܹsbb"?x`]]UDFl}}}qK.]dU=):Јmp…w/ξsUD7LTRRdzz=b.*..$B%˗/{^{ݻwʕ+>l[[UP{{>{ʕ@_zl2nTmzy޸W<{ |(㨙D#4b L{``=<3,..c#t% Ȕt$fU$AyI_卍~?755[[H: l!0ZZZ ---[nHVI: l!{]KzBA 3]9 3РKL0ɷ?k 2~=?s'rFq/ܲ2]d#WM{oOs*ƒ|,ũ4{bf}*{l5OCݨ>BOݳ:6xnw^ vx^2`$n3'536g̠5o<Ah@ݳ3'6Ȅg >F*9' Xl4kncybЀgǹE?L:Pb:ZJjN$R2~O=;noԋoURb+#b 673eVAh@ݳ,s<9g*i=U*vW,F'`LvYf~6IfО<uώLN=WI PqLa}oU*!eOLQsJ=;*>sJeBw*z`ߔP6WW}6J͗m 42gm * Yi|a_ѧ9^(|EP})Z7㟍{ue!c9 ꩧrrrrrrzꩫWr˷dfY3 ^МV/PE9z_fM^siX#!722222o߾e˖MLLzô˷dfY3 ^}N}BQQCsKfM^siX#!_yz^{mX~R f@zwf_z"|SD ky$ :::K:::gaώY^@3 ^l;So)n=ny%CCCEEE0ghˀ{էy3=̳˷R[A8A"MMMLMMeeez<;O,/ 7P󼇌lش|MA`"e_` U H{gjRd 9gȈ4 e5i{lEDˉ_xWgUAh/d*738),6GFWCפq   /b eeePݳc_` U Ho⺝Q5׻UqZ`[=ny]|ySm޼ʕ+Jݳc_` Uf4rHѤH}eHQs[EksA9,MZ[ {ve :~*R-'IapkPĖ&-v8ЀggV<+Qbr*ju)3UcҸ^ nW4Ah gW4% k߸ B"ma+$GLm@)&^vЈ;V{ō t'ښ0hV*Y`Tb>gvLO IK>IixB3gC%]4)a8X[gUZCvy/ 41Ӝ+;1oǙF&RWC`MJ]XI׬9[#S|q"Ѐgd)Tu7R=hR5l5篐bf&q\&|8>iCPؓljD8c 1u@qfN@utӒXxT5XUƋyB{R7ŏ*k1zQM9I+ Ĵ$;ִb8rЀgǞL2q"|"VqIIf?88riAhx"CڿUIAh}A81m1gk>oLB#. B[}#`a ۾&mu%Ј˂pֳxaSd7#n{h^YpݻwK:sΉ:+ DkooOfLνs5QqY.[O>/|y\.]24>//++{/c>ԍRqƸ] K X/ -&BtD"`0 #HfNe֯gqɆZZZnݚهV:yDSL&waa3}e#6H9*Uݨw5&!P.q---ݷo_}}G0H$_vc~A3'=F]0ˤ `˗/OMMqPu͜<s@:BE{wG6Y[[EoObiTb- 4y8tNX#xf>UD&Suqf#v8 kuFp@ց>B8 k0 x}]p(\p\#@  A FD#SIl)>֓p"s1!z[N$s"FLBɜH|b}02 L '`L"H<&}d\?8XHfcp:.Hfcp:.5OXSSSlp`Oqq(ixqcy<MӮ\϶YU$joog\r޽{/PԱi4H$ݭ6p>|طo_}}Eu)>B#opt-c*#q6ǘpFM12}`!J.A rF_RQի?׿z<~jaNW$ܺiŭ}y}9S7WWWBP(TSS399ipΝ;rHl3ojjJdjj*+++ś8p{ެW)!JA&=ž+W r7n(++Tĵnuzzz/_f<GiӦVo~5k( /Xee;<ρ:!444]6//opp#  5œήҏ>>,={XbѢEUUUgΜ!J> FD#Bhn«Wnٲeŋ/޲eO?t~~%KV^}+e˖Iqr_ﯨXp+y/x7o.Y$ _|E jv͍{E7b6 r$1{d|8>ǫCP(9[~[?>44p8>v 4? /_vsÇ>|8vڽ{恁~{Kڶm Ξ=xq#6oӠ/GObLE4J}}~I}}kfU=i>==, |嗷mۦiUܾ:;;7m4ӥKӴ˗/\|9'''C[Kuƍ8ľ1I I$q|nذCڪz2ebbBzhttT׹}G?zgԹ}iџZ`5n)mκ2I2S_&ヰ`xxXdhhȪz2w B_?3ܾJKK}u}_jjjΜ9Թ}iӧO_jUSSSR8XqJC'IҾM盚/r>ӧcKO^x!ܾ?ܼy͛oV^^?KӴ͛7wl޼9͡%VFҦq:w$K$!mgxxxݺumUUUyl;:tH䭷wԡ}i_zҥ{キtKښ t$IK$q|:eM?E;Ͳ+W藸chQQѭ[Kn޼hѢKӴ@ |`0C[i$/_/Y|Uן|W^y&":'s0ԡ}ykע?;5=F&3Ǿ6mjmm/immݼysƍ/Ruuumೞ}?_?iժUџۗYtsKDvtkzƍ8M&IJqѶFGG/ݟo߾q뚳+WtkԾAù}?y'>|֭[n:t(///?ƹ}iғ'O޾};_^gq#Ni3/wLT)Ai˗7oޜyNc۷cWpGZKܹ}]~?ƹ}ivիW>Rf߸;iЗ'ɜ28I3=68~!AD#Bh!@4 A FD#겣[ IENDB`gsl-2.6/doc/images/fft-real-mixedradix.png0000644016036000116100000005410713373111455015454 00000000000000PNG  IHDRKbKGD IDATxy@T?sfcX]\rMЫeR~,UJ55dyuf.,#bL**J.`||29sΜy>rgy19y! %`w`` X`` X`` Xx;wn$I_O=T=Ǝ{!k` hѢ={[\S.߹sСCnڹsgjj={.ӞLo|ƆrqqOTH I TH  xݸ7o|GٮAuSn޼ r6NnݺiӦXs0i:]!\*NjD@@~ܯ`HƯk lذ,@@@~ܯQ.nK\EW\Ġ 0 ,@ 0 ,@ 0 ,@ 0 ,@0ETn߾BXS" 'JV%InnL&c"v} Z1m>|UѴ]krssÿo b" 58$SST'Nlmm%I2((ԙ~HktyoA$'Jo߾R)P(t:`;wݻwlr^{-11qӦMoQ ܂ &,]>ܽ{wz^ӵ* `ڎh>| vnzꩧA+ f0NWt_ *JE a@VjPPP|||p 9sٳgZ-I P(jV .lAd켼͚5ˋRXڵk{uV$ZgĉRUӍ7Ι9M\\^RtĉKW^駟:D5`G;v{57o0aÇV3?~|Ĉ7oɱ߽{BoS)[JѣGw}С &XݻwGcҤIdJrƌJVnR\\ 8 -`{ܿ\h{iiiߧ6g}FO=T^^^MM pc48_zzs233w}v9'&&.\w|W˗/~뭷0 [ٳtRZv5w\//o9ѣGoݺL^|Ō NG `|Vk$y攔6Zv:nݺu[nJ2|={:upf?c~I:ԵfE޻wo@@3hҥK322h!)3 (--ѣxɓKKKh-CZ[[#""OS%CBB.^Ln(A3ܹ믿}ϋ/&I2222..#+ӧO_v}˖- ]v-{085qWsıcǦO. =<<975u[[NoΝ!͛W^^c0 }Jrʕuuu ͛q%@j9;75V%ICd2^zէ3aXE$/L4Orx%n΍%bFJ UR_^ZZ_s.hXjz;}d%L3iҤɓ's3xd2٬Y☋FBAɜ ZVBP=5bcc8~0tǏ/..ӧCjBt% xbbb=[oukttFRTTqF??oXAs3f֭L.<<\Tr|!C\pѹs-ZTRR,rQΝ[|?s Тʕ+cƌq±-[e'z7o~gA9ݻN8[-ٳg~~>ۅw)jsꫯ_qsgݻwݻfN $%%a^h7npIIIjjjdd$ۅwɓ';pݺu[t)w[l?sɓ'^=׀ xر޽{\bŬYXRT;vlǎ/^۷ӎ[SS3r?Sbajj*uƍ/̦}("j{i _~ٳmڃ#GӧϥK>ӧO۷oʔ) =ŗ*J.:uJΟ??88#:ujܸq;G c$ O,R*b[T{i oƬYlڃGT*W^v58ሦK,X/{D6NFpmE GԆ +n۶mb/bm>16lyrqӟ P Z>>>'Otr XTzzz $} 0P(P 엗't:C%) ZjBٳgi߿ ?28 V `\NP( Jp0&J~d$=<<#K$P,j58 ` X&\2'' Ad~ۛ ݻw~7#={t$p xnll?l©:^ 4|ٲe֭{iܧbcccbb222n߾ݳgOvB xAX#GT-[L"|4/?XyS$Id2RiA`-(66zh$ٓzuZvxݵk~ADll#7_![R4>]WZpBo n}/^Mc􊉉A0\XXeɓ7lPXXhmԍO#1cvlBo9EEEV&PqƄ^zYaSSc=#|G H1cƬ]־mA`-`0T*MmذA/پ} j+ʬ5*==u:B&kE! , I;SLv:., ?c_nk/^v) AX[v9~$Ijږ{ 6_jү755Q7]-` `.ρe\.Jmmm?o߾m0A߾} CBBBQQV#lP/ں!8-`-GZ.Ը͛79sڵktZVN6?ݴiwwdDB e_/58. ~>Sgr~᪪ڴX,nhh`* e__p!,,ۛjn{#P8bĈ_~ B x˾.**3f ¥ۻzl  0C5[![=u@1cں޲Ce$p܀j͛7m -` 0T*G-al18 ek+?_~̕_2 o[6qdD+^RT_}U[[[bbb]w  0McP(j`0zBhaB Z71!ljrje$}rjpX,70px˦d;v ͤQ|EMfo  ޲uF:u*f{MA`-[ŋ?0s~/Z>8 ek>zFÇ/..~}0px˦6 %%%QQQt6lXEEA`-悾~@@%]<<|p+KҎ === Φ.hr]l6|K.u/<ӧOϛ7+_Y9V---6lJ&߼y⚘ 4]ҭ[NW^~}PPP||<5bK.'%% l %BaDDDII5mH[n=w࢘ 3fdff.̜9sf+_~1]RTTԯ_?&J3g} CaaaQQ5ҥKϞ=V_____,Yĸi~ժU>ѣG߿___Сg}vՌV|e1U*UBBB}}}rrJrZa@/JO477'$$="k `lRRqbŊ[ 0`7o޾}/hWV(mmmAjBᬺf sA0; ЃvzΝ;w\Kw`,˅B^H$rirD"t-`X&͙3ׯo7\L&z#CȚAX˖-qNI+Vܽ{j`05|C:`СC \~8tss۷CCCU0|#sA ,KKK, V0*""fV@  d13CEkA?Y +W dСW\1 A \ nrOX^~=,,̙%BBB޽ `0vZppT*ufI(@VVV `01Ba 5`'-˗/2ę 2L \~h0 vC`p-`'sAFDD8p7nt  d\SS䒀io߾/Z5`'3g33!% vOf.#kO`~B'00= 2ʕ+!kO]MEy Nw/LE \~|%4 )A?u潮.#kO`W~*\淮@ -`3\)`N[n e"p޽{k4{[0p .--~xߵH$jlx!AAAzB<# o)`࡮A gpv )`࡮8""z"""q`N,++C }[(SChZ}`N-`k}`ࡎU8Y^z}G2 SCիcJF08 <1pDDDNAu `Ci4Db-`7Ա,H`!@ 83g9sͬw)J[^tZ&<<ڵk:θ l766&&&FGGWVVVVVFGG'%%577wˋ9{ݻ۷ ޽;{ <=={QYYi\Na6322ƎgϞNWɩ4hD"=z?hyWV`fѣɦK IDAT>ʟ}ي+Dqm S #F.>|K:]nll^^^>>>&Mg<૎-`{jHS @%ݺute˖=s׮]{g͚uF+^jx jH0p nC۶m[xq=zo5ےIMMed(\ RSS;lk޻w]ب[n3f0]cYs Cgn4u:ݍ7nI߻wz3RSS;lGFF^ptIqqaúZb}{%J- X!X^^ND03f4]9sNW~w?0Xi3 NalK.1bDZZK/Dݻ >S $I/BRRAӦM#~x78hKsA3 Smdgg+ʐJR_׉'g} VԮ{ܙh0|Ѓvo۷钀4oYYٓO>n=]vQMMM`ġې00px ۷/k$Imm-A,,,L y֌`0p >ch LBa )`!c 00p xȴ  g"!SCT+ӧOkZi4"0p xHTUU%$$ԬXBR]FR=wILLBw 4˗6FP]FPPgZr  }^v!`}6$X,۷oYYۅy/eee"u[ ^)++ݻ7ZX.h0Jiii^XܳgO +eee={DCW.++3 l C!+bX"HZkw(-- j`X,h4!'J;wh*wUTTv9pJJHHhii FDDRQQO?icǎd270BPz`0 ]W\z^V+ +>$IXP H$r}1UUUs3gNuu5[ֆ$ty2,++K";v bW^NǏG3nllLLLNJJ8M`xgyFkݻwϞ=r9a q 4( r1cǎMII HIIݳgvѫW 0Z̕+W"""@T1dȐ+W]5fѣɦK>lf_5##c׮]SZZ:d j5"j5A``\RR2b%ÇtRW뷴$''a0R"c sq @%ݺujW_}uܹcǎe*+WP-`0avq6Ç[ΎmΤ]#pa C^|rCRSS;lk޻w]^ꫯB2t>}`0nb"N#2.\0]R\\1!%8 \ 0p\F~zxx` ?Y'0+Wzxxt B!C.]̒=!0XdL`>,p0 0Xb208\UU5g_____9sTWWwӧz=z;СCL.s(`Ț@hpf1111::2:::))ӕr;w:t֭;wٳ .hf8##cر))))))]믿5~x//͛73Z֚Yc<ҷoߖ{9$pOѣGM$''>|ӕnJWQ*֭ DfVC ,&6l(**rNI}9dĈKncǎlRZ[[ITT25`VT/_.))/sss͜o`\__h[nuuu7KIIIOOg4p% BVt:P(̬,B:NV?ې?c\.HHr̚`brXLD"18h޽w^6q;555SLY~}BB";j_52,++`d?H$:y$GjjjQ ..)..6lXW߼yGl:3`>իW@@ԩSͯ%㜒 RSS;lϘ1#33tIff̙3;]SNݼysbb"U+:w\tt04Xd~.hs9p[ҥKϞ=V_____,Yĸi~ԩ֭6m%:0gM QF? b6}||JeHHHHHJt/X]\ŹsFeq50Xde Lc>` BCCN>=eh׮]sΥ>Ursse2Z[[u:Fy'5^okk2eѣ _kZ[{ Vr<_z%a[P(LNN|rQQZ6 w߭kjj"B9rą>4\z{{ر$I &NH}u=qDKKKZZZkk`0 U󋊊IP0X/_NLL*(6VjRRRNJ}n_"B.j$?7n;\0|좢""W׶6jժk׮UTTS᚝M!oĉT+9??ҥlTɓ'3fjG `JEVO>=//_pT*N Rt֭>7999O?tʔ)#B*VGM;k0NA$&&jiiB_7 ֭kR&QZGo~_]VsB:jݭv0Xɑ\u*Kn:~'N\pD ӗk֬!"%%Eն:u?#LzꥇsŵK z\tQ;}Ο9I"#))=&N{+V$)J9y! H$H$82;`.hsA!%`tvL`0l߾}AL4=$&&zxxPϦLjkG߿j I9_5i֭w}犃L$I}{}M{l"4MKKKVV7ߖor +960s _vv6s&z{0W^MJJjjj2 tDO??D"O 4lL"cƌ)((_B`pSjk4$-[ /WNk Aȑ#V2~C͙3_wd'`[nOT*B@ g0|w@ x{{+JZYXXm۶y޼yӧO7掸 4z߮^:x`w7rHZꡑF;w3Μ9m۶"ZvK}R_|״ɔJQP(ӕ$sDUUիOv1cj14c(0hР{ :OԴl2$mMҮh۶mgϞepj:11Q$b-w|?{yޫ r|?K.ݱcqB%IR(2//--Z+,,dpv3m/^0 :##cر)))))){{^^^aaa"H777߿jB Xvw??#Q,O2Ek4> FgC͞=0XkFg>xqB< cEGG~Ǐ_vmbbJbzH$|衇خ=ѣGM$''>|ؑ}R㏨_~M 95qȕ^}(JI$I(M`%8))Ν;AuuuA88zAAA .x H={b'v]YfƍMx{{{G*ʌiӦӇzS$Q/5o MIDATMMMwޝ:ujXXoRŋRpځ[***ϧLbl|ryVX|ͷz^2G-J+N,YiHWI*J.O_|EMMɓ'Gh%qFm;PO4]Bݏef Z&f%W:`qѭ[7D" ===pv+Hnݺ>|7aʔ)}=XC@ }>#l]S(J$]v96R'ʕ+Oҵx۶mrSb'4!555G1O>rHMMMeo{ pϞ=kkkMܺuwf6, NOO7.qWL/uӦMN8f̘! &_JRNJ[Z#Ϯ?#NnS\B0))Id [n5~eff6&xzz޽_~ϗJvu1pq%ǏOLL4Uaa!Aƛͩa[b2777((H$ cM{cwy$I D"ѶmۜpD+S#&_>۷ofv+]^R7KeuBfWضmH$"$ 68$M"G?c-x*jZ9Y`FyGnݚ9sIJ;vxG/^SQڍƟ?zyy?Vg͚E,Z3f`ݜ|>ٳgԼW\B B͛ߡR>?#wh%悒C]\$ 5Mss+曁*MlN߼ys͚5ݻwȒ΢;6..nH.SEO,.hZ@|ҥk* ڟ@TFG}:`a9~VUUZo"31DOaGdɒݻO>){DBpԸn{~{ͱ–,Y* y/r~Z-C(**ڴiӠA A;G_nnСCROΎƞg֭۳>kӘ %=ӰԩSo*B^N[>\N]@ |9R$I2w?1b^gbl?~~Ğ}5{+`֭[)M0Y$T6A'Ow FUP(Hn=<<֭[sӧϒ~-[ӓSwxAK(2tA+>>oab,:zQس.[6aڢ]|3Bp׭[! E"Qn݂[?K= d2YNNΖ-[󫪪/_NNh4eeeݻwB'|iӦK]ТسgO_SS3o< ӧkǏӾ~t:H&6mڤP(vSm@н{lF òejjjl⺟q6$08Fjjz`'"bΝJG4>}/H>8b߾}_|Evv6lhh3f̓O>ǿO+01`/nXvmQQщ'|rRRREE'-;N9n8Zvh0ΝsNZvetEv+z~ڴiiiipѢEQQQo&-{]v:u D"e`+9`F,]T,;8AXuuQiSZ[[ tĉHwB+JҊLN\`" 00w]p!5k3Jr3f@IYf=sv JJHHhkkt| җ0 ,u@ jjZPرjxE~~T*pJ̤BԾ]Pjjj+@er\* NeZZZh4E8 'Oڱ#Gt:@ J]#P+++?mS^2eJnn.53n0v bbb 5ܹ3iҤÇ9kavm۶޽;;;;44MV^믿@w@}a0a–-[333|۷'M4mڴ͛73]$X l>w}瞛={1&[lٷo_^^^jii4iRRR;c~MRg߾}-ڰask A;qZyN(` w?~O<ѽ{nST񭭭b8??h8!( tliiygvޝdNjgkk^oκwuٳgS1/yyy˖-F) Bv` $ɂ V\Iĵkר.]zɦ& D"QUUի"H455-Z())/jB0""i޼yUUU4>pTԋ/3MѴ;wns=<\=5`Q]l1vu`a$.B !E  0 ,@ 0 ,@ 0 ,@ 0 ,@ 0 ,@ 0 ,@;Ijj*%X i"i i"_!HV^}I &Oޯ_N<}]jСC͞=ۚC$?_$**~E2nllLLLNJJjnnte\~ΝCݺukΝ{a<0cǎ˾}K.\rʎ+|I'xQ;]P!-P$-P!-_$+$\|d%ɇt[ӗ WWW3Z[ #F.>|KرcQQQ2fI,h4zuuuƍȈx7Ġ **~E$jZ-HoU[[mQy_`,(E4hzŀ^z߻w/00NjjjO}+ C5 .S\\?x ,@ 0 ,CWUU͙3wΜ9\xs/_\(O=T=Ǝ{!YPPdɒH$I&}ڰvq.Iv ;wJQQQ~-$)HS!A:n׮]G󋎎޵kNT'O7ng``EeBG>1111::2:::))ݪ-ZԳgőr;w:t֭;wٳSE\rԨQ?Sccof͚{oÆ ܩД`xgyӅ)q˗9r{;0--mjh(d.q!? ./RA2p6SIhG]"M*3pLOۙQ<g;z$#cvO> PPTTTqM۷oݹ/^$ ݻw!@$ ֭[Z3g޽{0==j*ʍ7@l Kfp;''իp$Wlõ1:}NLLyNx?Kr޵k8qIaa?_rE+D/,,sAF3880))aqq555 ü~N[\\ ~8 d~~#:@0\36?  V+˲tMrjj~/_& |mK>r&&&F /55BP(T[[0b^ZD-豱={zJaYVӑ`3-! &''V3aR$Bi:bI'"eْJe^^^cc#(ÿ| :=44D'YYYr8ǎ*((L1LǑHFF'bDR@b}$ѣGNJIIC &NL&8H8peٹM6Y,P[ Nꊋ-@9;z7v{,I o޼1b4I MMMyyybt:餭-''@$ Çϟ?/Ɂ:t")0 [?)%gffVVVck׮ 9% ޻wӧOW y֩)<OZZZ{{;Wn$>}LMMc(%GH P___XX1w^zz/fgg;߿Jo߾y~ddܹsõ1:}!8JRLNׁ ,IeO80LBB¶mNkIENDB`gsl-2.6/doc/images/filt_edge.png0000644016036000116100000032570713373111455013551 00000000000000PNG  IHDR@ 9 bKGD IDATxyu?OU\;!dIH$BXͺ\ W\7"*z냀?DA&,!YgO]]]ꩮg{z^Ͽz?ӟ:?(Rn! ,h`@EC *XPT4! ,h`@E[oO S <p ;oqyqmT>jтD, j`@EVkkhkk>S@UV릛nzb/knSeRyg^|W^y|1| My@`MLLtvvy2/tCC7(;tCC7(놕5P~ܭr합e}{wڵ}+V ۷Ư~k3YZnݺ=KPɪ !@١!@١2-̃={ !@١w]&BK@E;vXܡ!A ի "jjiik/ ]̃r7`C7(;tC%JEQ;|%]|/u)Z恤GA7p;w[l)b 5E]<3###gڵkw0 M!/ %H!eݽ}r`YC7(;tC(;xgϞسgϭ zu=F-ldff&uuuŭp!j E0 )0 АL&/.du݅;wv/k.,AQ ݻwӦM^ ZC `v?o۷ojjJT*ъ- PvenPM~رCz /8p`ժUҟ}}}&+ηJk,8_(;tCC7G7kIR)-H~vYu:3& +h!<~Ν <ӄ-[lܸɓʤ'xb.Kn0bf7\L 7G#XDjkk e  .D ,nrnPv rPve ,h`<.w;tCC7X8P= 55Ǘ^zi hhhЇ>nޚEEQGt_ۊn~ iZ PW}g&&&^uO~j$W=?44T'j-Y5% ,ǎ+w;tCC7s/+z[l={Q{7zƮ]JbBJ̃իW !@١v3_Rjj!ddd3L Xvݻy_rGGǯzظk׮d2|dT곟lKK[S'?s(?K/Zk]qn?˗c*dAL(Z5?Gwp;v>Wu/l;::s뭷zhݺu?>ƻᄏСC'HAޫGܷo'odw}Ν;oᆚi[~]vIA%ɯ}kh?SoSOp ===~;v};TܗckW} 3 _әәeScMcMq.\B?`@;y-z|˖-\s͚5A p8|eJ ?{_}oB㎮G}T~uϞ={ݾjO><\IgΝ}}}#lذ{ժUg;m}NZ__"}KֿmU۷2 _|)%,K͛?._K-0޽{7mz)jhh%|W.|UW>}Zzc;fofU3̷kӦM[n}!WZ\7޸馛?#GvE9Z+2 D˄RTC2ʮ{nnPvPaノDyǻ|>0GNy礤[xv/R)+jYer[S+<Ç袋o]{W].˲iy>[(1jK&X&D4 ,K[X5kDQwarȹK'OܲeH:7xcݺuKׯ^-t[3j([l_=zTjSSѣGڴ[0;y E9'X&Hj`Ya_ҽo|fόfYtʯR)e"ҏ~#osg} _OӢ7k5#E{サvw}{瞢߮/)H),799955%=njjjnn.o{~suQuСx೟jgg/|7믿'hO~oٳ}n++@Y󭙸{";{ٹs?v|'|R}nrJ|w(X,V@.w;tCC7s袋UV} _~a'xb.K駟&lٲeƍ'Od~_/ҺuW ݬ֊e˖_~_vmSSc=vE9L>̻jX wppPzrʮ*…hAKs(XO1UXXPH$R&,wenp} , /b !@١,j(" ĉ㚚K/ "ؐ,Ї@)(@ w?aFQn#Kv[%8%sG~S(XOYB^nrnPv%{[V<߯zhhO0ZQ>6k)o{r5iQ}mttK/뮻x_~+[A Ŧ! t۶mS%"kW\q~|i``஻jkks\۶m{uRg?ٖX,{ 6xڝ;wKO } lݺy;U>O>s3333333/jh?~|]v%I$|3 k׮ݽ{702<_p\]]]MlD=K|^@RDQ(orJSN_SO=u 7~흝;v ۿ7x'R*ws{Fz殻ox㍧~jWWWWWu]'??3vj|v-=~ow\V>xooGyG?!d߾}7FW_}={կzK_?.Om[[ۡC>O455Y-2f#¹3bR7u jCB8tP,ܾ}(c{;v .(w+5tCC7j0||GySw޹m۶}sҟ/_ᄏ3߬I|x@j  H+:t[o=u锞O7nw|[ٹsg__d26l^jH q]]]>={ݻ|_8ˤE={_}o6X}A|wK+K.۟]o{ŭ!T飘̭^MX gMMMrKKK"7t5\s~Ž7߬zf?22be]3<3 ۩kӦM[n}!WZ\do>);o0޽{7mz)jhh_U}uW]uӧZk.oFRTC2#wy29d^x|W |*b8o~O4.eY*4MK#z<Alr˲4Ν{_y啎+CM7$uVoя~b1)ؼFm{W~Ç_tEַZ&xv/R)׫ʁ{zz.0㑗y^U(n`OeAtFej`>Xb199 PRG>itG?Q)xTSSsѶ6*6!9wrmdڵ_N{zz8ct5k|_߳g׿[nEzɤF?= RJ[N~fttT /p9OUp6f֭"F ZMЁBr<`^z_WIů_|{.?uk`uuu?4m>YF;C=O|n{'Li{w׮]wlpΝ>R2KKn7˲E|3HM4)j , nRMYƖn$@^E}_(aJ}zz:Hw%/?޻wo:~7J<'Gy$ 5\ӟtxx'|k.v-]s5MMMW%?oNs(ʚ_V6gϞoO?SO=[믿'''x)]gg/L( 0 }r7a)XP!PrnVtM>O*ڲe/ϯ]{V^ӧO_q@`׮]rDox_VꫯرC;I6!8ݎ BwXlKx 1,!,(HW@ *EsQ!A t"P**Vw"X침p ` :'e XK[5KXC{,[`,EEл*XC{`. ״TTq7,XPenPB  TTq7,X0 !:P u EanX+)nwenPnbfԔ=CY)Ў"KXL&>,=_~yyC0@,C $BΞ1 ]&,\RQݰ(enPvU X88Iּa&xLһѣgB)?ż4:W$ ,(qRGE9<8*&OH^{Msǎ1I`)(s(JK.)ekPJ*onRqH$BEq˖-+V(w`Vef`$k^Zy055555EXvvP( [:eO.=;\0d`}r7L<a ݺ D! ۶m+o{Tt2Kw- !%J{";t: Rd2te`~CA `Iex+_*(-VgPZbx#eB[oɑK/ԨI^1L˕ѷfT3 )9C% 7,BՏre`Wy3LfXS <3en EU<(k`qP{TD+ >}Zz<33ѱ@i\XF;ǏOMMI`` IDATIR F[.P[qP"(-BQ_}Ukvi)it-%JXeBhDߤUx;ϋL&K{6jR$ig 2j`-Z{$&5U ɓ'UOV`R32i PH:9BT}s'yL}}}J(Wnpi]uWptխS8s: ^ AE"m[UFj< !ZuWl_bDGE4r{Fn#$y)H`A)ҽ,¼U8agqE `( c"HRǎ;B/~j `Y<+6`io"20L(n,?ßQ1.Z%8N~d`A0%bqQLvU&a잔WR[o%=vW]uђGhec(9LHHR%"%%AP **YER}qܛў6XntoV<h`^|]RXg^U?`0յK,H$r)q]]*eD?Ic]E]DRaK4O-! P%,>",Z!%Nsxj(ko*iikNYR[FDZB!d2 QEQ6*_$|<?xrλJtBp-Dw@ ` UaV'ҥ%:-KޗeYeM*!TDv!AXFGC6c=KXW1kh!t:-b%Ϭ JX EXqLV\wG"G:;씗4ImIfuB(YoUw `p8,=niiټysq[J088xX_^gaYѫj`WVQ9 ,U,RX vC vrY5`U m7TQhZ ,0B3J,Hdq ft4T&mR.ҼĚX,m"BӡUIKXl}O:;P6\;|q_xҟR49Lf8zF, +Gh IhdƑ)%e^\K]ͪc:Λ@C8@Ӵ}.bmf`i#ʪX@ ?"ƥ(xYU)d`-fFy",]n=^4J`!j`E `UBd`U17PhX2"O@O?JbFr^`:F R)%R#m"BW5DD BO#tKy>ҿI66 3UaXԽ0"Z__vRqV8Xt(eA N!E JÄ\.WGGGћ20TQy>###cϷj*(&RXVOCCCv֎ɓ'f\xU4S'j`+hl|V*bD__xʕ]]]V\$E:0555 PM3UiXyUE]%DdlƧy ,y;)i"¢oTq+E'4!jkkOnF ~(N X`nbbdBTjppPzvK `M*֛o)?Wz<[+K&ㆆU k=ohjjjddD1qv]Ky3%̏ҩʳ~:ta4 c2VĽ %Jo mk1! X;ڣ%J, `?WPKb Bwd# %f`uww45xB{<33#Wmm ,9Q299944$=nhhضmQ@˺e`! %yb؉'g۶m-};颢[2yg!E1(L&ta}d2)I.S `Z)TzzzƤ]]]+WT h pgDQL$ūyEQξWo 3jnG㸞M6uI9&~̩U{TIK҆,QA`eHeTExmv8J `!z٬:\3 zW^]8!ĶCuOgO8!ǧ*Eܕ߼Jr- }qXǧ?m%}1cF" JRr iykizrvkjj6nܨ|8;/C$+V5:mKJP4m7,1zZ\omG(BꓹVe`4bYaYd8A}C+NUܡtAXl ,jB *r!E\@2$?y`,j+ksz7'g)[ (Q4z3Cn} gʟnݺuF+oeYKqܹsX-qNSl^XJ$kqm׾@XW`-s W79PKVށ%Vӭd(Hu$ʾ0n|u2 `i2r/YSy>eg9}=}_Rݎ;f4iQ  D"h4JbXoO򔠚`NuOgUa Ӭй%{YzGAP&VOJ `iIHXU^KȩKu*cI !j*+, [oE* 34JXEmnB9$֦=J֯__WW'=9XBXtv34eT]i3?Mnf,tmn Y0TsssAY5[9W_8T{,6ܾ ]U#ҖAPNAeIJ$"!eDJD ,Х[ʈ6SBxnrPD""ĝsVY ,m]E `I4Mg2η`eTiմ;t eүn9:zJ`f`*A}gϞ=%! U$"ZRQEyc+7]@ J:'Qh(EIX=Th+ ɡo2I{XULhZ2ZW&_Z{OT;Ï XM"zWM.QϞ=+Ý'`u*q Bd%vUw;&B8n2T `Oq#RmpGȲɓ'v}֭TJygVS|t TDQ)z;{TJ&.$_d 36QDv-+@C34т]UR#O8H X `Ff_}kh!4SReY֦b _6̹ť Bgd꭭>)!㸑Є?"P"-ΉniCA,X3ޝ+k;vLEn;::'YM$F[V2:͛<@ʅC'5ƼX?~2%O ]8F62Xnо0::*?v\~MVюm̛F巨S̃򟓾eK%lI(jhД ШnQQ=X3zԉO[=&d2vU,{9)qBq@M e7 e.=:@8\6N\V%71!v۷oW=)ROʇj=QjЄ6= k.P!I 'mlBz`U=*VfO!]JyC 1D"'!-XR%%v7gEݩO:#7(MRdnm9,7lnf3hMI_5>' a) (hXB“ȴ7a:MZk$6ǏqUܹY `);jRe>w0TݓR''4 ݜC~UnږkȎ zrrOy~:,k2g=kOnX&۷:L2Ls' uo``,XNVpTaW(qõmK\ɴ-^9m̌K jND²h "iBHm2jvÛqJr:ΥiU1Z%X:^ ug#d}'ѱ&LJƫVOs S$S7IH ɅqqXIv:NB3`-uʞgos \%kuW7ٲRAC)2YyN 7 O;XˊIJ୏r.=Vv-=366VZyB)PΫUƴ2-1)klv.FTs75Qd:b#@K`U +,cd!o.wbYIŰNޓȧ?b(7]]!-NWJKV=˲4qF&I\b%Jy>7!&s133333uC>Y X 2M#2(n@0g%wgDS@|rґȸf@ }nK(&XpGzb f*zM]mwJKxR՚f\kfi֤?&8y{knp6&MsPK#$.x'QQj#H^ًπ"sKG:iOlҟDs"[Ῠ~qKK͛be`Y `h+qi'[%.B\ϊu~RZbD[q|y3uAWpIl#{ @t<ˢ{Ir&M%(|íżjwb i$z{4+6|$H)jo'-B6KZW9բS@Ҿy`)KXB8QGwƖK X`89^7z,LBJ1NH}'N1DD"yFCuO ,έʪ@ʉMT&҃iI"m&Gbq#@xt0 N.+3TX-©,㴉B_\'H&3o!5Z6ˇEe2\K;IAyk` ݹ "#5H6=dDB,Þ\čvZؔ/{( 044$nW/:+{Xg'7%jյP($O,=M^,FUT҃3%Rwd\mu|{*j׽6;/Ĵ'FF`j`ɽQwjQ\K79Sɤ=^ތfՈHGv1G;MYē ]+'lsO|u'3d7E;aO]̌L !T pl^cv[m>XԹn9*$ME X~F}ݪt[ õTMRVuЭEԆ;7'S~Y<-ioƥ `q.euBήXi"L_'Zbj8!"dMi+T*59=.+az.bR&0BH HRMZcbvN IDATUm,݊tݪ'9,%=N|3!<-؅lK{s@vμ" ?T.FyZLa [ !6mOFकْQDQT|~O̸NVݒRs#k" ,R2TURe`\LoT?j"5Has3t8ȫ'53ML6 @jEc0!\äAڸ mm%J{~lYaH\X֤h5XzKs ih}|aFQm"]+f8!Px`;a ,gV!ԝCA^ ,rtB^IUye(E-2nA4aKni#4x[2v&2xߤ.Cs"tl6 ,76)t)*gVХwxCUXȡ^Bi%P 6rq:>Pʻʪ(W_9 f!B$5LOktȄSOAmk KG-tFV=Sdq?{-!$ ]15v.2Br:9;!d_ `8ړ%ݵe%5i6+Ja(sSvPހai:q'G̜PJ^1$t\[%C!# `MOO 099ޮ\Ly kTGe9JqH\2Ԑo_Cb2!8NXPżP=;f`,kτK%j 1U-;"ۼ\ >='5gNe<"t^`ϞuٝM6l6ݓ[U8vL2g`Xn#kRVĝGy,n1`IWCd`%칐h&6dћU)Id.O vt7罱m$d܅gۤZ#ˣRxJ~5\(L1qm BHڑ6Sj;d`)I9í[ !km6ڬ/RT\X-#u*qVXǜLh2KQ$Xusx|ll,ɰ,{k@#WiPXD!df!EreH8#dB.IB-c, ,֑;K|^2Z~&3`i3BZO0MzS !"%Xu&PE3 XKW$UX)0;™c2EcIW[6Uщ'!"-f2C#Wx;Kη9^;]$͛hT<XyNLCU ȕYa^/LJϻn䌁C%>9) sV$7:D&ؼ?f$]'"!Iiz 6NΛץ-aN;wP*Xuiօq'3әt: TҟڔNS te`ͩRm-dTi;%9s&K%:!29weW}ԛL$yRަDMs}'Pk: !4Mg\KylS?`M*CꦊC`Y'^jcҝ#}}}RR|m,ƍX-tG000D$0^x:IFҞϷi!g=Oہ;uP `lj$=S^{YM9Z rF& Xyd2d[5Yvvէ!)'um֑L&lTX'wqvBHљ 2{b _$Mz#e/98~^%mpp . s$-f`M'<7Ts]E"aH˙vFJ=ܞ)>:u$"dl\TgKjrږxv{oseܼzvBK:f` e_hlHknhv++Ksu4N|Ygzf6O3r:&lf`E]Iyzxc7#_1Sb+{AM+g+% !'GkpqBHXi({*&3H &-e^:+ʱd+~k6}3O!k<٬ND'͛k[rI92ɀ'Lxs;2:]pr. ,$30a@[Ty;Y%i#QgC8w%;fW[lhh(MaYooo>l$)i.' 2vJy"E:qX !T^ʓJ (PGhQ-uwHzJ:[FBO6.㻦ۤkx0sElˑO!o~]hIVAہJd(0,:p_Bt[&W B {"-5tO5u5΍9|rab2Q䄐MS;y3#>B|#,XDQGzCۡqݩ#! }SX>*+uwzߺukA+:#OqZj3uŧqܼ_oⲓez[Bh^˕)\ve `ԾWCC (Fro~Oh;1ѹPQ&`X?**̞ `e `B-[(~vM2:92CLr)m(6i"z5TXFC !1W<+d,&t{T?+穀{/rdrWl7l9# D^PWOm!Xv.,GuL8すITNxEʉ;1GEbJBܬ=EوbpxTp4!d?7 !!P\WIeEqqpazXk"&dffnNږںPv5sN v2e˴Os҄uam 8@gSo3sl3"+CUIO:fOT͈t2hK6LFњlnh5$N er{[*%RWmXitMq3M`[ʦKwF.y X{2rQawB5alL/2 . < 'nmNBK ͑`Gӑ>H?KΞY*De`)y㌃rv\an,Xo]"DΛ.m 9xθn]8,M-¯wdw.s:Am]|>BJc*@J{=LȏloM"usewД,ڹکp ; HD;EVd!+Qb{9JC>%'+ BEQi'M/"M˷]'};~IJ !XgR6詬Vz|~ѫzDGL&}Jkbb" B~]&Z<;)Z#e`q4FٿɾO=hq,\n jX!Pugqʙmrye,: T* N_}Bbƺ;!^ޛHeWbv} _bȈ̌++f ]2 !a$J H# J>%} 4g0P"GG6Ūڳ*52#6}l`)Cլ{Vc_,P&ӷ N%^ˁX&Dm"& [3Fm&}KSLUV0+K NM֓ar=(R:0nhK| #SHAf9=o}ݝ`D`#Q)27|oi},p8O뉜 Um03f#F(+KR(~(ҬXºRCH< n']E4>qiR4V1Y+,J5iC` ,J"T՛-SNczol:STg43%K .oH Xx` fšjhF;Ѿsg Xwi\:X`(+OK_M=ʏ5V!X ~Q)bYVzvZ 淂zRl{zGoX EQږeJͭ?nPjQW[zxάԯ> @+1("?X-(\.DZXHd5Ck.5cQ5ݯ(32m5aKC% aR!?['iDkVZI`Rֹ<܇݆ h gYVUtvԲZ'"Sٟ*]ժͷ:b T#Btۃтۛ:?(@P8Iоi r*~9FhfHi\6&szK[3h'7C_oB{]lێr\1 5u Vg3}4qW)m-dO`m5Vm+BfOT(a]jE4VyJd0Vo yy. r}"hO7Nq"(;=f;ּq(Э;N' њRW} )p=wSYgoV0])$B5^ ,\`+ u\$tL풏{8i1frG֞QէrXd\ȿ]N%SD/hy^& 5 yg%/knX;<*vn?0ȽX1ɠa, z6hllRWz ;MP-N,|/p'P{2Vu,gK#[^vo?xg>Q^<._%7Ϡ{֭ELB[+sʥk+5Rеf s}'O=zm֥_ ZI糋#xTc"B۷WiXD"‡77n0X5 E-ʻ_/YtǺRBk(.euiit I`E(q!g_\G0^2 !Ȥfw5èwp:#5ڸG uj"N [Ǿ~YzIdNoXLM6OË uTԧ#:ҭkw}'_+ FW_M,e=EQnܸ9s~8#-I0}p IDATO_'{`!ѿw}p_B^ث -]U,(iǬ,ꣿ#B\+p0˭ƆiD+*fĝh-)=~_տB+@pT_y ę}l$,FyW ,yL !2UÓGݻ2}\O<+'WN{[=ϯϓgO_Y=vϯp5+%&EdeF,F(RړFi_pfC5fM}Y"XRjlcZ `v? FBx?8gG+ 󿷾 }m|ݙwtM|߭#z \tK_}/~鿞X~7/ǖ;XLȥX-i^FUy,ҫ6۔t 6?rcFyWŸɟPvC0[{(;WJOџgV{+=1[xGΝ~i >*DⱩյVgߑڳ;T_/=ٲ\'5W5S)ݒOv6' X-p'd_ڜ/J_~%+gɵr4»6$y:>2~K}ujy[_ SG+Wqۿ߻5<+<ֽ+Jig;Z&qMOsz?#_ҿ:ڒ>Qg>S(W Ab4N^9EOlOƉx%]O2y;26$3nܸq3t7e^-E{vŋD7jw5+=}t??lXݻoߜv/%iBnW7՚?/l浱wpl#?<g'rFqOO5?87nܰr;|畊ey\zKO>j57Wޛb/dpӱuz+nz͹+Of7WOOhiRiщfsb_rZzu/_S{8ں>GoL7ߜJמs"f2F̫/!6H<>BA\6,Ϋ8R 6XxyFg`U7dUrbz>\eg?EF|*`=-;8p'(,}Wz . -v6$IH,ئ`Ҟ* yÔǛY$BMLl+uFiz~$eHFt濴5Sg#%"Bu<" )ɸfi ,0*b0)BR ܢ$u y~ 0wҀ(df-{+;0XW ĸ֪h'3Ž7oQ;e k yeX5ztjajW+'=V:s*srY|`t2KZȆL`%VucESV`4*ҿv9je$LiЏfLA i N*PP(6u|G1POXKbB*ޣ*08hJ%deYT²t`J`za%+ad& )#X&5SďCW 92MӨ+XVD;%jx[B!+a'E"`×mPK=PԐϓ k~G2;^ *),)z`Ewj ۅ@} ,I ᙨ7P Esʕ+xN-3Q&Rg_:a1AptwC"=pJYJi;a;nL/#dNjkw Dá5<#U)mj0&T+ ctFe>T;s{m7k`^ZƊ1#|BeYUC0 , Ug2si|ȧO0b9;,D`a#U<_ Uvh_7/?~aJNq*;VeV/6+_N5Ḳd]Re6EDPi}>_"h4B'c @c.XCrՄh%};H_ie$%*#45W|$ޘ=9kXJ`]̆cbmV+Ϝj`YvKWA"-FԨ J[Ú ohjXJuȔRd)2R BKQ뫑]zh u{K34ފ$SP+3:>>VP$OJQ#IvyLlXhl˷IvG;i!&lWF4s5/1xGW)ֈ嘷d2fb.CRXx<Ю cte)"I{VJё(ZGΓkH/ʓQS%]B8Rܱj&S[_̺y d^zմ _(f L.3q@3s\*7ˣ m *W)%BdwI-(M4p$*1듁 ,@k +pAiSMqd `c|H @X?2mv/\ bXCuS` 4M# әf+=Z@КN 7= ʘQװ}4@?eU^&~Dq)EQ8{ dCoݝ>J,^-9N2J8T&@̔BSXm}"k1дe0无Mw8=LeqkFGGrBX  Ѫ Re/*3d0ɯ5}[%ݦ"U?D'-{' jd%|r7$J 5 uVj XAm/k֪Z>GE$EGzGv~?-wWn@f!B=#{5| XĖ)Hx`qGʯ'}mn.?W'&&FO7s旖HFٙjmsr&ĥxۺi sz4woߐXf+\*@ipf9 Ȩmt|x(c}ob4c%̎a</T'Ct7k,R *vV> BՖMM`+y socPz"}K~|z,`c\۱eM[Yq$cJJJ`BK+%|-;8(2HRڣm48QD!'V`l"2h[hLmi͡D B^6ׁB6NXBxE(34 pp> ; a m0 cr2Q@O XCQ@P`)t( 2h/,ʿ;մeVi ,caMYZ$^?wN{ %ż7=y%i֖ڟ,U/nNpqK2ڦ}sQB dYu# ^ᰀT`2{9;hf 8FVɄl D7Ypxumx?W~..'2N!!9ݴj dVSiBU*j5EQ*JʠdL.d_՗sd;=^#iyz[ZnE}u4{:>}+m)ݕ `&,3L@GV4KXpn`Aggi YW.ޜ-WF2tAJiMf-(~ XuR|ᬮOB0<ϓUڀ!@U lOU";x^$ъCʯ`D`O{mQxkߧq(V \9 7G(><Db@33[bx88^V_@LSx5h ,x:ݠtS@gh5q"1> M|` 0S%yIMWheYYQb\ވlJ):C$8+F1*]2 A`U C!Ld<0bu?X"B@W ܙJDQ4MQjlJ*c 6)$ish qB!:E fځi%+pulQ*ms9=7U( "U?vtDd~WB(䑇B!\.ٞKB5t21e+|*^7D&%:#L~$}"H ӴV P}?t>*IÚ*0@s-׊{Dw֍& !T댔0"ɤ,ˁ@@b藄P@4'Y_A@CTEY@,}SN㏤0)iT`)1=EIp`lXh(@.(}XhgUj5wj*˔>9v"N.K(0m_j^iJfc˗\[_}1rN~c da핅f )*ꫡa#'Ks;SHͩlTÜpT`NXY]C{@!$045 -  JX5ɣּKd;eVnV8ei[ؕ~vj>Hӣgh,diE#oC2_4ͤ eSZVXLiHN7==5[y\ctcp ߣ4J[r 8ޜOGgSx8rK?{fAbG`9|t4VhEAi\m58;Nj궂 kX愹ņ 2 "`) ۡӌ Zd%}(bS`o=x*.|j(ʜ~sj1;սmE_X;yrhLB+e*Gx`5gڣ([`UBuvZ)o5oEg(i1eYnfgAjx,1-²l$ mm`3O{,3R*5@YYJ4JWG:PW\Z e'P&Qb("}$ZSPZ6թVn*X5D;kp4'@{<| h+b^4/wQ:Bĝ oǟH`Y;VDX1| oJtȩl.f}%2 h9)*_|?ZNGplrxxZV}{Y^* !E6(ZWX%J\@iBTqlmz[J}AI:xŋtax2[+rٝt~d}@0iIXyy PQbZL<m<]2` T9@4Je"OA7\XP?oWYb@Zwb (Դ$ū>YBK2*jmXZx$I\'6V Tk;#~4mmu-]t9wB:ǝT`QRP)"[rǧISӈiLleEQLӤ[tC`ݱv8|y%,}W:kw/2@xu< hY„LXjY ,N#V+jO7ua y@`ԫzP +X+Mt>n*[Ok`нC;* RD IDATFy;ٹ~r:|>߃f]-/B0\'ZKAۋ@-śst)B=kȞ8qb3[m8!ͯ7 i4B\iEN_0R&@|v r\2[ettYnYNA'8(xwPƃ.R%7ù`C e5C"T~YlG'xL`;]@nXV|0{>;@`]ؚ8P)>߻!XdF>4}x0z7}GژhpOf_ޚMT z(4mF h̪ˋ`8HR󶧓Q8fL.ַBHGAح咽J\`A4Dψ0&(ɱw'EQz`ÃTӠ< >^qV ߂@Z*Xc؛+99 'NOr(X=PM 2;|X,Sa2'{Ț.˲};tBU0NM^gflς%"L] ̠P)ƺ$y!(ˊѴO? \kpvWo(_/E PxZ?kOv! ,0&`eT' M[ẏ̑MQCq" _*q5;Yf㲙c̏  X;$y@,cg"_gW,W*٧`= !^ "_eT`,#\+\Z9iZEIcfOvd)|~gj-G2w"d.Y 3Aٶ,<rKQ^1?(Qbe`ᓋXm_es\NUҨ7W a ...v,-|Y>SB3 ,˯˲$ݭ<(26t !=`CKA&+.lh [%!li% 5'X% ePȾ_c'Pm0ܿJd5j$ jG7b+(p5`C,*aXÁK(D+,o5"LߢDRy Y?1vV`fb?+`fͩ@6X6|>'ŤrC` "N:9\ N>o|p49 ;|[B ,Č+Q#} KL\D|LBP8%2FVO)gjr ʜ>|7d^x.JBXcUȱwx#4YKH"2hx}wy,] ;@s2~WW2s,mXXX%ɬ?Mb&#~=@:Cvr x~[x(adR {eZÎ!17^q@… n`ƚ= X@~@-2z yei,2DK+eH!xrB)oy&rYt<#:*hb5}?!lНXx*[XD9Dñ<InNQԮ )nXcKUCG` H'Hh>RH :uJ`{fffifu^ERcp.1:ֹgl ,FGk-\C3J !FNNJH͏"$\pAnaj!$Dxc/b汢nI]($hPjRN,^tN ÖrF"YifVwtBXǨ}k/ b y J-.Cѷ,{d k#0K"@h>} mZ mkɭp"ferJ7~VxuVX,*p<g b4# I0IPc$)@xdu *%3(%(\rWozX->>1΍=PL+K f&6u tXŢ$i=+uH GW _W5{)S$;}~)P.'oɉ@|ifygJaaH lmb:0zu^$0JX$̒G q=Z K%ppѶ7UVaYT N L`S`m `13#Zg|3zK@`ɖ2rx13hFPT92YYmp#U*X !{[ˡa۷o[ vSk|Q"D„3_y vKdI"qȎ!f4 ccN^Yن«Ǥӳ" T`̄JR.2bf !k ?t3,EEv >* 4/+蠃a\`%]M,3d ,n ,5G9@y4 BK',cpn$<7٫32ER3f(W㚿[NTC2!bY6Q /f&LWN`G`{Sn>5#aRva@P0їUA B^+a?ESg2Dmڿwy@,{Bt]x!R*Όce(&nQ:Ǫ"OE7 8?  #|H"=q`U`:k:8~;5CL?`$Ԧ6K'#$0u/4rA+ vu'(H̉{S):VFϞ= [w8݃T@Uϫ MLP69ܜIL6xΥ oZ+|}~2/$z^5`R8Z")af6 {:uT.V$Dkyf+hIZs'$Il"|)W G,&eSQ%|[o9").&!%H-B7vq3&}MV"5$X $k^<w0x1(OWkdxQRu;,X͹;h(ZXXxqSv:p!eYUUI>or= Oku;:U&2J3t=4р覩*2*-ǻD,@ETv0XB-lO4Cc{wqN^cj/9c )Zei᡿ ,QS +=4;dkAOUNL,Ѽ+  2R@j~lo>7tKM BTJ4Yq-zriS7r" R+*kg,ѹOlJ~N&R6Awmpe ,(|R[eJ&Ǚ,7Yî=dul/27* 4go@#t*8.qD.iIt"LMMnMoJ&:"!~7"iDyyNan0|=~f9ѝ!crc!&8{`u S/q\(" v v505;;ˤ#wJv'nR~d$ p8ܱOT`)0ဦi{"h%iRJR;Gvu'D,j2GX1Ne|KPzauS&/^ ,[trSyU^ !Q -cti)3xCvB˶cEd'N4&wzWHB݆|YfȊvXX,f5nüjYY;(fYɓ'˪4 iL9pBEQĹ]a0"`7Eg{-u 2lyP.TBhZ8ƪgb1w3 #NS}XPC',VCf[U@5::ZPβXӧO}8wBSr '7._u=$΃`FD`ٖ=XXg'6Ӏ@xF&mޱy*5Y eBD ,=РRmSBz;ˍ˴eYe$+Ix(2@Od2yaWv<̽{GuWؿ-wxS/p4~udrTh40wjowtvj7y*ðCBvmѭyh4~?`KV۫! f<ϳ,܏uk;? Ax,M{r_;*pw젝/ ,y8 [^u=w? g}@?f ,2'lwL`ߞFtaP~{n Th$ev};\e^5d@Ia7HNs~k( QVJ} AjeG:SN9|k0 n~ ˨0N4, ,A㿦J`P~X|M-*X !4ݞB`(֑MlŦFq˩Z\wzV`1^dJZo8 ,=(,h4l/b ʳ,@pp >̓":=/j%pF  ɏ(VӓV:x`YLuBhm\X8١804Aa>3!G%˗;hnagzX,&I,ˊejЉ8%†ہ2_zRZ.LpV V9=RmD< REG$$`c~hE 4DB`{bfddaѨXм%+L' CR`Yڏ@v8P}\ZLQ,UD! , ,$1]ArAFq[` e!$/BvBh/G!޶ !Pڠ IDAToI(˛9gg1~}#>pT`!mZ%i-'XM&S^k7R`XvJ1>>H$^߾}Js9kmH/~!*ٛ90]nf,a\(m:`4^G+ .,,8pEQ.U}{, !ح⦊*$=(h" ]A,qZێWT?^xhȲ,IZOPlW ݧV`{. |:6D&K;bӽ͝V2)X+,Vaa;ѽlW.U`=R`% &(bVxaA% yH҃p;M u\'vᨲz10b%Nkj0CVgt  d>h&&Y%}Q`г (oEq~ߔyp@>\hf1VX(aY̦Wiv>ñe@LYX8x`PIm!(VZ ?CMt(?*L,kEu.Aլ.5J8{C0Jt:(ՍxD ,2ǗW =ah ,0={PoX=(pe8` |"JË cQv[˥&W E6 ˔/585pS,K'q'jgpp.XGC`9{̷;evv]ZȹX :CXȚF$@q*0 v7E,pǫu!8n@i2phNP ȭa紩ݢ/ ,`݇R]E!J$ڡVW Lf2)^)LDakcpXѩ %yt^E\tlEm r3=>Vw&c\ ak2ڎttriePiq@G9ΌJnX}![Ѓ ^Ȇ/0-\ގ˻P`iAV4G'SEA~rgw&"z84$kP,k:MOa;}=RYYemP`ya@*>ȯ({WaA0ucnXݚ+WOgyx0 }Q Q݃e@p"í6 w='ryY76S:V ("Bc?1a8Ӻ9 ,/p(@(l b1CuA`jBm=⅌ 8ٹD Q`w`$^B0 ,}`8Z~ U/k:H$3(na``'\x`a@,SUUUp8ܗbxbBZT[BD"=kXCM8Z:t-E\JX}"[QH`$0MtIQ`r۵kzB ɕ#l1U Y5M^T{֠XGeST*;` d58 5w{X ,d4Ex-8 t:˥ċ9z{&/*R[Xh.B)|}!):bê4<.y`aPڷCЕ+WnݺUўAy{@u,E(L녛wzh7PP F>2(JR8MS!oHi?@R") ҮAKLhG ૯z֭R)F:a,ɤ})s02jn B%-Dɂ5ejdN$j; '1=WwYΟ tn9%g  ݻw젼x9˲hcE`y;RV`U xRK4Mغ>zBź ,:+1y0Ü` Ȱ)z7%g$V߳+T{8$qā/*pX5i0,`YŋO>}qP( {M{~㬆F6+q@2=$:HI/q}(0}n%~82a<0CȚRe]Ǒ4ѣG$5s8 ,tw]c c. J{;'OYy©NVI=7~ `ZY_nђj\,{gXVރԿY`+ndv<:8C TX[$Uw9rdΝG9ILXGs$NaE'ʊLuX24f& ៷.eo>7|'46%X"+?[nٽ{ݜd 5>b(*iWzyp0xX `e?ZnԏPWys} k`s'QtÀOӁ^,9*Vez"FɖLpn馛M;}B>6׃U^ qzBZ@ZFk'3BwDoܢ?kn(+Y~7UU?~iiʕ+sydjSN6n(OuF9SVkb[+c3 -lڂ]nǔ]M:eR۱c?6Ԩ 6a1q2ooQ_9CSF)z,9}KbLvTmtE]Bu-(j5R<1 `9rȑ#I [GD~k`m/EG?`3\Њ^XEQٳ~qw B@~6jt>IQ1X[.3"!,MUX9k`GV6k܏ HX 5" Lo[{۷?X#BjE5У&cǎޗ]s2 ;qd9d`ao_^^}޹sgڇ`PdK3|7||KgM@2X_1cM uq@{9w\sXnDc9X;x`G"Tϖ đsi>uh,p|ݻ5X!,rYG+َ[:qP{]^"b ܏AlN,NY<  ɸIζmvرVS?| XV*KD7=n#ٶm;][ 0!6B 0QȄ|͈[o_~+l=EπaDTek` 7pw~QGrjEܱ"!n{ #Gf% ,idոU< Ք`aLp+g]vtᕢ;e"(!qd=~d&B^.DG 6{CpRwCzK`ʧHI `I2v3XH"d`b ejSNUd`儎(,ePm9: U> &A %qTȂM*cqb7GW$ iգ0 (E@d`aC 4leuEl,&VlRWLb#j$f" 6AJUD2eN('2 f!|)d`a XHƕ t%| \$6˂;S[s!d+ o,0q5PFŸw'P/DG7gFCaqGy d\B"u=&'JbE톔SFHhGEѴZdXH^31-}0OWL尣Jicc5l[oρn"tPc+~АjIPT,bɔH- UXqHEd`,$JSk s[#& ",eX=v]E FÜQG p%%Ҧj ,QFejB7eRW4,nǖ 6 >feĔfD51Gr֛8r&J .R?DhD5f-PTUE\GE7&|+ \;`!e2a~1bXךd! Pi7vt"!*P,SQ1eFOR"BY034L`!b3>9.)4a3\̱p aȴF= H)8D-(ȩXD_WK[?/(lhE n!d늕nH*0wZBEw2PRW{U\K*z5q5k,:PT,"hEVDF2ZB:v++ ?uŢ"),/%d`$:jKQG 2rசfY<7(=QM72VCeePG75:!{s/H`aXS >d+Y ݉VjSt0w6 NʊߑF;c-&-ȾF#-NEaqw=&Tawt@# 囎*`!+PX7Kw)P]UߘEOJf4BBo(MiBOW"'yteюan6ĹDHV΢b>Pw 1 *I ˜9ct$lXl9Kc)UF1Ҧ(m&VH( `X9E-w4aj\9c`zAeAn#h tjXф詪bd,ˁ=wF: x(Hع03 ,m~GlED9nZJiG~`!r.;ܲ9c`bSOwʒ92\O`^)j\.Y!%fP%tC5eL/LFrhjHC_n(*Ɗ{`y`˞ȦhޤD#DF: ,^Q 2KtLP=ZY\Eʈ:Wtri:PT')~(g0bb!`!?#K"nH9Lؕ30 q.dE[R0s`LUZAGBJ gin `d+=X\ ,n!T̲]Ue3W|l)Q+ )·V=iZM;, !(6;:l7LA:`UU1Qc7C`.**rVccRc76i7OǏ߿?O}LRfdwP+ 4E=Ĺƣ$8L T:E0{c=O/0s`JXBKܙȔ]MW[0rNb u\_~}+n۶СC_^}ՙ>v ,Q6 Iν\OT,Pg_CYBQ|ʴ#n&+8{#|;߹xs=~sO:'DwP H H>芪|7L EC/TŽtD4t+'|衇vy/'NW2l^_B8qO?=/_d??^SVWl!b~xے-AE[;fr xb~4bW&B+wj" ĉC1[n_[rxG?zҥ:kϧ޾icxrw{I<؜_>^^>p@=үܹPر##aSo|_>}p1y^~VSWoơ?2y0W_lo>}l_8M<B4{^x+/w=',={Yxɥ}-~F,?'{ Lʦ~1 IDAT hv(NmO| ~ZSTx)B;B90GXl,hmҗ3'DbR$.!'PS$K+geeiר*ZNMV\;rȑ#Gzjǿo}صkC=ꫯ>G"WTY/902tE5%MW,9 <خG;-_E8;7ڴcǎ;vlσn o(`堊ѭY8I4.3DHAC4ЫRtǗxC L "Ò}zWĝ^8̛Hr>SauqRt& tBQuv9c`" ,i]DUP 9B+J ,aȺX-K !DHnVKN3*6UEf|h DB8B_n'B )[yG)2"DQ; ,meuD GF,$e Jq; XHJb4ێQOXtC=}8"ܠ*3Q`d!TAu,~ 0jL=BRR1g`') !+2 , `)/bpEJѯF ZTO`٬/y%i+jatO;h lЊzba' $Bc$eB-aQ6n(.VtCBJ(h#'H"#8k Yt?q 'j2 BI4ZBgPK1QG7d7"S?E4>2r@SbW,]ȁ }6gfluYd`i "tEI8=R QG ]-@"v)02O@ Ud`I dbcU@%QG )ٝ.P\1Q' đ3@7TD,uq:tÊnXHK@rDxq+CQuD$U$HΥQKWB !ɽ>+QoVy蠁,eD^_iZo@ dZTw),IDJfNIpLSh`sPT9q8 V hDIvE ,Mwv>ƲY؇ nO`@]ޥ#|=KgI#] tCI c*i5}"8z:楨#gp+3.UhBEEJjw)ІBG3);F+XH)#D$.+gZPK h@"HẀYM=BH7D,$e6yCipPK# )m琂 ,mW'S hC I;5%@s@%:qz4PSʫ銒촔LGRrL0Q L$jg`c "XB{'D"RuC!%7LAhG Iy 0U!-ɮiCA!#\+Pi@=9$`!%nJk8PPt8$6'yŅ"D2W*楨W#)3QxCc .QRϐ tT7\əzEъR L2@8WnɥqPϬ腊Pp١EB,dS;@"ӵ90@Y?RlQ͆66T|z%\V] 4ZQ[:X,~=Q; ޤf6F I[#;]4(r9P >Eޟܻ `!5p%x># U]"]1!&VHZ`'q:w)РlUKl rqdXhW#)rDűw+g=!'< P=:45ІRbn%AnÙRtX:qPa@6j]c ޥ@X  ݍp VC+XH)[> BȆ&V☮g ,ZT?(=x , blX$[PFjr^l(7 QG Iy=M"WiSL*҈OT&p 8ޤhW#-;e'.9:Pqdqd d ڄTc'ъ&Rbɕ~Hr5=&xjf> Є(TH ?J^H"dk 0_d` FrOCQE\K ,9Bg~0Qc)u`!#j%%0/s!(5$@r7PS0[:\vSga`!-2u@pW nPyGJ2s`610H"$ZBR ,@jKb}&TT28ʫEƪ$U[^|$n?g]tCIRtLQN} 5EEOD6 7@d pE4L?TJ4(J[d%,uiPGFRb U[[׆{L gAt,PK^t$|/Xh?4DWp˄<]+Acj ą>5Eq>~FCORvl";Tm}LVc,4AZMoP5x#MJt2QG ;I!gcVXBv9yր$W2$ g${% %j`)x@6V(;پh)d`ɋnG ,I+H`@D+XH1-Tm}Qӂ*]`K`{ 3B )E"| G@rԢoqeb*,Yiٕ3+yTǭ;81d4EǂB ,Č=PlEV΂86_Ýw$dG' ,u hW#I::QXlףDhxfkyEQQ0 h |& LHՖ#+.)(;R\PjC )Pf{@zLDfiLUWq0 /e`#hGFRL2`R?^)\I${vXh5ym8 pׁjUDmVbxC:PSTe_4&Jfש&!0!j 3 %Ml8`l+,n!K]qLK@FRd`+g&긮X -}v44ٓ&WFD*@ D!$(z kϡJSQB*R^:"!XHZa ([jEiPI@q>`!I膒|̊ٻW^Թ,P+3 (64XW 7j"N\b4$wt6-9I;KnH?D)5o( @"d`Vv8B@>:$)UZ23+y4Xa3Mj$Şs^d E#g^ )r7#C?BBZD2@p7GcjȴH9"6І"~A6 gQ P5:bL"!ъЄ{7+`!)(2Im/LD٣.zxyf T;)Wjd4I.y:z`tCA>&]F" b*VL$| Bf \ah5}\kcNҲXSgJJ]O'yZ-tIMnZJO\T-VrVŌ]]$K^ K\ZO]*P*N #%ƛ 0 fE/TEJ-(&DT '^ŝJjSBJggXOUdR[>wPS*V<ս1@ ) 0iν %ꘉ噁X~L/S ,;)vd &LHpԯU(M\, yBJDt0MPD'Ց#fM8B()MvhRBJ3%=&vQ+$/#"l 4ICμrAo3&E# ݙ2!P2QHEU#6/Pk@=180Rr@J Z[y:z!`!)[=W 22Y+ ߡ' Dq^\艂h4"J3T4=b 9^loȢlU$g86 `:uGݷo߾}}7x#ayC1p]E(2ą`./R>I^d6THyįЪCK.;vѣ'Oy0~aG$W+c`"!V@S] ١K1rPOP_w}J\pvI[dʮϵPTd$z!RU ISu(tM7_9pٳgS=za@4A #QPNb}&COTGF&9qO?=/_d??^SͰbkTA_ŋ5V.++w0b~{ a*;>$Ni,S[;8qb`(Н][n_[rxn!t_My{7Af".sm[GfmϾ<>?+=yY1ƫkra1a^/sσ1~N;ÏiճGޟnR,2/癿}~i]CXs /`_S= HROV(;J(AXثd@CA @|@:?O_y'yTσ0O1\A%QC0 Rv@h3z8  `}K_zg񥥥}k>υb $] 1XT&t ;'.v]g"ԣU{~s9rȑ#?SO={υY2J`.Ȧ Df D!S`R|3$ Y9 "}5ZuDw}/S` sCjƎh^uH#v–d~(ZLLŌػ8B(*vFWE"Xzx9`LVhM4@]Rl * W ی(pcy" P=:/Qy١AEFA}iІR!f~@~DA=}DEza[\EޜHi "|o(=Xɞd`sGr!s@O) -х<艂]`!)#;8.40c`nO ȲY_dG'>m6n&XH*ӕ6e1_ =1tDAgN#gRuHƾ?KX#K_t+#fu>#@z"Bf!R"fB%?2 4 #<`+1 jQHDEDf0EJo(yIE`(ȴ`§ٍUj BRnhaQb6>)>VΒHIgh&E,$%[膒sN VfߟC dDXH*rY[d腢\]QO95qxI\R?&,`!0#yAsk(WFGyAIB*˳RPOaXhc2`e r:.Ǽ % LʁK97DE,RDЊ*O ==*a.*rwrVM w"v gEVI^QXlcޥxwf6D;WTڟ@^Wh |{ZT')EhU~쌋X]E )*}1QA R-qtImDBAmVaRGR$QMO / HYe4\UQ]Hހ#Њր8,8ˀ[9Ӡ򨁥%'/F.BH) v&|=`|QTl h !!"҄p+&5#ʙ.AG83Ë4(nY%QK_Ihm5&W"nXH7TFuM>n(g`1gpg@eZI4\"10HQ@1E+^H2 ?dO_B(PetЊҪ-%Ǥ $| L &|]]99'*zmhfP V ,9qm-#`RЈͪU2*`!)#+JQP/NOeZ鉂\"$lM+(&dV2| K|%ɴk0y̯5q<. `"$DhDAI/䊗qH%3 ,=t1ՓTKX5G=(#lH#d` +"CǛU톴*h ؓLD ).|=`L(Y$ FCE(0479"رRrۙInϙ);n(ʦ~0-U~@EH"Ģ+Ǟ{b&RjX~rwz(h 鈨#Ң:2rC?d3膢C l~6XőD&T9 9aɽJz켔qQw)+R !ˊy.SX`s[Sivt8ɫ(QG U=ge$`6b5Z1s`l>10hDAB}Bjn8pkc~[.#+% `K[ @ Ŗy=&aS/lsIs"Ɍ8tq8"5sCNOd Yi 1VL%vt\o"e`цh`|EJ!A0D`Ʈ'R{';.*lرJj@ w)d ,"Ģ L?}0Y[hCAш}hnG'`\t= wE܁\Z+5Q=:3ΖD7`4!`!1b &F4()ԢtC1#)(j`#2 %!Bb ,e,3\bw镢TV劸ӈ"H2|~R?"b!$KP,H P)⮩ןSVh-h \o)54Xl+c`LB$KAQu=XH̥٥'!d ͬ%z#+2s׫ 럙J2c3j=&D$fZl|aɀ+A7莺rRpGE(dظJX @ %Ͷ5dbtBE6݃ԏ 5P.laюR bŨ̝ " 22`2ǛTiCMv/I)_˸gD)XXTQHq8 =XHqFsg"}1AH4ۂd`Zތ)DޟhRGwI1eX] ;jׁBOun$6Xl ~5SvI\i"φKPjg8d @+~>R;9vY6X b,D=x4PS(LF>{ ,4Bb;Gհ 46Kb@#{ L ,u4X86'Ɔz ,>n, "^(&2D š_@ ]l8c:<0 8m+]wu3`:uGݷo߾}}7x7Y? DXRHVn(!(P21 qsz*b.]tرGLR6%.r!\܃DHMd`ɳFCM].AQ__~}+n۶СC_^}ՙ> ,q4Ylף HއhO%%'iQ f󱴴tM7_9pٳgGy;ŋ{|sOә>!C>C]*8$&t-<[LNtÇ/ر+_ʟ韦}*NqgCeŠ1'yiMALn=QYJDsD#AMs| FW_˷:sL-'<ӛN8aK/t?ϟ饗',-U-3V^|A_eë_];81+wpIW!+wx뭷⠍UVk/g%'N)f&̴^cǾoVWzQӧK.f\|y]}Oo?Ny?ov}?o>sn_y-z=J<ؔwW'_d۶mczç>7? `}v][}~??|_>Ͼ>6_<Oz߽um>ưťʛ~H<B4p?O_y'y~3x.t/N10h.Ex*Q.((m!-@&fҗ3'Dr6U3;ŒOLGvm#j EiW%W+რfڻw~{ȑ#GyzݻwǏַO|b׮]=ЫO=ztOBXDA#%̂3eWDVXڢ}&|L th8;7ڕұcǎ;6Aא%UV"9l>aBPRU&%CB+Wt o)5'k3p&n+JVƼT_Z2R?tX`8섆)f# Ͳ›MuX1l&j([ Ц\GBAJ:>6ЊR trc+E0r5+Jщ&L7ŪYJ OZdGw#2fY #g Ўl ρ Ԏ2/c/M@pE部#"d9JG)@5A}eIOByWM텉6FY.E[T Bd-@j쪢+sY9ˉj6#SA<#u!RSJGC7rG )'i:EUWy`4d붰:/a+< !DXHt1QPC,-tC XdDTJe^)p`SxK ng`1aR C>CFg@S"PSinq D E+%=&d&X'z PT/nB+XHxKXflǫ( UfP;BHOřzi˅BR Ź,O٘#fY&ؒB-)*@+~>X$MH-RI<4_Br!e~3dq6`łKbb`w0S`<,I:mdł4j`e44(`!5M( Xp-g`%Čx7 4t]/#~N|uORLk_0 C>EA i(-&˂En!CV& i@M ,RMIfC>#( 1GޣyłTPr6Ύ&,$Bm~d K0 n4ո L$.?e^*l&E,t  !&mn.Q,6WDBj/)1X %-d]Enx4 Ed63%,$fVDف$j^(Ǖr8B(!Ug 7`8XH)2X:ˡXf&l7$K}sFf\1qMF?TkGG mf @ \.X7 c;GMc EY2Vj8̑ [!Wt VY0u&zգ/!Ҭb̖*,$ HvbKPa6G2E!Q"qg7M@#S\92y,e& !Ԋ`%{` #-`!uAi:p ^j& t%-rP<XHd =get);% b嬌NdRefX6+e`{L(zʃi XH,;1Q+g5D0J1Etỹ/μ,J 0ԈM|]k3.DHeф#Xsќu1 b8XH)`Sp'&z؜ʩAt De膪l;Vq-s`CC]vhE9v >A釱ek &2G ٟA Wr߿zB(mJ2S1=E^Q|aE|ϣ #Hf`1*&8,XC ŁOZ2{q$X KTVKx`!T=\Bn V4B(Bd,yi\!,m/ʘN' {N[7T[B`j`!5cOOUEێtC59`Y #ʲdcUZ +  G i/~10)LhR~hH9I;:@rNXH.i~lqM0;tC=]QR({ո`Y<͊RJDi2S.&k-i;P&|Mg-~ly.7h2I׮]EʲܱcDŽ }s $j'鉒B(9R@ݐvC V،^#G>}D Nڨ?_TzE`Kv(f`PO'+DI# C+آ1Qrŋ{>LZ0LuMfm2 AUEZ̹膺L#h z5D*yA"A[~}|<яtGPQ u9g`%|L"ĹIQJN R !K Djݹf޹p+ρ)!1"Kup  s΂۰.2 Ѧj̛PWJvz[eY;w馛W7=Q 9j`!~̋;) 3bs&Xs/}# C4Y[[rJ®]XoaJz…^{2wyK-4Bb~R E:쒰+ٗPτ… ?O{oƣG񱶨_/_}ٳ + 1Un&tD]EтDd&LX?#)9 :{--->߿m2HZL5qG׬%eٝ kXty' uUkH;8nD<ܡ9`vdeEjmoVD ٕ!-Pjws0fHg} Io.mzXBbۅ>.z#lJef-KyQP&`7'CkE K0nȨXHtP120' ,dv!d=rշ7QА80G dRxwܹ9_D/'3ُ4X P<: s lX5 :2ԸtEU~cQ,$f' ٳ>Uў&'X/ٳg{|igZ\HXϙ =vs `Mޥ@o@ ,tHKw-;fHڶmۤߑA%ӻ5Eܯ]_!إBQ/B/xw8p fuuueeeqq1PeY{@54L@M5t"t6k>/..~M<|Hs$Bjn(biiiǎv9cz׮]|` ,E==B'R9z8|]w0{W2[[1fp[ouԩqIp~={l~jA7X5+++oVm:BvmBbn/bUU{o|CccwkxG[+N=sӀ|6زZvjMW?}QB{Yoh uy:[_Uwז3y.j`!53<ƛ8t+vnۿ3Z8;AJ+֛լr>L-%tn?¯:C K\2B1X#T… /B}>ONHw,PzЉ IDATsLKG-Μ9{}c/ֵU} "+ǯNM:;tvbGQ#uM\[mE8?v'T;2|rK1fj1d`H4u~^_ҵ:f`Rt{,WS9Bsl#"#2ص}<{Ku5wYݸyuVsd]XXc]Vo*ekHw9;,+`j첫_~7/|뭷zc|sG?ѽ޻{n_2xqc$P 5rzkkkofsYC!%XHlaz~{_qV~+naXW^}{w9uړo*5tOG~&V"]kj戕@O7յkzu~zohmmҥKW^|O޹WG2<R(Cf& M-//k DdղX{ȍIXվW$aʡS<(B0t3[Ӎŋ(ܵs9!d`yjH¸ݰ6xuapԑZQXoDɧuM+rq`Ҡ*4QĽЩgnj此s5 a^^;uTo,8rnkBaX jњϵk?;wl?UVU}&_]]ݾ}t A m3r/9UUܹ77{Ј3/Lٳ;aty_ rnV`!ZV4mMg`]vw)~ؚwlEqҥ={L/duuu۶mf4 ɕvgs??ydw|~rχfGGi͎…oy9tE1iPh`MñX׮][ZZ}Tf:;ĆNbW&9nʕ+('sΩXYY/efZOM=Uxqgf`UMA v]fx]᰿. jyXGuu,{SUF[bgU m*d:|2e׮]zj;v5MXa[tX!6ܴ9#Rg/h>/ڟx4l Mcݪ=+3:u_NNŚFea\dEG*Y{Vk=DT"cV1 `uGO,N?[n>6MZ]pGG)<[1V}ܹy #R4hJ~L<LXkkk6onս%+ڛ[H|G k`X-QcVW{ج M=ze"v տ%M sj=ݶm[2^{뭷zC B\x9B8lp^ti޽ESלٌj3&.K{Zu$Ujf` ^Ɔ.Ko!NGy1j`,,,eBL]Ҳl;&XX[;eu`2f*vA0[ akתZ[[[[[۷o_;vo`{ꢙNv aT.ϟfkXk`r3՝nKaw9{F9B蚌^ZV׆Qr4Z"Eo>:t=†,b1P]UB쒵cw0FN=Ϋun u\.4vVwVUUUU7|}>tmA{_zw^rovRM>}tz˗/E{DF?ܩSXoV oTXoVEq7' `m8r'K3 ,U?t8#KKK/r?0;Yg;/]ZԳú(G] ef` jJΝ;xg+2xՍ?$oB1qA!,f3TMrٳKKK!ooӵ"+ q32j3~'i/Z{{_~CNk? ,nu{H-+63ΡV f5Π 4a# K]cǎaڜsSQjfM{曽Ϸ~X 5Ij`5o^|O?FƁS0(Eӗ,ZX![QY'?d & Fh{… Xn1۶mŐXI떗_n߾}*]u)^`vL7TՒ1[?fakWo[X]ˁ i ,F!PXt /'?aZ^^~wN>}w[mS=Ѯn!42jnVob; `EQⲙ$Xw^pW^En{gGp;^1?-s`\e1,u?kkk*TX]r? ^__ǧrVXIVbX-ŠIVU `LsɅoaB4n!lm/71O>{l_~*baaaqq>ۦz `ŋ޽{;SOOTțְR-Z@3J+~'lF:sLɴB'l3X#iIpo/_zyv(fjILrw={CW g6/| J1$5+WKڵWoS!\yCq5X0l ~n\.GFsmnX6揗\*!SpSA拽fׯkG\|ɓ;wg>>vV}xO=EŘ+O^Rt s:uT x׮]@F)~̙ ,$~wS!4Eka灻.-ךE2,gfÑ{SkqΞ=Їze#~{ \3XV*.g`pG9Bhk4'4'O<}tWÇ?`c1y6֥pWVjtz71*7 s6Π )HޤM}XͿȎt#64/{7vŋ}9*WWWŕ 7~C1ӧ #5 3$NXf `EqXXHߵx*j? |0d`&gVVO53/~ܟ^ygO?b1h|_jQ pqa&25W| ` ٞ[koGV[эlSXc5WkXĵ5hN)^.--_A /~rX5-ֹğkPBFS3S zՎ>/W{Q)˲q;w믿2{_oݰ]vfZꋎNNz={Fy G.d`ه"ˎ?mV8rHI983$q_Qu}ǗGeW7'dVV旙]kwI5< p+pQUU `"T !y$Ij@t&)J=x }%}OBi5R-!<|Xuu„J @`1C`aD(,|tس~*קH`9DJdHF~,/KLܽ@B܍k& Q`} '^*:yxc\B{@p |ch׆@QPU`<>g-sk #*F(b>Xaш̅Bh4>cB 0Z@JޤZ«  ˲8KGVKo8x{{{aa=s~htƔx5pt+BkZPEۼm }2q>zxF!VuU0R:) y Lɲl ,۶6(666Z t_}X_ -e_s ! >Xa&#kJ>g7Dɟ;;LBO`Ň @Xw ʲ0kBN~^emdX >eSٲgaT`YF/--~;̅9*]~eg1L`\ -A^Ľ|11 ~0R vSD`YvLgI\1֞ sGg,BEYYY!SF-M XNbʁ㳪 !Se&6 xBVuL`%}MQr?lX\f0p$U,_UξXĽ@`i`=kww׊ZQY]eMSB`Z ۡпC蔰rȅO!T1M;MAc8x q(@!BEl՜JpZ޼Π-eУչFiɲ{׈~zT~:i&dilp=<"o87PHn!2(>IXf: g A~>m|鷅Å5Y ̞XKXakٵ=!:b{OXLӼq(NRXlucp!ٱX{*xqB-˲3]|fBWvҗ~~PΰٳDLfPpBjEGv9,?~X|>?66A`5%Ak6BF{b +zAe@ӺQ3o X1!%UU%KX""mȖŗ¿d#񇜼-NR`I`{ )nxY?(hٵZ$‡bcQRYc+t(g3[/jnC{m׉L*ܔEی,OlnK Xe@XICA앗TFzLg IBklɫ6WUI,˚#]fó:ef=Ȳ"$I!"/C$Qd\zTM`KZ& (&F/ E^˲,< ;#(I`n 6uqBu}|Fc}}=?I!F -?$VEXDeE/>Vd[ g56V//m_{gA`z t2" ,?>.PH?!$ճUkXu(?v(~so%=0ͮvm`6tu&:VEyWW') !< ,JDu. w[m7g,C*_' !l veQL,h*IRM"vvvPtBF"FvWo+E- L?t,zrZMQ,'RÄ;#x` mofwZniI,z@z W] =C#;xYTPkBQTX< XMc.o̜+ʖFT$/=} }T*),66Rݎi˔Kbh(%z}bwTZ~' ,1ěA%[,茹XLB@nYE[6L!J;gPYd,beG-,ˢ| EhL IDAT h[܆n4jqgl߹wnx+Ó)q.X>;j!8CYlʹ>ě\ZSҞєN'5HE2 ɸh?`x7K{˲<Ͽj$uB MIgJygh-XqV,t8a=fFٿEB`%x!2q,0wTBcUU>f&@`=/Vӑe(eq >7&0Bhedh蕕Bsf{Ӻ{mʡSF{nXmЀxT,E?@`R`d Œ!E%Sɺ58\iDIJ>m7E.F 5tL9K[b,՗uEԽ[8~"UYV=z?9dfWLj!p,~I㽡1!J"srpg( WWUϽTi=!e۶M% #W_}ղF!|yiLW?Di+KW^ރjz==88; bfҶό)gVeJPv/;K KH4H+~l8N5=\o7iR-nx Y_zd9˗χx{K3)vTh+q=_ۛELO!T`<y,wM7JydJДCI,E`o30wg4?XYYڢiqd'r1w!h(//^Gq uXM_2v0/߈ b:k>;Cך]A`9D飏REQ1rQ^wTF74ƠV_/ ~6ڦlc:f-dd}5t5w}dsT)ժE<9:P=^w=X΃V3xhrSMӴ~2<BzNB`bE4MXPHya^<aF[y^ ,]=s.qT`Ѿ%󺠸V`O`'\+ȏ!-Q6rNf`8¨׬hq%YW`3_. 5/cIH` 4mm-$$TU5@DN3QB +fpc* !ؑmhbpz`ZJM8a5Mcp p$$I.Ux˶u_9_#P&oE{;$d~1*S r'AC &/| :qĎ[jY_ښh-db;( K띉 r_n4mYքQ"i7=R4bu$Ni`OT Ad }d})+iu9w1Y *40k0 R\~?&mkbp͌t<#$V ,,aJH ,\7UF/ CXִZa)*A qwB&W`N~G.&Q&IaGkOٜiIl1ν~b5k{+r$Iˮ)A#`Z)J_"a2Ie'֑o-:<FGGӌ&@#!BVDT6޾"-i \h/OC%Eam^qyVV[\\d&,/i^[jvXG0K`.-  =,˲lX:̝'q3oo_Hy  H0)xTPO p`XmXBvt_w}_F ^|m CӴWmw{DC PG;@MgLhF*0<Eɜ ">o8>@q=M v^ G XI5#!(* <KQH 8[Ad! ,pkleHEGa@M'f`+_i.=~ i`Z`]5T*HrS`ж3j[Pԕk6 c?SJu(w<KI`m!) h,>gDu!;JHiJzt b _OG#lgQ~O:Qܦ}1>D́5Xw ^DZe@ikiiCquXovt="Bã&{ Jȃ 9$NeC"ТZ-Z\<`,gUxy?q iZ8 {rkab"" l)}ɸgƮvȯ4ƨڈ6?v4+!h^'5[ 6e{@bv$HtJ]w_ ,UUD[I|Ř `/ a=_mֽJAz57acFXV5xQtI^\tB`AK[`rkEVb6I ki rTe9{sqdˆѠDNA DH NMX2s>XxO7%*c, nbi%I"{Kk mzuwnmEDjv TD%h۬J5N>M yY-kͬG`vJafpY]AZHd!<(J4kK/rHa2>|X+0Y"޽v-(h3dXfT`†I`)#N/ɶmUUST]_qr_ޚFKYTax`rDd! !˲LHVe 7Xu 4:kTq;mQ&sTF'H I5Xm8oնǏma _PoLX.zFu(7agq½aj7 u?C]2>bc|#D0 ݁v;G=U}vXL^uTZkzޝ.z)8>1$bR8!^IEnL& iw0@^Ow(uSBB`%x xnфP`Yʵ%RI@y=UmA$pע"7uU`FؑVnxJ"PSޡ%1F~3)k8Bб'8HR-+-= ,5 ⺹ݡtx}c XVt4,2~X<]}qHiT3ސ؋)O] ٞ>9\T2 tot'x:PMӐ2:P'XN* 44i[gLdmq.U>P|;2'=kt牋EYM q<@m0EIeDk#؃X$5F~s ".rO=r;hnB`%8C-YدW![q1 jvNKᖢ-(ốK=24Ƹ ?ˉUۗz: ZFkb$-?P]폩{c)AIVצ#ɼ۪^z 03o*-g+'SB&d BT4zVݴW?;v&c=8g8RrssvGe% W?qfTֳfVڦTr Y*h4N6GɀC큵T:K+CLy-A^-u_iza"#Ht8T"C[!, tؿ{"Qnjp3, T`uɡLqqR_4z<9fF%{X]Dut@4EQC36m1rwW&"woMѾuOK> 63O+n39SdF-Ǹu=4aL-Qow*H0HY="WmW);Nd@ֆje%7eFXG`v_ޚ,">???fA|N@*hLVgMR=XFaYYΊ;nM"%ȉ8<^jwZdzn,+-9* ,PeAwKI Y kK`ͯ80RHMʹkXƫ ~*HDH洘\[-U4IL>ܳ|S1T2ފS݆3î1]Fǐ>&" &XNyqHi]~ҬM9fL ݽ]Y9qOzy xL3BL`Z{igrX5ɒs~!Jah $ rAI3RC@CR! Pr`r/U'c\. |m ݕΚj%_{5TOc, ϟYMFhYjǖ +p˲, 'Ѓi˲nmBRP܉P!pڋD(uc3$Iþx xа( 4mu# -Eh  nmn}ڠXuq2zwR-?]`|l6q0"Θ>٨17T;A z:kX8t zxmڍ2ŭ;.K8bS#Þ^,~?s$pHΚ&#OߦX@j]kqګ>ʳ^D+J{R(J?"G9 j9 ,Qn0qH .+?V\g"݅.06[רOlcѧ@%tQ@t 픵0oI˶m\hڻ*or o`2{(a X*<N8;oX(O\^##b:cشS7GWڢ)Gۤ4N "ҁE JճD1.=؂ _;M4Msl5-ˢC*&'GV<.JpupԝԹs3˲(Jx 㭒J8]N92:l X]&5 ,~LD5t寋\3\c@u;M2zir U-l]G*kWG,G#|_2>a)' 0,i? ޠqe2gLJƷnf(rQUlr*H2 \-+%9Ml"###j8SI7kX<;ւ.qђ*e qN^^X`s/8|2Hau$"6*Iy$S=uX۷-$ DkQVCm|nj^yKā<gTg|^PT_j,+xe4M]>3xڦN`+m7R2iF:aQ ,rh!RO# H!^ ,^< IDAT b允M<8g8ht#6`,˙hӢbdmzd!%X( ,ơ>lQE{9 )Yxlcw4û?{e#8 Ђ(pPY*,L#&BNai GX\,yVg32pvnyڕnxGABCjQKk4M D/Y!4?Y.6r֦w4O97FtQz||<6dYn}T9MD90*ֈfeЖ/YbEwE0L`᮪Y,d@,+ k24.mOYo5&LU6su킿*iet ,VCGڦPzuT ؔe9`bc_^z'C?mv< (JV[[[?y-`XR3VRr2anϠ_j}'K/j u G2euW ,]hvW"Na5_ RVSVrxLZL|0XV!B;fWN쯫(I` T6im$E [qgGs?o<8KQObNPv[Ò;Q)EqBR}w"mM1L fE90.˹a)V %{&mmUU!krϫ!9\.NryەhHcN`ߴki|@Iu>8@ O$"\.Uۆ6bq,<ba]L/͟%K7jt i1,VKnPa;_Dli RlZ G[\X$:wXE 2z59]9_@gCP*8#SlfsVqH-C:C>Ųn`D@q1dKXe 20(ay! XeAj jA'Grդ,!KpwJF>o oTɶmS M8du>,Zg*VAQW3ōcS26FY2LNgyI"- 9#BKS^ӳiv'1 2xPZP&JM%:^~4Mc=(֤%*KϾi-(Xd5r2Efx8$d@(`339\u@Z#\\?6$my\ڎ6]X<>4}b: RSٴv֏5 $*%es8m^4kӵ>JMN4͵ 5<"o[PD@RtE$6=(o洔Exd!y=%iحe_%~5I2 6vwϵQţ Z! 7OLdrC.ԻR;qu#1m- (MAXDa吵 kp9o=l$^{0dV1g3綦'k7GȜ!^܁r7WOL7ImXu4Wevo@cņ~*=\P`-waq, C'2OG51d5xrgl[ G-?ƶNyBQU6$Is_*DMXWToo; ͛_,}utff^*J3&xa$Ғ_vG`T*b^tj{aXLk>)bk <Xh#C)DžQ]Y_v>vykC;Թ8Vq2>HgyP&f@/:CKm緦Eۮlb TүI;ACGPm!~2'O\`lt Cu9fZmot˗ҧHy& (W7gGi-ήjut#˙Yr#AJJf>9(ꢄG!'׼vGo[lkkSNKKJ6Hu8;]QYD`tQRvoǓ$hЂ8A,ʘhi*;*7}%'4ve zXd?̓qrYk@;q?h(l< ,%#R!2ge*7 £G;ql`,p?)Z~R%NVPσATȜNM`a7q!pQ?Wy4xV}t]~PP'k4ƱWS7F^r>zHIsk5UƮ:%L,o5P`3˙ ,ˠ-2Q\R дTp h# C#vfE24#. r7bw?iUq0Ƨ n+J%%S?dUK_8kt~={"G625 +ffffff`oam/$7Rk^Ke 3M?~k^I7[XH`0q syW :TT$Y& KMih# y>Iq6ktG䄇Ob{H96!T16`,H[bAikfpL#˃z1\X,^ἝTelj3vKD/Ѽ~){ZQƑH0uctڦ*m]$B0e۶Xl:Z@]@8aB&2Fe2,CҖe5Φi:j >i B'I0"mũf6Ƶ'O#M@jY]$)0B3%8Goԋb0E`j(~0%q\? ~`wbi:-vUP`YX]67.3x'^iZ.%,շ h.@R&77M̉Jv5'|O mIxaѥK17oDȯfy&%<HTLx+RF`M ,a|V(~ dmOSr딠'~zs'Nx߾ kRW׿~yVsȹvM>9Un$5mlĐ8ND5謲hxsZ[עt ⹿QI OR@;s:5;$)--[vGg+Sv1P@+N,ż|*KL>qaaqd"5ÿ$^Fiz!)O͡~!ճ#_.]r\T* 088Ȳl"lnF6 "QI J20gC} z7f;a[.sn+7ߵop6q\k;W$7/~4̣lw=d|h~KȏKg[_򇙁^Yߗ21yu 4m/󯪪a[glT @^O{U_sggǠ-*$xoTR“!9w:3A4'Fmom޿4qI^"r+mJy}tr/W2MΊٵrwv^~m ˲}|ʭëSnYKo&ěoRQ=s9<'޺!?Ǐ/--\.ovvرc?Ϯ..} >QujO? ]]7WO Gg8nrrǸVttukSVNq)fC_"իwwgߞ91a $xqu/k9#W{fsW~kщW|2(;o6iSN Gg |٭Uxoyᅬ汗'iC^H՗k?s}0L^vMѽ6|X&m-A9pjg62o~VaE$~9`R,Af5b|zX*幏'^z)B ^|s|ɝ,|@Q>[c ^6HYu9I5 Xƍe 2zJEDKv\F )PM.Xa,5^?bܓ jZ| Ϝ9NI\~|<ɒ8V T[Mߚ!O*V^eljPT>;D;vXNđBo (B)g+ל5_DCVB0`~کCiYW_6EG`]B T!"zS:VXc+[3CRǙLFQԨN;W>ԬfR7p_>7[#"^̲,SȈdM|HWmį ,eT@PtFn#75{I>$c5t˲hvO۵o vȔ 1"BB-}NS0 sy]K\Q$vK2;'>:@3[ 4@#A))0X X9Y+)Hbq<96EKgzqL f˛nbv:b!4W X, ji Nt;m0M"aak]D)si v&''M*KXDņHXiQnt坛߇ewNkcqdT#_GD+u 9NQG_!w6[^-d{ h FZ) 㛳I%2#1t$H x1aE`(:G#I'x4`ޟ:QQr˹d~L=c,%"YEWe=؀E"rH;,P%@ P҄^YSTDb gZ@{Pϖ?jmoxh BWA41͌s̠g]uHZUŤ-q;D6˵NXiVEQ tCRsׯ_0gV l #H%Z Vsn%5;h>nV8Lƀ0t3wFIpdA+ ɲlF,x)Κ6t'LqʩxJ ,$'˿gϞd\9"9!f7K>uQ^(t"a :H+PR2Z1@zjs} ' eS]1(ӌ;r}4ls7v7\jR]p(0TNDtxX͌vXD˲\Xq6Rhrk2ݎbYPdEO\eYc=ܓ)QV1mW4',.IcJCuBq5obo̸4E6=6S?*AT'5$T'жƚx'}y/ ^LXDot;0,ʤwXddNnYm否4ٳa䞁NFdzUQ:ߥtM_oyY ަEl+iJJӆ0_p/$7A2!;iͽr;djoW*0" ,@`%\9sZw Rh }))i" X@K%wF!&Ͷ _xz0LT"-FFFף}7pS811mc0 n 'J+E$j8NNN:$K!]i%^Xe9+ҲZHR!DXG]vRM=w-mo6.×8}4sojJ@`,e1\7VcBȃd9 Ϛ߁ Zix펞s[ @A U7tO |qAcFGSXw?emƦ}JfWtȲHw,߸qL4 .JO#sٌ6GefD!H۹&ʱ@*>3LoРjf}t6-RSiS<k``7 !,D yzgH"SxJJ!JHw6Jv'g # 6(ʚtCyPP[dޥS5~ ,S0 Dv[UiVqVq|i]D[U;CkC6C ܆O~H@sGwǜy<RX(1-,PrZ{T>^,+d'GtVSB ,s щpQ{­lDěݵ%,9=$pke9U'G&IQU5>zX&цQ8!Hʛ'w@":yq _&%ÏXgd>~B%^Ccp_ Yo C/+>МR 14bfYvt0"LLLLL-Lժj |u9L` r(4tX};ee `卢 ӕJct pƮFJ ,"!=KT9|ET_RdA!9O۔M;vPuO,. 1fC/DD]-]$&C/-Rŋ43ܵ4]ױkT̓(?`rX;ayby}$v$)b6L-թd#fwD6EEh{yfI#4GnKtN5MNk>*ݑ }]1V{Za"XB?!U1ZwN@e0BqyxivW1DWLR[9Vo X-b&A 6B>3loޣ8?3,"۲q| 7 R(=-iKh(?z½M{8IR@=%ih5HsH|-K+io?Fήv/yvw<3<'X6')_Q`MGl |p-۬b$燎,RY~j{kF>՗ o+)gRuR&F4!/:W}>_\Nj`N߇P( -|{wݢ}$!ŀ$3!dSS$IlڴٳMUUbƺ;lR׾rv mc!G\׾mG'B'Z'{ 11l(Tg2EQΟ?*ZyWk %q+PSKJA) !JryV)K5u&d[=pєF @A:v*jax<~Fֻz" ~]E<_ڰJ(r5Z,4sd2'I%g"z !Ć@YէAI_-b2eθŚ©T>y?r*-IXBW!$J{9UY\::_ D6B%OM:5֮J>oK֝J۬׮]{v!]478dx:Wp52p(teQQ*ɴ>dfz~C ,oՃM^x(b\x:ۧ*f$XBOQ <\P"6] [}gǟ55t6{Y Bߦ pdj.pIEE*B\ c4-wABϹx刋S_pFLRX*,x)#EL1T| 4tBڝ1kppp͚59t VrB(j/Repp8CkmVNrUGn~Z "k^NyoM;O}ī_xtiOC6U B"XT=v&%R'?|ԆMڏ^PK-*b:VcIC/( j!XRMR|:`aya g330g `ln颺XBH!Ҡ9t>M6W[>Yןs,zBV  `).9S}r<1q<6: 3NV5>b+~nk|N퇁\B`R.ϫ<- WS9k<_b҃n{!Cé3T5R%[\E.]5ո<֕BRD <\o_,:3%%R5-Dt.zO" e2J(KgKy !֝Jj\LgF$I٘V*;p~P20]LXPhzzZB9EWe^X  V0 ,,]+UNI 7\B`I(ǟsjQ̊E`J7rL&c;˵UX,DRx^!nQXvfcVߪVvXM'R ǵ)i$3%+o_mo}gRz#SL!GٍηfSdt###k֬B<ƒ"P(lvrrrp*edL좧F`Z>6ӹkZآ@Q~zUնG/)! /1]ᰢ(.&_X3Rˋ* $mݺUD|I6z\kB{, }S3a}DhZ-w_Z~SfW㘁e`+/)Uʾs֛:of&7͛ыڵk}>ߑ#G=EUUS 6D"JbL}2&"ѹjo ) b`5e{d/#'U%9#R#p? qCZL'LL#Z}=J W/m T.t !wj޸SOiXOƵ-)TNņ&HA g.glMT>t[lB2̒$BuXS=EtPƍ :u!h 9Sʘ$IR,[5~ZҶ\(Gf )XC^!D`X7',ygÆUUC"˙k(} aX.=]24eZ 6n(8qℱ((1!tT5XN Xl32ĉ샯?훝Vw4|gY5k8P|͛Oj fg ɴ"Ix_b^erI"ZKٸxY-Szkʟ7ſ5V-5+XSB×k3Jdy)5Lq'6\bsW5by]ڳ|>iqa3Gv !^ TH8+_XR@)TϿŧcNS}R2ֿȷeeyz}W93*b@r6 1GX-[||eO=6dz ?hF ())vPTXXf!ӿoj r&YB@ J" }oɖ3fJKrE!䲴ДqEDQCWݲjl$!±@~2W*ݶ7* ,=Uv]?ĭ9ux5}-,@ۚskr&KYmWio Xs>rIZȌ|"UTӓdp<၍jdkД?_TJs5"58u*g c7H#ӆk=̏Ҿ#[}%EۚN+J\B>/7Ol>1/Q=KUUsFh6 4/Ózk&ox*-cRp8WGjHd㯜YF$|0%r.W۾: ρH)|ɋ ,`p.1Q3mȆKK;7oO(OMW [~`h׶mqٜM|E@nznv(z`BȎD"Rxm=;ƿ MUmێuB-j Z,S=e_IW D:qwe]S)uc,nb3./-Mkf`iB O_;iBX ,xLXq2$kk؛% XH!l-*4UMZiZO3V˒Rྉp\>{u:3<["]X% Xuv?i 65iBd!VOJ6kҴCuZ /vbo7nWx_ʸ=g١S+^-BIE ` !gN c9Х|tQKS.Li :7S3CUW!.c ,x]2XB"gէE=k&ldEsuE(xsK,t>*5gXX׺⯾"Jj !ԲOܨMV?B%_J+%I*en} 3mltW &{3/JUsq=U2<φ7nԎCkL!t@6̈(~_WY3لBUUSh4:55>W?B"Vf z0K#ƹH&Ṁ)%8Ά.Re(nM#? iETm`Fw|>ڵkӳOXrYeRE(%YԲWccc/cJ ,oBERK!Re%ɯ=l(ȥNDE窗I&t-} fnE'2է,rcoWMM;-Y~)sV]Lʷ\QqqF5`K gs·P{bI}"plӀm9g`ٞL!t>)XBl|5 )e]璉eܐp8g~?rƪF?2C0M)3_ /f]BЭ $I[k/€"ը)`ܳ(tYg[X6QN+'f#~t\,K墧#gI F\74ƺ[S+%'5:uW`V/N]0d`}7_,t)CVru>8m82GL5΍]Hպg]|$Ν;bR@Z?pƇWa18ڥ_4BQ5ez9,Y\EZ0 1=VUT-!˿nH0[Poިox7s9cov v+]/Q7OϱBH4!S3Q"s'G3`0h}H$255fZGFF鴶䙢(/rPlѓ>39!̅\좸QW:88fggg%Id2cCO 4Ans9_Tbi7L[5M_`Z`0haʹ*x(S~%0 mnfJ,,t*(ˆߢa & _M%~y> ,kx]֘zjh~JƦӱ|(XR5P^_I:Ĺ`0x9Wkv5)/UV !_/,t)ϧf꬯ (嬿ZJ `5::EUɤ 0t:JBRZ5qXB!3×NZ d"pxzCD:+K1zE39*VPY2S LEjjm?h)S럦6/]]{Q5l_4%*"9>gt6 T>rְܧ\6L h?;hEUBM0Գu~R)*i 9Ԇx<=׷hLJ}frr9qʼhbt̞W(ST8=2ᢡzV}Z}7|-.vZ{:﭅`{am5LD*,~°.o_3 =l߾=Jn Z2m[bM:vVĺ"ё#Go^~EvDXBZ IDAT`?dXY6 ղs lAmh0 !BYÂ8gB 9tf:wͩsBٗȇ15r1]]v ,S5h:>6?[ICWʁ'r> G.8Խ"Ȳ<<<|С\.2S6gpF)rԖoh쫎lUz)Rml&gsX:O6j7eu*吁Šɲ\U,!f|szAilB.,Ը5?qc d2_m=" ` Cd[STUħ,t/&gGXe܇Z\(ʚ5kdYZ7:?4%,cFk?\s5n(xFs,YpRѮPAp|o|dF)g" EC3QɲgQ;e)n `UV0 ׿ nF}Xη}X⽥QajvBp\w~_U5X,Q΅6f`9p$O(H磹 7Q)"7,߿f͚>-04vn|>z8ytdpqlXBWս6o<;.…@j|~nT<N4:PQx[Tt>c|B6ljAf9#?UUm(U%wppPA@q&Z_VZнn(K6ZLZ}/Hh+,)?X7Mle럮ppiq1g}q[cK f s _G_e8*lMv2W,}>|D"qUW !lr)"Drrhhr&kZ !BP&9~xfzї%;vn&g`6InjvMO̠.lr8/&ؒV5,O9w|MfaI KH!8_Fk`-Ü8Ζ%]\gq޳5@tg)7%RdY!r9_qʟB@ȋjIFXjz*0D$i%z4X+su _cX+ XՊ#iy$I} m=k3VHybd !ÇsRoIc\f`Y988xi'.<5ԙ6Nl>1&7+# ,۬4PV%;f~|Ϟ=z#G^mb VC;t1d04bG ˘  XFbZτyuYSΔpn "jnZgXo_^< T*HrNT١C^f,OnTZߠoqͺ]tTgtUe$IXlrrQg`j40@XH4+ A:-*iOS7n*O:)HZ$TGR)M2dXDy{ٰl}H2A4CCCpGgXG[sxrx(J$YvvhK2YJɑ?-O2frQc%G=/fvo)=Zq~Bk`ik-wC#=>1|I?zf7We3Z ,S]O2 ,QSe X5\5s*W_|ő⸢.랍 Tc[ZŞ jZ_ճB|-[<Ѭ0KHw^ٷo_T* bTmxZ },3lXtL2q,Aqƍ.X֡>/h ග˥v~_ׂ3NOxDWޜ8^j\nZ/54GZUyMgFNjSF ]M/Κ3wlƍQWiI+lٲGk0U+֮﫳>xo:gbohy4D"2F7<+?О^Dw]o-V K7ꆁZxL2^ t:M$t2\v8G j n3yE#=Ӻ/ifo7ZKy{Xj`P+ΚƵ:z ?B.5iMd`-%J[[ RE^\W20C&N{kH04.pwqn %zeKee,5j˹pYE|%)G.֯NC{6z{ݮd `9Tqddy:I@>nw3XLE ]:6Y3*V>2; ,&XB7܌INNcl|Aݯs)X>0 ~={[EٸqlPN(Be`yȎKպE"kwǵinbxMtB؝X=M#.g)"];'/f[۽z(z; 2\&=5qJ_n8bg %]-oᰛXp8 iO uX<Ҟޥd`߿ꫯncz;Y~B!UUU+dKKBW B###ǎӷZjlllnnnnnkoޚ`E"푂>khhhhhȴM ,x:R2(x)nYc$ݻrӶ ;յgE,E WCOZb+ b1m&"2M\~3cr:h]1k.\'uS"g`hϛݔZFGGO:}>6%}|g5]Ľ%mCZ 0Dj`jW2XbD ,ϧ?e*c8A"G7 `鲈{KXuh4Z,.7onE NU_|QgOhV˛jvY.KRRq+'%UL~m ZW@mTߐ>.BW\Y `J t1z0gV'Nhə=jz akժӁ@}kppppp֫8}6mڴiӦ"@jI e`Y&L6E M!TVWW6P䨉)dpp0Nl,(1ջA{ H466v|K]eT*i?$@3|>Ν;[C7 b6kSГX.6/\hk=Vi 6G7ZBM5CK `9쪇BoH.\k`7h$IT;\ʵ-[=d`D7IcX]Z aOG{@7[i,`ґ:SCKtCoX~}u61t/]K"tХE^tCKtCo]U5zB h &"kX gzr2Rh <FJl|IQr܉Fg(4MRhtϞ==j- R;t)2iK]!GQЂnXk aMR% iSϨ{i[W_}u.lx&+8!qtCڞSO}_7999Y$I2mq<2G7:ntz;100c|e onpꈲG7:nt8!q=,ETU]jWtsaz|gjj'+gyӍ@'uW ,/| {^Bm 42e $YwDԩS7nnAЛ|-Wcleot+Ijq^ 7p뭷^}}}}ǎַuw?l Ym~o~]vY8޷o߯~޽-@7[U&tu ,,t5Xj`y!uȑmx<mo;zh[x裏a&I${5wߴi$In4 ]wݵm۶`0xe{NwR}xE2L$w>W*SO] IDATM&-y|kzz߽{Ç>{n!u]5ݮ3gw}'O뮻>}_^UR?<n/}w}r𤆺?wyѣG=zw?en3rxZgR|; xo6nN𰆺nLcz/tM\y/}K4`h~_|߿,Va0n Bmiv/;v\~/BxRC=te] h77|WX,+BC?^ck^vLV?񏧦}??>,-J=?gYUU-B!vU'5&&&^WK_ڷo_x\[oL!n 7IvmwW_|-O1eoꩧNLLLLL|}ꩧN @z>J&&&[Ν;N;ÚnǏ^]w][ uÏ|#_EY+ECݰO˽O<+@C _w}7RT*u7}ݔzQm쳑HMnw3V۽{mcnhEw`3337pß{__};af= ug>s]w۷RG?>{: +Eb'|rݺu֭ڡOtMb.\X6U踆a0ڼyի/{D%j?O_~Æ ԧ>ZU+x X6Xj`@W#F ],t5Xj`@W#F ],$_qP(t-}韆BcǎIFT*n@/$ʺw=O>d8v~g.۳gUW]/}MX6 *3gά^xk_=['Nv `0lAiqC.{{ޓNoR[o/L~(~]y`ptt+_J/7yWWSSSvۦMp"}{oxvo};@h{UY`}W/~G}{+__׿OO|lG馛[w??ؒ_BX$??AmO~׾'-=~Zq7ر#/~??߸nݺ[nշbǏZ|7uT,ӷܱcG?ёF^xqժUlv-@` !@+#JZiŋ=yfV:>yo{Μ9366u[n$0Xtwآ'NJ%w 2֯_~… sϫ^O|~o8v~.B 1`pnnn~7ܵk#u5|8vXX;믿~-|n m۶|{]~}&'>馛~=wΝ;cؾ}Jҷ-馛<*='|2 93]q{W+0 BRDB 0B!XB(BE`B( #BQ!,!P`F! 0B!XB(BE`B( D.^wڵgNNNNJJ5kڵk^BɝJ=ӇzgΜ0̑#G}7|SB!dw?#F?~<77{nڴi.]SB! Z?' Br'rOjժ{vuuuuu}7+Wq?!;YbŖ-[gn?(?!=FT/dO::::::>ꫯX[[@JbyKJ&K$"/HJj4^=cSSSNgo0LH E^"2ȃL&GSB!?k֬ٺukggjݲe˚5k~)!܉gy^{&L3Ϭ\2u`Å0LH E^"Qp& % %%CdBp`Ћ/KyCyP<@/ANbȆ BrM!QKfEDF^"P2A^",uVȸ^zF)> ` 544DDF^"P2A^"2pOOϩS~uuu͜9s{\1}!$ _G-**ڽ{)S"8|PWřo5a]ޔDDVς!^#܌3~k3.\x'njs9|5bs 5gYb [ܯll[WfݺҺ2Zm#,!4,,_|Ϟ=Ϟ=i׮]/z~y,Yj{g:eVVXi% |Ѿ 10L$ שHIIj YPiEWY=Ϩɷ9zV{8]z*-.U\_Z%Buӓ W^yz{{@Tz<ÃY[ 5t1X#k!F^xzÆ ǏOHHp8qqqԛ9vRB–-[z͛7w ͜<&;Noj@^yd&Х]Yq*++} "#/`( /\Pǎ{7yaooN^}wu:5\ytju!Y1蕫 UXw2LѾ0Lz/]t-[[/ˤIؗn馧~W_U(ׯ/nR͂Z(|6+7_&<_DbeB!Qpw5MRRĉ,Y5{OGGǓO>_4|?O/᯾'z3A<(hB( p%,B(X%T^^KyCyP(|M!b6A#BDBE` C^"P2A^" 4 _b0B+W~/\rF }!8tTuuuϟAB裏>O=XT ` lh_KJ&KC#lܸ{s۶mwy'm[n7o^BBBBB¼y>s'N馛Fc_ݳgܹsu:]nn\-1H W!& C ˗=[oj*ׁofQQ0eeew_ii9sl6p _npaÆ~;?я?-[zժUyyy܆25G56_1f\Wt.}"wfuuuQQQmmZvƍ+//~._k׮>׿^}߰Ǯ^zɾ駟 t_zw~)A)ߤ\rSd ,B&N8uԍ7 ̙Ço3?{۷s=WW^}o߾kرcGΰ#=S O̿=[oU>kر?o„ կW_z饒ؕ+W.^G ē.,#=裂e~|EEE}˾Q/ V\ |3gc_|ŢoY8p^ń"VVO!u˖-N8SNկ~Zu:o7c=_̛7%KB~:a +D~;+++ H^"P2A^" 4yo⪱8}7j󌚨\ϠLh_KJ&KBSZv\!Ҋ ϓŅ_$B!&_oqСOoB!-.ŕg԰7FmBX&m+Mƍ۸q#h'{7!0.Em۶՗TѾ0LH E^"II{x'>{c _#=ۥBH$,q*q^~Fee% kKm6[eeKx<πg3D dnoo0aٳgSRRº[>DdD@b(Wo[o{$`Br'y,L#B?`Z]lHE!. 0ϯJyVd}Q!Pz0 à*6-ڗ 2 K$)`jhh%DdD@b(I } "#/`( /Da؝|!BaBfߵ B mJ+|cw fŅB=[nal`Hޜt K$Zop ŅznҊ.gB!IGl5AP`WQg,F!$GUي lsQ)+BHb8+\YYKyCyP%TlG Ms,0LѾ0LH E^"I8%%%EDF^"P2A^" 1y$!,!P`ysKJ&K$"/_] "Z`A/Ad% %%CHRQ]~oj1mMU!BR7|sʔ):nԩ|Aw:\՗i/:\D#B/??K.[nݺuinrv/j{%/u0LH E^"Ik׮ .lݺ}8{/"Л:}oe K$)~'x"7%+KyCyP%W_}HKKKKK{_y_ׁoJW?*mzC^z%x饗y {Y۝;kߔ@ee%GkQΰwި_gꫯ~ : dB0SA$DrLQRRB P #期ʑ#Grϴvww99#:tȨ*0$Cbg7$BrGQ"JȣL" }WeBHFDn^|ϼm۶͙3GOA!NC[ׯoooooo?_S|4ysKJ&K$"/D.:?,++?~|vvo,ZHďoq̎75E<țN^"P2A^" 1y$%f YYY׿D?-]>ogWI!Z>tC!+ p.@Do})@^"P2A^" 1y$CXq1lx-뢹cgOCKyCyP%T 9;` ; ./F4LJJ%DdD@b(I* 5FtRu5yG}^WS4!b5jO/;hu+Ք|<׏<+iB(@:v,yO5ը 2 ٺӐ9% %%CHR1Q3{NLppWp4椓0LH E^"IDfu%gq_Q^5i~nUZNZE!" Aw=^ے)QZ/B!\ KQyr\:OʺB^"P2A^" 1y$CE˨d GM?$B^"P2A^" 1y$[4Z-wp;/xA!$c@1q`&л 5׃BI! 0~ҭ=p=/KyCyP%T,`O8;#(^N} "#/`( /D В=dx3=h_KJ&K$"/bR&dLB!1TWiEWiE.vʍܫtѻ:BHL1QZ0[\e {oAKlŸ<_|جѹĈ7'DdD@b(I*& pQŅz?P;AstS1I'/`( /DZZceHU=OWqu!bzvDzBAR^r NFDWVVFDF^"P2A^" 1y$% @RU7=dkGʠ!d2EDF^"P2A^" 1y$% 9'sJ3澸'؇fnB07s=Z>ɹ '`B+If}ղTZpϊ=b>YF y!% %%CHRMa[@L wr(Bh8?evݠ>.0*q:Ѕ"BC[}F- =r",}}b84F+D!D[D.R.ye =S?hu]l6f#/`( /D #G ˟t{>$'!ڗ 2 K$)#b/wۇpU+V̞88 !9\#卷}4?O)@[/y!!T*ժk_lgA@[/ BdRffZʺ{Tj;LK-anɛN^"P2A^" 1y$%~Ι3?_ZZ:cƌ!R##;WL>BÜO.\鲳~钒^x!OSURRfq/_~x'l/ x<3!KQ~=>!ޟkyt@ XF!';`W~ZH?3 8_WnS0-VX=.O$)DdD@b(IJQЛ6m?ԟWcqnro\޳3Urk؇`༣{ۭV-mk TsL&SbyCyP%wK,y,XظaÆ_t֬#DgNIZY{mX?Pe3vڽW z+tiB!Sd_ߟ:uj||… CV_q5K \V}ͽn_vz6.0?`{M2!B%rŋ/^,9#fO"yɭR!djjnˇҊ.van4+N[rȥ#"]l,YͦCX}h_ȣۙӒJ!oN:yCyP%LJz}-H^ed2/kpkc-X`P}% %%CHR`J!\w;!*%.6$jA\]dX!B~*-C.!cl|h:!tҦ`zUi9B1, 0( f){Hx˶?D2 *0ηK+ y!% %%CHRlG3\޽;α@!B^"P2A^" 1y$5 0(ʻg־ج~B^"P2A^" 1y$5yTV/0CoΎ|? Bc yCyP%pP*Uw=KiDGnv2wGBHõP#*.bĽjv=Q:BSooIͽ!жHa"oN:yCyP%԰.p"nb݄빇FwJV nmDޜt K$a:%9TupJ%G,L+Sb-.vaF-'F 0Ei\-}.#!uVѵ"~NdY""M!'x_0ٗ(Yֲmtz# IDATw0ߨ-.؇2Z'0,H E^"Iy\~ogR)] ~Z;lG܂D^M&!4e' DdP@^" 1y$EŬ\\Y^ g֘S3ECOoӡW$)))dDdD@b(Ilnrv}Wаڽ&g7*zD*n=5/B!>:ׯjBN71Xw}28꣍M2H cqB"8-Yo8;י)YVO 2GQ1-.v;+ߨo &r=K$)uju!Yk+Wt*7ūV? zݟd r^ZM:?D!4X~~U<L=*-'C=7^(h)c7v!BBf0 àҨtMU_IxVnh< K$)b X&n1IG;hZh< K$),)fa{8k}SB! pXKL=p=Աy͢B8 ɟ]#yJG6*J 6KJ&K$"/Ep0ZPf}o^Jneͧ=Kuؿ̷_3#4>4 }"P@^" 1y$5, 0& bԕW;Qf '.^uJ.>"6M10,H E^"I >`v Q玲IL㞡{oCnӄBhX\݊<@%g˼\_CnӄBh `l>OR=O~n|߅IedD@b(I 0o"ܶJMS hu}ƳCb?=>sCedD@b(IJAX .aXv.}2(jIu#ua<[6JI{c|&BÇTa5k7%qCwyQaKA_1Gy 0ٽtNb.'ؠW BA&_=##㮻QǵZА.e܌Lӓpz)EϘC]O|XVYYKK$)I=R % %CHR^wMLL nt:]}ƅJb޳h̳?"P@^" 1y$%~~gy~2CBǓzk|&1!#rO~_Dp,%?fq/lKZgVtm)>3?Cz_S.r V2=?`vskk+lπg3g()),C J9B;v*mRZUVa/./-L?wNg{O(燐87󜓡?D.ɛ燡dD@b(4% ,ٜ$ JĿO ߠ0Uu/(%C}}S\x<ٍAZdD@b(IJ_e!]M7YU0mJvOr r&V!!܎0вV|G47̞| 3OsR}B(,npR+=okd ^g: 0E} ~ +Dv`(Y /DBm/kOǍ-6tr?h[y-.O]pEJ"- % %CHRK!H1W.fvk'חYguλʺ 3Ӳs=' x1BтX4&gw+aT0.aꡍ7[6QB YBp5H*hɞ^ڲ&}[/Uz}jj'K$aQ[ܯll;fv1m n?%q}s^uW_Խ!H10,H E^"Ikٕině5ցze,8r:XWѶG1NaI_ njdD@b(Ik䜒tjua]Ygמ>w{yDդO߷Nޜtrھ-X8BH8Pl[r_eSUiwu3;V-J֨(RO`fݵLG;Ú9 cßČBH5;m5**à oK~4ij.ױZǰϖa9*+0,H E^"I_ٮY'mrZk׵pj>'J~Ijt.KP.LRDβP@^" 1y$E~ffy5ؠW.2 qVA%.^'K1P !P#5;=OtϭJP<*`]`Vt h4}?YޛS5+D!ˆE~׬(ZU*\f R(NϸmLjOޕ[ǜ9Weee/A|JK$"/-@~󲴍mnHITfZߞfuSnҸٵ(ɭR.wd%CyP%u-K 979~4>xLYSSᬑB(K(dw2qJTǏۋ$3fv]dٻ֎u }-dD@b(I e:FP@W/ͽizjȤSq<ж1 C9Dv`(Y /D,՞ه+? 2T`y=0ULƽbȳe#xnEB"AX8*CeŸ+MݼzUyܻg;b%ЇZN\u[4TߡoBH\XEoBgN%+.KSf*JoߒX JkFMNpY#s(l6yKa(Y /D,qBsC)7Fe[kf,O `,QyFMQ[cqqBJӐ3|& IJ9>K=+ fvUJ;)?ź]A LelΎDβP@^" 1y$5,fA$=|fX#%.Գ=)sm1/Tr^qf&!*%FpZedD@b(IjX` B0PY0Ժˬ39(m՜UFtϧ9zUTL'o!E 4tEhZ1s:=ӳ]zeói|FiQkC!aQNQ|f;hQL'}HIIk%@ 1/ꃿmA"/D,! {h@]EKWy=]lۥjvu7b"Y+d|>!M"/D,KZ>nSٙ']ub3laQ1q?t(t/5b+ q96NMG&rB]1ҕ'j2_vY]_[.3/qN6{<C{>{JL.ɨ)B!lcǎ==tB;貴?z:}hd9v}$tP.Iy f`?t)R}W!#IxsLJJJW^^>ؕQjf^e+J+cK0Jm_&z/Q׻}ѷTXjHoE6g=]|byK$"/$ aaZZZE )))WVVl6!%6R+y0T{pia"߼qQ[0m>gp:RbCý.24"/Kk 忖'GXo|]㲔9 <䪸Psq47&+qLR-o]1dmh}7 OTg~ :`"Y9Iv)/q䘢D d$k׮5k4445HL.JZ(͟:Q*3;JOF+XD)!TᏨgW. P >~Μ9G}tM7)rr4J?*-'C;īVV~J f~<~/olkhQX0QߦD@b(IJiH-ZhD|!w0 _cńɊ'~̆ ۦPi:s\\vl#q!4nH2rC1g;6Igu{f-Tqͮ+Ѐm&KH9!w09CW4ެS5{ɥ=' [pU ᥲo@<" /yP%` IVjQWo[Xgt5M{MCZkZ"/DշnkvӉVͱ+N{wN=agٝ\.WqK+̭@![>U/[fغ##TaFUb9c 1v>Zy%c` q gJc\}m*ͯn]3.xgVڌk]8qoGוUM#/yP%K8HR!{S|w{iKЫ #Eyb_ oMuO*smZ'1Q\oF^(K$),$[ \FSw=Fg&4Dد}4~ +.V2}j,gz̷ #/yP%` 7y7E%UnȮѫm5Iykoso3wKFz>x= be@܎J7J-TUEtnGM-jUN:6tO?vFk=)f0[k0B!]y;` tFiꛬW>bomZ^^{T'=7<:ص{̴Kzboe1m BH E^"IaP 7Jۺ:wxO}]`AY^zOīZض>Зs1LBNXJ诵\Zo+v Hobg/b%CHRX#\G'#\DϲU: ^(-E^oS_\f GPM5C!4XXQ#Efv OPteN<ʹ4Mi:}Os >-NG BHRX%PPP?Ot]L4bL븫\*s[M2m7R^[>;CN~$q>xm0?fvԷ)6a$NG BHRX%$(M(]U,i6ὕMNv*æ[v&_OfZ<娜*fy|͖)[m4mi?ljwWwڽˬϮLi(u4csZ?{H E^"IaF֧IYp%yYZ^i<%V:-EګaϞSl=.]h勵;aA[?v9%o,p.?B x>kٿ9ݎc!ta\ٯЧ0&2_z7ͬvuG)v$-wsvNE| IDAT|wŴYK:G|q&4744\3;O%l 0VuCD}ϒvg/|%CHRX%$DL4,o4^DNeg]#Yup z##fd?yV78X:H߳<ȁ>}!m]9r yP%`M>7t|RH^{5W_c^Њx8ӢJ6qΑJ ~}ς9nBm?{BA`FR b)^C9\V7G7j l3j4 ؛W7@\'qyo0ٓ BHRx,!K٠#6J6?O'UWR_7p[: ^^X}bzv3Oewfo^\Oo_`hwwmK9A/r 5;Kz}֑i)=Dҵvy?|lWV?{E^(I 0GCXٖMO}´]0eǚRvLNo6jϜD+U`vtyohmUn*os:{""`558on_, 8: 3+Iw4|& +V̼ Nv,}fpOUj4yv'wF oYvΝ;].פI^xnM܏CNQltqϔVt n5[ruM}wvpp3ށ Ƚ={.4(hʙYՙTdT[ݑ : >E99.nPcgO E^"I\Emٲe̙UUUoPY[s;rO3)3} G0,*u؅ dP%g}W(9s_~Ŋö (A5 7%+MO chY 5_yMU̜C0uB 4UWE+B"ryq? +/Iѫ4fw}E!R(YAtՀ->q>qdVQOZN셅3U:Д$vFɅ˩SJf0[ i^H_2X?pb4O94fiY+&eML={BWNT%\ޮ왫]j܋"Jg/$BHR_ߤPPPL=;1e8.^1Ŝk\'?kK\9ǖmLE,EL*-#ej?UI>f8X{*Ǘ|L#/y$E1$}K---+W,))YhQXAIu%h07Ņ0sӁ(`rfuWi=O*&LṲLcR+{&C]~|0B"]yd? .,]ì,JHIIIyy9J=f3 3CmlS0T6ŔBݿ~+='ۃJ  M&Vi^Z>wπgbg()),C  bxŋ:'䎹0;z??wvC>õqqӭi[hiEWY}8ѳW?BHtI>o7K*B;8hyKP!v.R*&N]u6 t︶vAič=7LX~SGvms24p:~DG^(IJ>k֬{nժUFበ3CBs3# 5C)\9 Q#]*:G&נ6 %$!N#<|^r՚@,(|j_edc.Mm?::w-z̡2&SPAAp1泜A >p!l$8'U\Ki3N-fݐL<8~\; fk)'*&LM7/[:dcr,Mΐ?7d AnH$lJL_N+Ppv. Q(exreugVE2[@QLcԸ XPY吡^p"/Kd2EDF^"*E|O=57͹gET%s]oa ަ g;h T*5{}'n=-fyp(n򐇀| pٓ)I [D j(cfFK`"kKl<@w OOG!S?v*mjlgqsF[5=^vA!N峴--?7䎒ty$ɏ]f̱;5x*qYԩ.8;-TMUZlW3zzuY=*Uo:L%gFi׀Ӄ%ܼ -̱@H# gs+CpPo"GFmf4 SSL-Cg]Mpi?PשGA8 '39XZKC} Z !c{,`ysң.3  %u`!F? -`(&^1mb,`BT35:3xV:8Y'kܱ&/.L,//0L |ۧ.8fvԷRyYEQٓB85ڜotKĨ'lMp :7(QʬQp tͧf s93mj1W}Fˤgpc25Mx45^/6( 'm>DQ!/XD6&Lׇ`ݨjbD7Q v m>CלEPzt=3`(:%lg֘&gO{2@XR\o߳=.#5 ܗ{~G`: ,HN"cS1"^I3*>ͳFM+ fO/xntcK Gv7nУy1&̛jHeEw=l}7y9{!8O /\5-N)H7bD.EI^wHEBd`eG?@<"X6R\Ugno}֥scB7:S:ԓFΩn =r*NC]=%dhWuw^/Sߦ #ᄒQ!,EAzW LPkwY#.mC/ (m ް#!C]nC_W)tikmU%[UG`jM)i^3֘U- &##3OR5k3U4Y6U*M)?LQ5wx93*ȕa_.R:D 0VMti酜ŤG/.Kd.$нT3ю>t)uEը;dJ{1:M=mlgz_UO@wo `g/I+6E` l6f#/* ld8cY\ԵڜZm߯T`rYF.dZpv:s(J3Wԙ鬹'fo3$*2U4#ܽ<27oSw]Kn?{WlԡX!,jhh lcx.aiE A! J/ݷ4'AKsU\.pQe804{yB9#0.-4wxxNF_9wKks4չfWHT]&es%WD EYIM&M->١J源YdDV.o $gxXZb//pZonbbr.I;J.!F(OT]|K l{]fTk+! ],Fwzzw0)O3`PuZzd:793/+{mw. Ro4fwcZm6^H\)ㆳf7wdjaC8Xc`j R5tg_s'9NԦn4ҦedϥQfnj 9XxFG4*2TzZJu郧z=.?/@}h|K3EKD8kƱ˹{iʛgԤ$*;!-\kX,!B"%tV, P/ Gk'wTTt LScKu=d2Oos{H:3+5{iNU_˳EϴwDž9e'/[2SU=G-(ols gduCj.]aXrg]=dcrʲ@ٺjQO&U"P|TP/R\SږɨΔk4fpPo/ΎUGywB,,…F_ku.hJ:ah&H\Ɗ8y2|L,ߊw%uVx^*j-ҠX}*m-djDꥯgkr!iVz^Q+[&"/1U?td?GGã6]A^(M] 8"; fL}#Sxus7_/(XXwߏha63Wy 'kXi,5H/W*vJ$vؔ8EDe ʒ/@7ZUcIm>q>IVHKf)3єhL4e>7;KRCv!;IWW~h/RvjpUfB>/CDtHDhr>\jZdwRPȳETC%p z9/"Um'_#LZJ.VY^֕6e'24YhNe#p*MD"Nq5aW݄vUj'Zw.%2dJ'XZA`ҠE6V,^:bwD.!-漈c%"Z4-z=]ۅF|'FD,e#Mpcv!;&ɽ+gxqOͰj®)& Mq8wW ̵'k^{͖>{OGUnVE6i,^:ށ 5iRn_ gε~3Jdqwhu379g T`ܗ2 qtJ%DD$zSvq9&"(S|AwC]5LMm L즬n46Q3|x"o{@G~VZɱe"-yϥx)*e#!9oN""e9 4U/^:::Ikn'#:vmtMm$Qrs|)LLp8UBUwxj@B5L (ȪūƕQzbRN,FI&*s:I>4֧^EGލbyԀKoD9/"BP1Ӭ07nkE2@.* O۶%w<S9<'}FK\sHzV6LTSVߏi9eͳOd7+*_Ŵ,;ᩮlNbFU HU<ɱHgg3N4MN( %H%X'9?/oS!_5sY/d!29^js}Н\6L&xp?ɘA.˛T'G53+*k6QU$i唭Uu%l2_MNlԌ,WK ѠXۜ XO}KO?xױ~zWE\'Xѥm-\l~\z ~)O?gG[^{1F]GO. -u15Yoհ9@Z3tes8q7)Gj}WdD<39qjd~mȦ%r2A(K_ ;IDDDD"g}qqI|~z|>z74+-̆4c k&w<VFèwYw+ ʅi66b<WKnԺWysYyjSO=Oɉ8%O&(s2AɹMz6j9U-Ƈ_#C$3zW]>*'7,ɺoWȺҬgtꂽfwn?~o8_,,P*7pr3 /2꬐K(TlEs^DE:zfֽwNk{h"l߸9?SCSWwHw 嵙WڝMIM4{:IJ%}"orߋ1S^JQvn|+ȵ 0D,ʲnXMO|%q{'xw w׾z淟]WUcHVƊx\B1|8/"BP K\DSYIEϿRV4;ȴԹ?X?fm(.DеіuHV}9yRn!%N-ɬitR 9$>E|JJK-)%g]b)"IyϬ'aK(2ĉ.\_!\.?{5[aS?pƝI,'0nq [ s'_n\:Qqӳhٳ?K/D>*p>!^y'Z."}}ժ Ds}/iN7+{EODpOO}PqD4kٰJYҫe-gf~"yk30 Dl'X?S}K Uq C9㖳^)푅Mk|n%$r*)KWbd'Iݒyqxq/Pe.0΋OjlX/ۨ W`UwUxζF)E2F4)Zw O7Y [`J~_MLV E$c$#"b\F˙ e(LZEJ)$OJ{(IGp4+I^Y`Iӵ%M*aZ EȷCu9u}`VoW25qI9m}wW[=oiA)fP.\h>!(p^DAuEqj9Ev/PO Vq$%xY~IfvV0[_Ksb0Ù֬1^OYIj:&wU9WN=_{ R-hrU0 4h3{=iGTMEm43={TGьVM] OSYі7<3j2סjfz7Xe\o另kʀ)]喰>#TbἈAل" ̺WRz-\o=m[nJyE0@0v ef*]ziHP zfezq괺s{n/wѢz׺[AH;Q&띖CQFP%ogp^DlyQeeveߋWoG?~cmtE7b?vjTJ5`1P7] GZUs@RꝨTnH4]mʖKQΉ#Vu^Dlyr^DAX6_[""e΋"*Jw: v0 p U,8/"BP6ἈȉA9/W@B0 p uww,漈Aل""'弈J nr߂Ŝ!(p^DĠQIU'  AX PH%9΋M8/"rbP΋*}P (He\Bq^Dlyr^D%U)= >`GA($D"9/"BP6ἈȉA9/B.r߂Ŝ!(p^DĠQIU'  AX PH%9΋M8/"rbP΋*}PlK{--Xy EDN y׈O6}8켠!(p^DĠ٨7o޼nݺumٲ%LZ,vgqbgϜ9_*wk_چ 3}{8/"BP6ἈȉA9/"Q ݻGv}ak,N===#k׮pႵ`w׬=O"pݹ#L&Y v༈Aل""'弈AJq0 S[r^Dlyr^Dcq ---#4`qpGGGWWW^m؝ :xmf؝}˱XGyG/bWWWuu`w׀}ݥK.]ǎCpqʇݐ      *%o߾= B۷ ,ٳ=Xmm۴ eR;qWզ7:tHsi֠lWLDtԩGyd~; +Y#c1\RsSE$xwqAaPz6*&_z>"=[ӡC>ϪF8<777 /Z\S"###律"sJLK vvv/u1 J.Ťq6g[T:"=[S{{kGSEwtttuu?~废m5V(144/|gٲe!SlQLzׯU~oI#ҳE1.[L3w9T :xmV)_~{-]XV!FGG|'7o?jb*^zkժU6-) uDz(&}=5w,/*֊F˗/߿8O>d{{{</}͛ pʕ7669sU$[ʎvw׿MpPv,&YnzСׯ 088 /r-KpD6-&=T XW>`0 >Ú&x;:vؗu-ڵŋ復9+ͦV (;a8XLc1ɲ|/m/^xNR`*MIOMbbd;48LE| 0@ 0@ 0@ 0@ 0@ 0@ 0@ 0-1 S[yA[A%Y} 0/HN27*?$o|?dYNR>hCCCmmwl6oaϷlٲ_ (*RٕoПo}{=uԉ'~{lÆ ~ӧO>}>+_?>::/߿__X AC@c?a{={(z뭭[>S#o淿sݻ;;;*>|?n@ x```ɒ%h4ZSS9DhŊʕ+&''n@ X$0i#^WuXEwF `{IJ-B!Y\lijٴiÇ?$`hooW_[}'_rbb"H;v_%ws>`8rȞ={\"bWCN#Ó'Ofٍ7G?ڲeB7!      ?XM |IENDB`gsl-2.6/doc/images/fit-wlinear2.png0000644016036000116100000003524413510457027014125 00000000000000PNG  IHDRKbKGD IDATxy@Tʢijsp%i.;j~LV^- K14@-.(.i.A9g+N9o=μ泜B ]@02  `d@ Ȁ@02  ~F ZZZ>yDkR^:))I ^RٳM~...^| x޽'}(N^z̙3 *ٳgj$Hic/((hڴikAA^hT *mh4ZG???F#_9y=YΝf͚+ea~Ոۤ)U6tI1ߐH7ndyy6Z۶m;pu&N9&D *6dθMjRsM* 'w 0wJMfN)ATmPIF-󰤋' P 0)02  `d@ `ljyXRJy|30)0@4E1*VJ'#$g `: J 'QGr])tA.hL  `d@ cSzU!Ʀj8r])O0hW$mtNNN 899t:)ͳg>C_MSP\DDoNN ^^^rO>4iŋ-`,^0} 䈻}Xg{ɨQrR'&aɳ+~:77Wz^ѣGÆ ڹs5P∽,AթSg֒^V-_zJ{n޽[hVs`xyy;::ZZZ:::{zz]ܺuO>}]nWƀrzСC/_^1 $~=zL6 06,|wyo֬YF4 06lpĉ>}\rRS:2 C 1>|X,ZwQF"%""b„ } 6cK@˦M<ئMj(DMYe+9ҤI) (L}b@:z~ܹ?p@ tD `>}:eʔg֭[WrѣG߿vvvr_̂---ۧ`w[ӦMwaii)w9%IϞ=[vmVlllZn7HqJFFF׮]ׯ__[4mڴg~<ؾ}ۥ @ތ~իrv}xcccW\]:x ̆:nѢEǏ߰aòeƎ[3KOsر+_0 q?#""&MSt9sXBi3cǎeggիFvvvnnn_B/.J_Az~+c=?__߱c^rҥK^^^n\\\/x%wڵk%dff$1$R/ ~*$$x֭[bccK.h0FUӦMӋiҤI#1 ;wZ_cAO0 &&ٳgGlmm7o)4ܪU+ >>EG",;;߯^}lll&N(wE#~O0o߾ _{Ι3'22R ۷nݺU]NEmcck׮!!!|M޽E<]t{ܸqJWbV0 `_uϟ:u.']<0@5~#G]vĈrRYJ `*w}i+j}o߾}={QJye G>zVݱc:ON6ԩSǎW刉(T^^wVV֡C.GdJ*5XcE޿ͭz?饯0t\d7nxxx۫VRжi7!RSSG͚5KZ0Ǐ6lؗ_~*1`Rٳg۶m3hb˖-i߾ܵ YR:ȑ#M4#!rzɤIӏ?^N1 ÇO5jԐb4=|ƍ=zw%}ٌ"xI_uƍ15ٌ:t+((hԨQr"Fs~9@ `L+V m޼ܵȌOL>=%%%!!~J5L}b#GZZZq#1`n޼٫W ڵK]+) gveԨQ7oVq ~iѫVš Ė-[ƌk.`0FcQN4^h4+V8zh=.G2Y̍~7.33sϞ=u֕b4@j߾}߶<|W]= Jeh4UXzԅ=O]1(%`P&? j'Ol^H]cHʊCCCE5`@8p7ߔ5a4pɓ &8qB-dyXJye /fkk+w9R1$\tյuֻv2 x1Ndee銎'$$t}AAAU#_Cᣕ :444tڴirרnJye Q瞳ŋK9r_ݢE 32S=GTҥKW_*#(siӦŏK\%ɂYjŧ7[YY[Jyxyy6[n(R ςւ ܺuKZL (ɓ'Nkܸ&?ݻ7lذW^y%!!FrcWZZZnڶmY V/IfWnIQ\WQt|0}||E)'ISPu-]t׮]ݻw0?8666>>Irc |u=U~>},\Yfe0Hӧ .ܽ{wTTT˖-r3|VR}ӧT{FUJڵkW l |1oX _nϞ=ׯ__kWgAѣ… I_7oԩh<$Z";;{OLL$}L)#07R|]xqȐ!ofHHH=yb P#Gcaaa1 000000""W^ru;vNKHH"}y'I QѣGAAA\\cO<6cR>1 ȑ#^^^3f̘7otW1g5-E ^/W^ѳgOAE2&L8~ C-5IOO֭?,]j4O`4ҳoc `~a„ }ɓ\0 fM6lسgO.]." /080&&&))5?RJ/]DFcHX={vС}]nuH/J)RUd*01ԯz̙k֬9rqB l楠`/>xK(嫢P2}R[FiggVV-QΉ eeyŽ[{*WB]`&E}e.p2bĈ͛7UG)SJg&Ç'Nk.''R … ]tp &o>]omVxx̙3WX1~xkAI,E &(//oܹ?|p6m.FE<]6|8qf1`AlllΝ wߑ`R Ϟ=h4>>>|ͼy GR'&a?LOoo]cHzIII;wnѢELL $냂$ݮG(Z($++kܸqׯ_߹sgƍ%jG4DiKA}(0}bA `ǠQ1;zرcʼ -` YfFDDtQrfǠ́*[V_>Թs\\\rssU4ꐈTN>yD ;w_|1fki$?~m6;;;)MOO_6m*w90YtAÇҥK^e"t&Lo_~m۶ Y)DL(rTTT```lllժUs F!)T-[n.nUP/I:;;:tq ExWW\=z6l(nIP55͂x񢣣c yH}Đ0'a=M-ezٳ=Ӿ}{!;?~0tM#}nJ"FZӧ+V6lX```ppp5D)(tM 8\cii}F],&a@t:N3u###tҿ^B]EDDkaa%E߿?uԘmJz-;rQJg&pvvxb#iii]ƍsww_j#(5-Q10`>lll͕Zyyy~~~7o0`ic ppp(q^ v%--ܹs/`lZֶG[[[q/ٳ/w3gܽ{w:u=?PyL`l^^^z~ѢE"?##cܸqO={vўl@IO[nM<9##㧟~j׮e` )عsgv|͓'Os(.h uOVVܹs:}vWWW1R1>KEcHLPmڴ̙3/ԅ1`={옘۷[rr @}9Ү]3gHw9`xRh cVaÆw}WrAhڢ "ւcǎm۶ƍY sZnn_XX{=D@P'O~-[_͛5jdJʜ3RPPзo3f/ ƀ(˹sƍW^d{{{B Rw?# F0K 7v566699yɅW!.&H)3 +VYfٲeǏWT,4>}z 4HIIf.h(loʔ)? sC   6LII)#'Zs;w޽{I_-_}Cܸ:ddd={vԨQbR3 0mҥKᮮr#2V;y䜜mmm- 0ؔ ((護СCrr饯 ^^^rӡWƀIII2eJ56mԼys$0Eʚ>}g͚?@ sVZ秦zyy]n02t:U3fĉkז(b3HA)#ʴcǎ &3f=xƌ۷߿vv:w܀OPgϞn#XVs5nܸ/ c\x޺~iu('MVVuֵhBAm޼֣h42[j~eժUp!vI& :O>9tPa VlW"}!i8++ѣ#G:uPaz>44UVUT93/_,˗0Aͮ(wyg߾}7dqiӦoذťM .h^oݺdɒ2_b"wއ~1iҤWxn3h4ƐtW4W>իkXz}XXؼyy睕+W֭[W.[oum#\@RRRO^PPթS'̗1fA'$$e ;wL>>l&@ wmƮ[ȑ#YYY֭ۜ9s:w\F8r9 _MIDATȌ3ԩf͚֭[]*e،@effΙ3ĉCʜ1$2zFСC-Ο?O D&::UVIII~~~իW崌"ӑܣGF]XZgSA`] N) qƍ F#K/qժU]]]_`'bذzIH_(I ߿?,,?裏lll_0`>7oѣ/`B (^ߵk_iFHW111Ϸ ֭U02 2o޼k׮-[lȐ!r0 L__8ܹs/`V`P">t޽o߾viii3gdM+@t:Vurrt9UNNҥK7o}˗ىU'K7P__ߜA222|}}-,,{m۶}gݺuoڴP L}bŋ%~.\ظq˗wQHIXl]VHff/qqq/6mO?I 7` %'Nw֬Y;qD>}qjժU~\FC GejE?Ϗ1bĈ#G|bŊ-Z\v-11qկ/ vttttt M(RZdgg_>00O?uvv".X0Ԃ lmm׬Yqر&M]#eggW˖->|ѣG5k&wET1`4|ɓ'-Z?!Cʮ0**==}ժU_'}1 p^={ܼysڵf˖-_!%%ǧsժU;w\pp0 @-ٳg:tյF...˗/*0gϞ={9|Ν;gff5lP哼ѣGk+U 3gСCVZӚPXTݻ.]\F|^+o{6mڴnݺ;Ξ=W^Tƀw… W^m/[97bP(==}M6xL_(f[{m7Ð׿,;џ2\rrrU9s櫯jٲetNNN 899t:` 4 cHKzwڵv>>o߶,:(VRzyy;::ZZZ:::{zzV :vCA Zj ԩg۶m^m6)O<|()e,""bҤI999?چxyyWnڴi֭۷>}G*|*^@=?c9--W={7n:ujӦM,ħ֥(aY jڴE pʕ+WUJkP8;i+YӦMK<ӤIG %$$lܸ~2dԩS]\\>>חHP V2Y 0U'ԨQk׮;vtww?2k,E"""|}} 'LeddZXX2a',XVVVUT ٳg*|PJǯyvA8ap?mР ci+~:77駟"""۹sgOO!CԪU J@\̂6M%&Lr^k׮Mzyyb ,'V;yf¤o_LLLtttP`9NZhQffC@@g)_իW>|?кukU b "ݺޗ/_~˗^8g''>zϟjϧ/6Z(e꓊&aIQ Y޵>|#h1 KAD\6yϞ=;~ݻ۴i#PJSE-`)XXX:toԩ3lذaÆٱ"ld1cgϞ#}m(qFtttbbb͚5v4\ON)Ν.]1x`www;;;+(We#>}zر{ٳ'//---, fA˯\F>zСC{Su:] {PJS-Fn޼U?o߾'Nt} jذD@"tF.\ѣ0w=<<<<<^z%T ߿;v,]V"dee&&ɓϟׯ_ 4jVfgg^ps}yw:tP N1 ZL?NNN?xcǚ7oֽ{wP Μ9sZzu P5">>ŏDEE~!KNMMm׮]#m۶=@oY[YYXZZ饗JB2D]դ8i00+wA׮]޽{ŏܽ{W^BܪU3g?rٖ-[~!K8p`hhh#B>|خ]'N:U 6l۶̙3^lggwᤤƍ7nɓ"}(uX Ȁ@02 RիÆ Yf͚5 )wE\w9F/2mڴZjq/\w=ztȑ{嗻tgOӧO\rʕ:ѣGre*pGhƌꫯ]wr?ܳg͛7׮]hl"ǪUwQtdѝ:u1cU EC5b)ʜ9s>~g:4==]+SOTT\; |GE!UDk׮m۞?^zP;kYZZ6h… 2Mo߾֭[u6E_yGԩs=Ay###>|ҫWӧOK_&`x7)ֽ{.\zjN++KKˢ#/R^^UJޑ7FEE߿_a(wBܺukĈwbS-ڵkh]ݽ{D T;2tи8 &%~z~>SWPHj̙3ŏ={e˖rՃJ\Xx7ƍ+W۷gVD8044U*yGv*A]$۷o/_O>]6`(8ρ!`/E=kRˇ"hVSHڕʳw>5==B!B!B!B!B!B!B!Z^ k <AA>xΰSqc #sF)?vS~X6ctZ} U - ;_iӌEݯ<#a a Q9$fΰ_}!ϰ5КˤdP,.+C4|,lSQtQh!*QP +@iyD3l56UJY~H)cB [엗gAWe@zPQ^j AkҚ]HSvOZ)H % *R;gX 3U (@Bيzk ;djH{VS3ZM@ПPw@uYM҄MBDP1h$)D #CKJJQ I" j/Kr "F۔!jn݅jB 刈YDL5Q8J P ٰ1bwH0D } z"gB~"@[?֏^v'YHAJIYkC RKZ2")F ՚YΉ*!H |!Z96VjxA"@PÍ==jG:BG:BGS̓ȇj=e!;6Bh \BpaC!V… ! (X# zCP0 x9 @P`A:N^qkqYgӸx#U ܽu9~>b?{&sƻe˟꠸? gcۼڿ9yF $E8'uWP@Y(~;m_3hϟ+=^Bk 3hgW@B~h^]fMo/ wRhu-ӡ3(8 m]f~, 56mNH6I{ͱS(üij_@g6JQy/A.ÙSZ|dI:/<#;~adoEϵѡ5sm}ε?s-gsm?NNCB!](|(,( G* !B!B!B!B!B@FgLIENDB`gsl-2.6/doc/images/gaussfilt.png0000644016036000116100000040730413373111455013622 00000000000000PNG  IHDRA9bKGD IDATxw՝7{swQN HB 0Y$}s]vvY&(0F"!#f4Ρ}h4955ݿtK9*`w`$ !@BBPT($ !@BBPT($ !@BBPTJ?oRjw,e믿wޱ;G9v0JK40Ca2 8_i>f>&@9r*4N*WT>bUxFa cCRV S{rW+y&F:T(=ŢHwI%># Ք $!!*!^-$B4$܆ MǕp=ot%7%PBJqKT@E ! G)DfnJ)D(F. `%w*!$I4KE[9L44Zd*<29αl+>qE3YhDQy&U`0ʵve x0Ƃ1"hh(ϊP℗Ǎuq߈S&Ҹ,$diRUbwruSII$^az=T>롒H.^7c7q(AmW}Tn 39UxVgr xV_U>9 29Q >ᅡεD'Qy['wll1ܸ.:̠{\ylˆ'ti9܃AپLN鳙O(Gz݂םO/.sS[𺨞:Wz]\ oP%ݑӡ[+=Ӈ29Ls,{\L%pV$ !H3J-QQ%^w@DWCne oPb@tts3>X;7NE}3/y@M%]%RI$ lMzILH\u(8/')}c/SoX]/V UubuX5I +2iXToS ||3\?ϸ<3]ZSb]ZKd.wqMY]xpiB^jC9iL,sN*Lc$w6E9"F;J{W<P)&%R!4BB Bc$e KfX*RYr#K,)'r^7u-QOj+=[m3n`MٿaCuQi{$A;V7*(+i&,tѕ?H;>تu4VĪEwШݒbM瘪ʳ WTSxV3 !XVl J##  NSV*R±- tKTy|/~髕.uQ[)ӹn٢@CBTq{Z}跤W'q|BZQ*tp#8Knn{3APYD;q0t"+Rf|&cX}Ex*rJ~RJO =TD1ुźGKT«%8Jh1F4/龬/@璹%^&囂C=.׷(UwJwKgܔse}6S9[u׏"UUh&nIn|4q7tJ[j gKMsȍ3F$ڗ+ҠW =] O`qJ[@ WC(!ʓȰD%FH}E5=.R~'>?K٥<['6*ncwHp١GgM{%#$J^ !$]r胇<ҭmX/sѨ_ t{\6}׼pEьm:BIuKQ B~ cDs,PԳ̊<ʣMdCf=KàOQ5tMvP]AA ! _Gda6=x%ͳ擔c܇[pkV{Ûe?iHvK*et&'731=/@}ϝ9O(e4KYoxAOB~ D,+c64c,n>ykՂlѓH |%9^j'>ۖoܮZSgEn-"+e,7=ۢ'% C/:/AOY4|OYX:%QfeUP P<`$ABβvvTlC)Ū b? %ۙ']Tw|'q#c|oB#]1tJo nPlLoy>A{QBNY`-z^Oқ4keQ r@ }ZY "rEp$AB%Hc$zZoB&YoB?z, a)%h^X UAᠨ!FhbM1!M)PDmyG]є.^8=U+k',:iV'ĪKuM sHxZ&Y,E,U񱔖H~a@I/Vp@ X>zS]'$AB62ĴhJXOL뎩V,D7;qʉSo~g4p{XT=$?aGI7`G϶-z\w֖+dۚa=w⅁Eצ%<&jciV]keQí%c0H1Mj -" -;k\BU@ Ī`V>ϳ*XBJn^Hb|rXwSh4`[8 C}AyS~ZU=7ArHPAch|mm>9I)tTMwKp"|va!:(VŪXkdQbE !B*<׺j$&$VI_E}^]?r>NpMk.妮b곏Mi·^D۴A[oSz>^b}57 JTп,߉uk/ǡd%Uz'Z+ bMH !* քX#6 !RT"q5 XMBgp>Chbv|Fp"J*sO"8m{?W11dX8+;a1YCKĚPTRE ַڿK>&$քYBbMHY !Q5KzZ$՞x!o ԑ*@=â>qB6e>z.Z+=G^<<ʶ}oHαoNTUo O.f9ri}~2n 0H/C -ҷZD{R"_@b!waHH'ф׺cjO\iGy Bu(?:$=H"'^$|2$ wbF¾T}FS<{xڒ(քZY ma΀p8H+J*˺cZOL뉫1H RSq*ؿ` <2[?Xi=G\87(i^e^6[tdmHU4_}q)̃L%Hۖ|OW^9HtK'zB( Tke&$b,ֆDnLW $ABXT-̯;ČO ZHU@&MkB7kYr_OzgYS?uJ|C\/:{=?KXxGl39+~<qѫU.&5VDQ#?(!VƼp8H.eQ+vǴUcZ=JfR|$ċ14<5syjA.~A{D.xcOc52qP^VR,R]X p H$a$~jWL뎪]DZY*M۱*JɍҤBKZ[!c;V6E-.9ߢ:VĚ=jqzE3|'^-F" jOLӏqsK6,b]X%=c biAB8$鉩]1W튪]1ʋ:%Ԕp@/Rm~!$>pB_3D8b۟s/<>x7߰`!ڋɷ^Ik޿|O+$NH,iK쫵wuQ !=Kb}X 5! +nlp8H댪qDOZEdb;g$*x6F5gṳUL/RjYUl{f\+ 4Ujp%և*.,b} pZsқ:jW4vExwwy:YڰX7=#XDCUe vC]i^7(nM]}Fٗʮl>z[BdcT`NH4_w+ՆŪ$ SWΨU㽍$e=a2s=8# 䫧J @x^_-_UEXptE{vu#|C\w ٥mf&_WK{%3LW|ЏqDuaJK URW)-p8HG%ƜO# ͡p@4*PSSӜ9s`uK[٢gj5 bM}x٭Ӑ'/ڳD\=$xCut˝E{iӺ~}:bƙҤ;+B1~3x(AYw|+vԸDG?.6Tĺp,eH@4Fcjg:{$p!8n+<n-SZqfXww*!dcT:աoFSVᨹE}E} c=,ZqfXwwj[UA[Zj]Q51p@ԓ*>,5T! { pzZWT눪$p^^HĺT'K^7r?8}Zok+|Ul~F?f͖n˖06˅c ImjqFƭA삁>ݬ+c]bZHMh(bC(U`B1U;zՎ^=vDԎ^5uSL> Yj#]3 _)jRW>ʚ>ԏm颽ƫq1o3|LiQ;KP%5VK U~P+W֥<(#U{٫GwZ+H!lWhNX enU.}Chhfqwm7Z¬ :%|v?u!_pb3IS?/;5Ӣ'ū%@ xW2%^\ɢgVgrCiP3@bcT_%5VI RCV$Q9a:"j{z{OGP-5H!VY*`>_7ӽ ~vmʯ7<sb׫Do*O%o|dxsy#m ʏuwLimGO\zs(b\>``^_%5Bܛ+puKm iH4'̜m[6Hq|7zN_h[06x^|1~Fڟ/\3x76uqZy5;G8e;r;ZjkalR-BuW7?!_ykJA 4 '̲uN3RL !sݳ}4g6xK\"j %N$H`1Ml8S'V-_S/Vqvg vW fAJva4{SgR;]!!`oll}B>dҀ]Qb9Ϗ"~c4QJOU-?W.j(cDH^:I7 ġb5qv.לBI*|Cҩ| m 'NNnBx,ʻ;imA NĞnU;3꾟GZn:59bNzѫ=X,5& ҄JP#M,WSqSFcIKihQOW6V4buj_FW~|#f j6hW1IWlo<߱ЏN8xF"ӿ>Sm5T Zm R#GIĔzׄr릌yBKe_֣V#ӓ{=XCOqEtyl8᷄..HM"P#SXrSǠZX;OF[,WDnSQiF}=cfqjibkB4VXs%fXC8"o(m-QA;?XYms6x !/B݀e|M8'#Ql+u._awdسw8 AI"\\?TQ^fT+Ѳ oP;L'LqSL'ֺ~L^Z3(!5 7[j=~8sg *lF?o73:yxx2λ:J*aHD%t1'|ksvʗN^-<$:5nZľujD}ݚ =[*I?۝>P-Mw.`#|4n y2S~Gf\:Y/l15A>}g;rJBH(2+;3x:sG8xr1W4mQZ:x 9ɗ3.2IDh]XRK]2}ɍ3%WQnJKjΚMBk[q$$"~_^N$og>s߶70q5Xd,bTv+Y^*!O0{+F^CC|K)b5>YFhRϝ]â57Bd0h|a oaT$!̪*S4ŶPjF-ZxhUr7?g7-ɴxG'N!^ɤ !$h$*!tW_>iB'Kw|;^-xt@*?2'/3Og5oDLcs/]h",^-셄9ڇύl״8F:X\0fc0'zKYZD[Nn1$Q5T$m} $6ru.y'QҪ66LPI}{l v+_rzC9 \CEAB`&Cln%ɚFJOE w 4d5 d!hs[Mc:Z !%Mfw _(hQ]U5\0`a@h& ؍BBHXu|&'/]kj `/$v0[VTE;+'K 6VhJ1- 逄ZF,L&._.QoDC=jq^-a* Bӥ{zSp顮FU@l#u Tv@Aeޖa/w]3.4ex3=,jgL5T$%RŞqY6ӥj?::Ӽat(?/"5g|rz!| !n.BIy7^S0gV 3yK=wWTv\Q CdH,P:ZԶfHP:$l B4׷HR ;C7Y.(6cjA+|z&'dEbmmoT !@9KQx<.b;c8ҪjZ]o ۳h4I]BICLޘ4(H'.8suDCy00#3j \guM"٦u=_m @EAB`h4jwdMOLeEO=3x uie=N[ oDq@BB`r-˩B2ǴN1bHx1ŒClf!–]$W(2ZYnT$3g!@Ez$?Nߓw̱Fe5k?2836T|CXN[ñs|YP?_e P| !@rR<7E"|7ti7"БEuɮ彌PW#ȷ.՛*!@EABPnN߫uKfOјW9tΜ͖2B6| !*V]^Ol?я,lX*GSByިB݀e;+b(!K?/RT_l )P-{ݺuOR~D?SnG{)c9}p׌%g*u)#k׮]|W^=^w>@%kjj:ElU#$?ul%njl0 uy=$7-s-kMPIM?cܹs?!/;ꪷ~;z+뮻,"ӦUDQG([j4t<q;21iÄ1cl7Fc!Lq_Io0y &H|gȋ_eĉv^fѢE'OOji vbDbѬ·ʗ 9%۹8.:2v#[ D5ti MNȊċS쯄/ ======/‡~#^:g5MMMhhd>FW<G(G?tQesO1GHS z)F3C1?,'_*}Pbm~ e˖SZe{p(Mק13ɗ --NIr]FxnyuiD*3 S`Mn޼{D"H{[oո<G? 7ܰvH$jժn,:#5䧎B2FesѲ(3oO4!<(~ / ~([]Q)dmB 6lO>}|믿 ;/y=̜9s֬Y__wq8ϧxFoQمFxxSN 3!BwɸإFبϫ\7*(c:`HPEemڴ o'`Gk+"pb‘|cYvK=caa-wO)om֏o9x nԦ7 gY\ũEe*V}zz9\9j )ni^@Hknn;pȻySwa4|NPA87ʞd6S x9nIoeJ 'ƙWv{m BEAB 1x J림Х7*{N7\n:1_.wxx5+\} 8KOp H,F,_Sd(niމA1HʊC'9ߵ}ثgrx=#$hnn;(+N]i1SPuKJ: ꄲ5:n9hʮ57 @%AB`9sh>icx2ے̼[\8PTJzsS~3`O0 $%K}2h։U7.}U2c}<:iXH>H~̻: &{K}orBV$^eO#\ͧBҥP|UgJ- PQ ):Nfr1B}d,H| bB(O0 $@j(7wF҄1?Zuˁ vF -qrig­lT$6m/^9CtԂ_pUo%b^˦[$7|~:a :1FxOd;K,WRVJSN) !@ y&ja4 ['VOib¬لVFQ,Z \8h6mm|SBRQM)Nmc<%˼%}, XFX^ʠ֔/ FlSBKb5VŞH3: L%cVRB(nquNc,Qا('H,0*Gk<7*|h D' }9SG?zG(x6R+kyߖ0Bz+eT/؀VB g-Y06gʎfc<8e2`dlҲ>cЎj0%}љXF8"v\ܸSm/pO0BH,0B)y8gyCda*n2¯ wLH%%ҠכaWgx֊p4$E'zXT?H=WtKLdZ`o㻥^@3glZ-]T%tfRf8BK477ݣ6xnXc:[-$ӏi])ėBRIfk8Un9Q,hVMi8BK̙3t5嶿j4O]9ngԴP*L_k8;/N<;o(jϕEx^p(ϧ $E+߱3 {vtt#28fO5BX??_c {Cx8$yZoD9tz) P kaEWċ^ q| QAB` T!KmRe4/,)M.ڳ;[fҼ3,t[0ՔU1q*f<5<OslHo)ڳ&$@j.uTgߣܳU-YkQN6N$nյcMmF3.EO=՟NТ:*8!!(<^#Lo +oW3N se2±Z>r7*(5ΞO0JHZl%dy|Y` b(T ufs5*ߤ IDATMMMv%dS%mT%F'tG=h_(@EAB`i0 ڴgMӤN%vKX߶`6L5@'M#BMwuLx̮nyyଉb|:(H,JF9MuX"-8[4KMǜ{lfn5tJz3ͳ$Vs}(ϧ-$z1Vh^hMGm1(ΝO0H,Րʣ5oZ:x!9[r-T1 !tlQ{%%dyBYMhW)\1$"CB` T?'_zcJun{H*ox}n+0\1xxnwاuIa_8ņ>}N#yo1Cl/ `J( oŬ1:}c_[Tvϩ) !@%XjEEXvpX@8 a@]$cwe;b~ 4636}X7+Sɗc, D1tQ^ [e%-=}cp@{6!BKbڜFBi3I\_L얌}FN!SֲpmW:ה%{٦er`gY'OӏiH2j@XQ:#=xKHFĺsd($ ,6ózC]7gؘ+Щ3 TQ*Lj=8IT%t1;3_tި+[ \BKDQCb{%WJUg556Ƴ?'v 1_t(tRźEFse[6`5$hnFҢ|huxy+ssD v%olIޮuXbΜ9vţrhz3(o ^XSE-oߗ?87 20fc0cPݒzchzf+WkaXRBZتvkBx߻Hohm=퍧4p5 mS&wfo} UF*H \X !lWZ^Oo1'{9x v !:KӉ9MRT[I \X !%PByjNeĪ+g0-)(s@^FXyB~p|u X+=,ԄB p̿(޲˾@\2 ګuzx '$V9h }~Z]ck8A'K?UM5WcH8k`X7IVptK 鄢8h9e tA8+k3>t>(#ؒ~/#QBo^+>`9}`T .Nh^'xO .ӟ47nlmm}9=u밻+8USS!dxj0`,ސ Իe2#=cQ& /;H.go<+n9zϭ+C5d1@ 6!\vg/_z!/~NK(i0aMORxpd"I6l^35(n9~]nڨfЦڄO?=cgΝg yロH$-ZCВ%KyKN8>EP2ڜh.}0WW,n9paAx#]3O3[>1 a$1ⶶ7xݻwq5\tEX VKFsXԿx*7 (3><_,e% b#'ċ)7$F m;կ~uM7|ޝ7U?&il]XڅU *. ::3߯0: Ⱦ, lPM$m#Pܜ_ynnnmٳgy-/,'sssʟ?v8p\W+,r}U.V Dx6f;b+='cP0/F®vNHphbc $џW+u6D11rrrҤ#Ž{>}}r[l۴iSHIIIff .*S4֭[FYL^Z ǚoi_%+ ߈,c[='J]^dE8|OB-o,C&nj21QӫY6-ͥP>@%;z ʏ,\pرu<~ZLYS0?аZza8kJB(ue!/z{vaˠZ7W>}zϞ=g͚ر?t2d!dȑ5k<_|fZoep |4N&Ŋ2 NIpn+Q+]Q+\'k`UW|w\Ԣw6mͻvؽ{M,1LK~ם:ujӦ￿xA)!BC-6KX))C!=*2f9hc)|a9,*WE$e O a"52#UJ޷_ kŸgqM'^bTW"MJᛑ_,`hl(l ęX]T@ֹABdb5E10bj+EFWS]x`)<-c>:$(@[ |5{%to1  ݍPF5fӵ:HrE@C@=FA=|?ϹO@hYGM)T,C ]hTjeQB@Xv BEJ^ݺf3ERD۴ s.\yA(UηWiTF`l.,p@ټSڎz Mڹԫw5>u6KV\H|cJ-6JbrMnlʹح֚ *k4U/X-`I]ҝ|S1^4(ȧb]U:"BV"8W{oJP:P&7N1Q#ߔ %'U4B1ShiljZۢh4!"bTVO &dbf)hWm Cf.L}[Ϗs !"bzTO*Ia ]ӱ[8Ñ|b} "h[YfwZ6ץ3BVqJ)6 8r"X ƒ1HK_-x#Zl49%. |au@CGDmv\f x*wOA)eo1%d!VQV{Cp{Uf;AP("77w @.+6Ha NR^1PUWYFX-ͥu҈@At|êa5L}SadsByXVueT,IOuƱWՌoN1l$)hFώޚϾ,tM8jkY@^OZrM'n NTc%ŤJ]+YF_+]曥{8Dנ5( άr}'] n1ԉɆ/Җ(hM/Jd ptm*h!ϯX#@hSmch1^TAQ)ՍJ4X35j\! q @XeͅRx$1P[ @$UBjkIax2 (y9=G)Zc%c/2!TWj1wW];%?ܬrs@_S]ݖa<c L5@EMVz|˹:"E3VT2D:ASP@XTT,Zkp8SЊ_R5ͦk9fi ERڪgz KP3Kצ" | ^ PD~>FdEW cZ娧YؒAʨY %AX3 zost杂&,so.{-+|TN=͒aKzB SOT>z׺pG;q bAzvIM^}]83)0d4ZhkYaaE@=7f5v¯~cMAA1*:H5%i3!7VthJbG;hJ*؂Au;wk:P_ZG cFŠՕoJqנ)(iźR<::D~*i1^4FY*Y$8?lk#ߔ PVV=Up ;24KvJ>R4B4Kbxn'4 B1e+t}ˑf|%eFW4BlOSƛ7\_9 7t\ XRkL5mlweh |bx*X֒$`gt-42~?;]5B,cE+]1[w9!"13* |k\KaׄvM}8s,C&b B_WF 2 KPkS$W@IIIS7^\# A7Xf ܩme >hk@Xkj}~v`4 9BJ쓬åWֽc>q נ)( Ԛ*swc@0g9+w䚎FmΝ%@7vk*_'WC4!"buYBi1;-Cy&7KVpRzL[!:\4,H3&p͆QZG Z/\iźRC%D )!t4N'+swKh t\ :/[(#LY)z !TB`̓ZK|<4:ASP(_.6Hy+Y1FjxvwF,qS"Mm1-Z!9Jg ecnu^q¿ @/ocSR824M18YWZ]$hVR$DF6|ڳ_:{PʽM :44xf B_j  MP3 x'|MAAsQOvubꠙ% D1:6*/s10pMAAq哠.+8Dg >d.Xf86KVdK m gBf{i.;}TqwˈHlZJ_V} gGN)iC&t fN#,K[% F^@B^\R2R'$ۅ⧪[* BL^v0e/xñYNj / Q,ۨQ-#hyp.q}];1؅kU# B35=d'6 L#Q-:6*H˗Y%߬@%P(+V_#㊵)l삕oVf-cBQ_WwHlZH_\?X3!P U<;sœ11W3P@ARBaPuRS{9fMAAѓ;f[2(;\`b4Ef!𘕞gRr&[Hb׆BY:ASP(_.^U\#@hGlu EQ%;qTz,d#~jmnMzn` |9WT3/߬/yP\Ԣg^&:,UQnؒ>G]Ww(kKd.Eo8ܡ hVog/Rxo_cW@`K}{z=ʟvW 4!(_5h1(eeHeg7Pڽi&Rbyc>jkp85;U@h 盕6EY'6Қ%RU8wK.0Vs+vDp@SPo |R82)|,Ͳz}A9jwK^Za$'}EksxAA+G-`1f ْ;4hnO%GL$_sv4!(T,\.Mu[GLb.nn&Bzl^hf{Bi1+, U\ӁhLI쁐6Ϲ\4!(Oď+\Dm|"5 Cf`a̠Yue Nc2Mm[ ds*UC5haEE铗קO!CbM:u̙Jd/d( TN`DwhbMiBR  D=B7|Ϲyf :AS-? ))))))/B~>z7EsPTnn.8`,X]?'lo1%Ndy/hF;iڼ[S;}RX;IZ@t([^zʔ)#SLYreݻ>xwM @iW>)ll4ԋc>PKtxfV9_;wR$`Y`Ǫ% qIقp={lBݣG\|3eʔylb-))w v{rRVnmҁ:DY|T8CAw ݞ}r4xT{#ZIKFk:AS-KKKSSSG4ir…˝3u]`5BS*\.^ܺBM4P=߬ Xa>'Ѥd|Pڼ1[Μp`wJsYU4EEN\rZZ_~YHTnnBSC+ W ))׋>l.9~ \!"W(fuџBWA6u)p].um:tXsپ_rbhHh'aB^_!L iii999iiiґ޽{>]7:tشiSFFFMr^4hںuv(bݖʟˠo\No{y;& ס%V }T4u-+\~&L )W(Cح[}ɏtڵΓ;YV Pv>ʕW=: G5V7KQOHQ!(=v1gn 5ώ=U9 Q =z… G.\8v:Of*$4)ul؃^Xq6m5h ں-Icrv\!^QBkKk%|ZG⛲ӷm6k֬W^yeǎĽɖRµWٮcq ycs5]̰O߬;y?E}em]17Sx(íP$lsUXU נ) |q.uJ:"LMHl|zRY /B7Pph-O`6^ Ţe>4 BENA\}R82!=*6ːBL }4X~l2.]cmY O pmD BEdg +zvm̑¾Ʈ\-%+w@m5A2I"q+Fqyc#7NF ܳr|kP/'|_6Ia+]9NlUGdCd 24""'fjA jBD:|i))נ)(Eʿ\Ma`Yz/6b&L 2{_Js:ASP("VsY n7+h%K!+VR;Zo%DLJEb BEӊ\ || ^\jR!=Kw ٞ0xxx[jundzOso4 BgoMRx!s '-[S"| RNS/ł$7zd1%R*hf[GI3jlCH%B&E wVw1C5h Bm[徯<ۤ>me8|@ͰDܓ*ĺ)ѭtͤp?V1FB5h Bq{ӊuRhmz)5 bED==ԃ&X{W7C5h BE'b 4Pow '",C"Y(㐼Ηo1)1zK5ץ~2߻KcQ@by)_fm\5߬ ",囕S{MiH=nVR.ֱD%ҟP'@H]_N p ǔ@B7p!Q*gI;QN_cב"/|$* נ)( 8㘷fM%w\z,`E•6] /(q @b:21PH%c qLYWh3 Pl;2#*}1%!"bU9 Z>fSOtSDY3 ʹy^TN'cV`#x[BQTr]U9@ӎz LX1%Bf{Bi!tBۚl>a0BV9#Q4!vKs.\?n.oV+BZڈوנ)(p8xp.SyG y:6km,/rӫn ѐ~eVwʠ PD~~>__ g1%6Kv+9ސ@[ԕAYDa2gy%4' >,_.cJ @ټS,FεyґL=!^EY5KM Rq+!)Y0^5-!Rj}x{SuoDkΪ\)hH:c>n>Y ?TƳcJ4!:ֽE 3\ePjC2ލޥ}ڴ0ǔ@5h BEsނBO&fɜ|I0鄶,|sV\D*=:Z;1>r( BEps` mT lVڲ\6k|,b\UwKPN ]wJR^ b(@A M&M&joʐP12 _=cJB5h B'KGƘoo1%ib|Kv3(==D %"ɇNumDkͽIQعt3iQde9|LPKhfM0+'^o㯩%DxːƮRآ8e(;u;dLt0}:rLH1E>MkI͍& jO)M ž^/[B4QBZd6ZfϏS,HJJ!:6ӥsH 16߹rOAHk}&M2YA2 ݞ!w{ZJG~:qŚhVMAA!*X_:K}~&yUcL;.Ev ԶO4vQZlɤ{R#+sZMAA7ZfKRLtvwҘfJ;%1%Ҵ bmNQJ|-!$ go[Ϯo8P("??'5 ׷=;0E?i7YE!5YGI,"χMj0%Ģ$*Ƴs)%EPDvvoֽ+6) 'mKV}!v5YHik"6A jEn .ɤI+ڳCE5h Bٳk;) 槓kk1%c| +؍Cн7t@T)]a^r(јDO&Bd5:<y]UcBӳI j[np*22de0f /=c66i7ek2/{E h:2X:"5=;yt\ Pq!\6GB﷎-qfէYBDxQl?WCI(xF=%xTkXFȗo6 @P("??? "aTڳC: 7zy@c\YBXVT (AUPNce4Kc}#q:G5h BEԹb9HGZ=4.ғ" ܍؄R(|B7NñX1+5@AKW.ݱf,}gHlM 3&Njb}QhQ{wI C$ goo-)[B0{(ᄯeNHvBgPZ'(Bn\Ӂ&tE cv\ͺYhIuMh'q7OC5ha~~ĉvn8qbAe*|&Mj֬YRRҀVXtnё[} '.摎7v~|!l}zJ$t"EU:b>.A5haEE铗קO!Cu߽[JJJVXq9s~('777`g///o=8mcu蟇e~@a(4RFErgkC;n6,\ż/SucV(>0` / /res=iӦol6_wu .|M@9鄐͞]$I2&Zt]t54 tY?̆a%҆'^?:\V$lQMQO{ ƪGkׯ_߽{wePHاָHGTmMj/R$`/{d^n5f'DZ's➲aiiijjkM4pΗ\p^x뭷K @)U~[+k2Q1v *Huu1MNm3qBЙZ/nqG0; Tow%К9+9sfXϗкUsssʟ?v8qpUW(v[}X:n&u6dO+ |k)p l+sy[q ̶ fv,8wO+^~:KnHiii999iiiґ޽{>}r/),,5j?!C](U_utJH]Rü 3 #Mk7#,} ~$fNmg٦6m.Gʕ<vm߾}#999]vEEE#Fx7_ #d{;K`}ISQ ʉ9?I mj"gє&[-Bjt͞OBD:o;}1+)[=z…# .;vl'={o\ Tɪ/r;Ʈ'MMla^~xQu38DУf7PTzD\C*r-Om۶Yf+;vxGao?#GT4%:?y?WDo|;fFt5OZ`Rw<PE!B=rNYe 3l[ MwWxby(Dw'O|7mD2d[oQ3[>ιs#+=J:b̏_cUêcexi@\Uv&v~BPOut1tDJ1+,Jx(PB􉄭soY*&o&:l 1ӅǺwꮿo>ڿqM1lo$tl֭7t!Xy)!%^e% pX]T ._׸ȫ瓦JH !7t n J{ !)כzHO1B6x@LCApu |g^-{{\:-æ^:(R@%j5K BN5{DMNm3cbgq3PT#u͹G_+W/@  ?VݱL:,؞Iz`pbZgG75+,WerBb@S陸 VYSucV^D".wm\Q-[uퟓjo}Q^͒c/~7]{Hz&B#+:KOn *Tgu~~йlkQ P\Stlg_Đ񢝻S"d QMhI ܟ8&pENl&=0T3ٳ-ǧN" !NZaI鈁XGךNK%\5w7ba:Twu䃡 ͟U6(*D>e .ґl7z!Zx+8 h:uhЭ'1مs wKE'MMj/x[>Y4L<}A >ʽ mmWV[;8Zv~½|-+Tu7ҍ7F:!" 4d':NIA>QU&:X^ RB'^T}!ﰅ/ Q",!"gǵU0>nM'B"!@mz^)脯P:b 3[ rL "xL-6]D|",OH_@lA:x{ղe$ !@ /wmVXN.+,C#m NKn qIS꒥#ee ׸#>RvԌOZ^#@*~CT5^n >OuMh'qrL P?7x^t00i1&jl5|@t%%%r:T&oJ5BNj A-Aqm32&_)hk# @$| @\\]/LFw1d @!!E{%b!A} \v7^q6'ueD"nl?=1:y v:g-U ^k!]R$5!F撪Jԩ _Jyt`x APFξV6}9I>n{my}l *tdlE+֒o>Mm&Mi |C+"tuo퓒t0Mes |g8P Bv\,?~_SfHwQYQ&=F pC|5N({B̨UX;ZXT!hKv 17E1G)? (EA G1jBP t>aBP+R`%/葀!ΉRgєTfi4U0E>a> ^lZ]D BЄ"ke/|~BCj=3Qqī]w' V頗6^X@ 8UQxcWBgsAUbv0݋k:Dq ;Jc=֡CΝ;?CĤ&l+V~뒽'|}ٮzSpϟ8qn'N,((s2Do(!KdArfXhߙZlaNJfօ;"dٲe#GݻMG^^̙3;p@ީi³>xRǿn`S3'/////O>C qa^BE-Fx) D"n\N^ B5v: hx0R{г/|V. zBh :zmݶe˖֭[ˏsϽ 5|& N|RSt-r}s!9myX4||={|'ґ￿_~<_ _Cq_2lAA`y>1j# peUUKpL@"X0_\3soSO=U$  l?uϫm?;v4IIIÆ [f_34:u׿Uy۶m-Zxw}ׯ_?ɔG .--MJ{]TEA VM8ڞRtZe R:64K]MnGmڴb1b'1xXz)SGLrG<|g:c=Q{;ҿcFi;Wqݠạ:uvڎnffK/t]w;wڵkꫯ|ܒN0!33'lժܶmۜ9s6l)5ü36m:mڴ-[޽5k֤I.M^~5k<7L9|M7sԨQ쳁pʕڵkz7~Z VςpÆ {ឪs-C^k2|˵.u^:_ҙ3gi3gi@CD￳4%?~1 J۳,ѶG!XuTU'N̬u0j,322nڶm[ȁ7gzagCDt}Z9vc~D\mAX˿+W~WaAAXCT,\5l~jLMlck-)jc2AP#I7f+c:qM6yy!/]m>쳒Ƙ\)H8矗tСK.ӦM[rt0O}kj)))ݧΞ=ߖWN:I%^ZW3g4o\~}u.t޼W>?dzZjU+,))ϏyURRRjϟOMM'Lm#B;rUkM}FZ[nV+KSw?5hBf)t! mXeMI|? Zzu6/v٦M@xq䲲dȉ'YYY˗/:tΝ;_yUVZ T}ޗ"Wсa0fϞ}7^Z>nlr` zJKK;{ٳ-Zإ혷u΄=Us M?<M Ww5k&a~z^?CFuo߾nM:ӵk0׹5kHԴvVW1f;jPBq[US] YwY5ф示:-%RY-?B*=RU_އ8gwzꩡCN0A^xcJ͛'=ԩG!;wnƞ={sĉ/S߷M֬YaÆ}g}oРA+W|seID֧OիWKs !Vӧ!.Xfݞ ^[{O7ݚطn-_"Z ҀьG^p \pرc%Kxi*hB9=J釟VU [>tIKܻKԩS>7oÌ=zœ&MZ4K/4s ?rmڴiԨ/i=_-ZTRRRRRhѢZLMx2޶4 ]̳ĵ?Ov9s9s̙3syw׿'È^j>}mf͚UZZZZZ+رGN:2dҥ^ĉf.ye(!fNmǢ"x`:O:jO"ۿn Y^qLt,)Z0ș:ul-ZL0(''8^wΜ9nݺuɓ'??prrA}]ٙ3gXW^6m~>S0`7pƍ}ٷz+pu-^8++Yf3qZ'2nkP߾}]ti׮ڵk7nءCdEfm޼y׮]ݻwoڴO /hѢݻ:th֭UhxXƽR|{ʽ0,q Tu!S@7ip4KP!ydgN.ZRPjrzJV-?N cfeHP[|Nv"48VŪ7zvll5"h9|]k$GRVDhc'z?Cmoe,%PfzRÌ݆P&:׺PwMɝ}P(hAdT ꊰ EWY\*(  r-B[ LӤI#%i)&Mޯ?v3|`ggJ.ç*-u@A :GxcSgDJB bY7J;*4\20 XujPҧpj׆e-4JB riDn'BNө Ů9)Q7P  BgPz"oM?Y)Dߨɩ<z X?pW%P8 Phywil%8}573 ^oHc')G %*6 BgPjᏛ~o:r 4*߭+ h6s[ A.'aJGwa<0p)Ū섐IDry ;z+yBp&r+uoh] ƾ>Q 8'}oCG ),! .LHHP*J299GvI0CĢ7(n ۷o۷/EQӟՀZ>f[Wk$;F&gd,Ih{ȑ#ϟk0? /̚5^sUH= :ت1x !"@Y]1(&.Lւ?n-s} n ny~} EI=??Sοf{?n"JlDD^Ynݷ~|cN-X <<>իΝ:xwO'&L ?~ܸqތ3 | 6L8 dffΘ1ޔ:o92cƌueff o߾E}#Fh/޿=o$lrXs;j([}ٚ5krrr:~.tO~222^u'G^^`1tM4:IݵQgP'`u|CL$q!-^$\-k퍫;3w6$n;cG(z\hÇ BFSVVfdW{{-+\Ҿ믿^r#G4iӦueeeEG7_ϛ7/==瞳ݱcǿoۈEQk׮]dIyk,̧zʾe-fTmb^O\m+ڨ~+ʕ+6ols {fffݻ nfT;92 I߸x/u>ou5OFzp5\x4gw^ R}:%tKf7Ju~!ض455\2%%ERQէO˗;5ϗމ]v;… NZ{s!{5Hə5k N>m{nyI'O7k֬'N8ʑ-o0ydK+- Ѝ_y=!8| [n_jo ck!tel,Z5D+?奥: XowJ<@{- u[gs|d+= sbQbbݻ[_w-^`͚5IIIjITv6yaƒ?|MLLѣYfL':y^hn3_bDDD憇;MOxi8Riyk!T(:ql6U mRttyn9d'qTzjk:tΟ?1!TPJ t9t|9j럄bRƆ1.u&//!#%=ڐzo (_?F񤤤.uWddѣGW;{lJJJo<8!!l6=z>JKKs\j]9[UܾqիWڵ+%ƟՂ[WNZsV[ksWtttvvv߾}[\2~K.9oIb?F2>NvNB䅽^vt v;/a\KsYK1GژT U=v~aJLK!̬D!&nOG]ZxqFFٳmd2) ۍ7_'%%ӧOoٰaC9sDGG;Nv9?o,X 88833O?y;iҤ;vDimСvrCsΡCv'ykTz]ʱ/3ݗmz@ijc-\D)lrrr6N=0qߋu}2Rغ fPg xzj}׮]nYdɢE~GX\\ƾw„ [lz*˲׮][vmmO:sޮ9sg}6wm۶ٶ,_|ʕ6mmllܿ]_V֖.]/oݺz֭/:̛/> "(,b~ ۖսQ󜵤EI'ϥiӦرjmܸUL B\N㡗Wo8`:(Z@45c:ܞDz-uKfx_-k1!( ݻɓ'Oh4aaag.//mqwݺu$''={qD|g{1I&)>wʕ۷o ^j՟.7.Jkcƌٰaûnܸqȑoy?SW~+s"-4 MGym}Un㏾1}n.{7oޜRFgϞ,Qh2O}9Ap&hh ƿCv_nO\_[">"҈zPYn}m5/]ƌ̘ڐi5^2.n nݒ 7RwIbF~14j;&/M%J|dt BgPvA-;c-ʷ^joğKGdxЌeowr?P~/<x}:E12).Q–m:sr G%Kо=@A N` !DJIRiɘ"*BM W7J^HrUHn? q O|*0U!x9$_-!A Yb,1Qt BgP:W7[-YK̂ɑ$J*OQPZOawo# dD);a =sA\Vor…k~eee~;G7n\#;\":a<իW !g'S!bl-;f/^ H%/( x>ںuNkIii%K;BHff۷rwnx"\eZ s-EW qd8%@dgg)xssqmiwK%MKY~9_.[lҥwuWxxx}}|_%WVV'cƌqm]8얘y⪨zFZF:>wK$))iϞ=Y|_SS /ŭYse8{옘g}6""B[ou˱M'}ǃ,X~G}tsmcw~? &BΟ??nܸ{oƌ> &NhԂ 233g̘koyej]G1cƺu233AطoߢE#FU~^E=CFEgY&'''..3mQUY ,% o8?'$0F/' ]QlDPXtKc;Ggq˨PVrٲkY1{Iח( /UQXat_XmD0ol(fD[[VܑÎZ0*z9RY__/4KV;|bQAhڬ[jy_y啕+W~+WtT5*==}oIuq-.. gho}ر77NLHHػw}Tզ($&&ESN뼵NَfN0ҥKEBg~^Hqq;NEQs ,%筗m.y+q?f{i_p Ng!\m [vZvÀ%DIb%qH Bu% e$Q~ c:-fMTd?\<Bwޝzjk֬IJJRMMMJ^Wyaƒ?|MLLѣYf N':y^hn3_bDDD憇;Mi8Riyk, Ns5~~~yzmFBg~^0LVï}O(.Z^dCA7  Y. ) Dͩ ;t;",ż n7s\M[e_Q2Aq8Id4* z_؝Af&Nc&Ezd9GH.~>}p eߒ=dksI&ڵ͂/8zhTTŋ[JJJccc+\PPpUVܹӶԊ]9/!ET*}뭷&Lk׮v__UZotr^uRhhhUUaUUUXX9ϛ]yy`yyyp?8lߦ IM)di)3 amED~Q@ry_a+e!>2JK}(VihRK)AT\K b\]9WSVs5\u W+(Y$$A7^7NCcAw0m17?so%G|_lPvKbLƲPwAf3B]v{/Ș={cmB7_'%%ӧذaC9sDGG;V}Nv9?o,X 88833O?OX4iҎ;?Nv6t]v9!ܹsСC;B'u֗_~mFFۈ>5sO6e(IPBC;ϻ1k+mEɊl,!:Bt*J. `ÙpIpk,X*r.c+E0&0V/Fb)--MKKsuv+o0%B3z[R}O/cw|xP!WkCJMM]fرc-[6s~Y,;wڏ>}ŋ4yfd6%K,ZhÆ Æ 裏gM08qbXXXMMͺulk{:ՙv̙3s!˗/T*3gT(GYvcn(-]t̙W_ݻu2oΝ[n<@l&W^OB>cG~_UjBO "{6~X:GBSj}K/\30&HNu0$1 lruj }|i?ZwVվO+ tC c}͵^hgf#!L/@ϏDVXb WGK b`:ЇNfD]n nݒ$PItB ؟ #࿖К@rZZ^Wnv6I)R;(>C ,--]dw}G|w~CHT" fh & 0~[2<_)gk,bd:>f ܐtKV(> sO3sD d:!śdܤ[Boaj8m5W_pq ⿂_`0 |4/QP>>ǗR RB#!2Cn ,Xy:ޠy5[p۔eРAgϞuEEB'X rx"/)p+cw{WGB V !̈́ D88X,2J'S"u(*/ٗܙI,fbPx/,joQ0Iuedrۈ"TP(Je#!4?al۩;ht~kI "$mw2Q*1gZ}||+_gz$FRI \NozuʐT# "_oBA H}Gp Ͽe4 .44ԾOgS){?@mR"B(hgh|ڇR/ƣD `4F`0yn4F=.VZ]+fnjٍ >}qQ?H1212>S !D&k!Ph.!P (B3D.ްnEQj Qkon"==}…O>$!>ظqӧju[FOfh48vXtttttߏj!$7!K R( B/KyBAXZZ:g_____9s\r7:ySO=OQT>\tKpkמ:uj͎-UZ_Rډ-{]͛e޼y;vpU<Kێ$$$8On nB*2 c{n .tԩ?oܐݲ[ tYWz){8\Nf>䓶-*&i޼y7nh4-v[ I~]nodRԾjfFެ>z)\]]ݘ1c>۶[ 9]gffݻ6Hn OFDD+-U~>#Fٶmۚ5ke!*++p-[n_j#cǎ&;v?~BZx+^|8Q/U^ .TVV6mڴW_}uҤI-BBBz-[׿Ex>\-M̞=;;;Zn >}qKnnnjjh \|k׮2eJ]&^UUe{n .Q\\io&g$-{}A8s͛7;nټyY\@kUUUwuɓ'ދn n"'''%%\Bhž[ǎk{-rlowihh]jU]]]]]oo0\xK% 駟\bԩ۷oX,W^ݰaCdd_mۋn nW9%ɓ⋊ rUV8q¶WnG5́;}jW^}&eK%~ׇzY}}m/%ċ/yTJ5bĈ={deeM>ݶ%K/uցTdgg:ԶWn;]GkPx)^ !BAPx)^ !BAPx)^ !BAPx)^ !BAPx)^ !BAPx)^ !BAPx) #G,\066V&EDDddddee9@"nI "67rgdd Ǐ fzךG|Fn/ϊjχ=tBT0LwnU7:s}'I~' wj4+Vw͚5/ǎ1bĝwyԩ: tʭ[FDDkL6æp)x3Qk}Ο?ͽy#XFDHOq!"B2Ed ).SDH/ݾëۋ^*^䤤?;vlw\N6mǎUUUVlƍ=ؚ5kl{Lm۶k׮Y֒իWГDׯ?tN 3fҥKGe{>|XӅN<^JNN8J܂,$S\ȧO!"B2Ņ|)"$S\ݗsB).S\ȧL!B>Ed )^ '^g B>Ed)"$S\ȧޢwbnt:WQOq!"B2Ed p(NiiC(ȧO!"B2Ņ|(;;!xSDHfo;n-p( !BAup?Oq!"B2Ed V)"$s04WG9O!꾂wZ(kaQ B< ).SDHLq!ׯC(ȧO!"B2Ņ|+ [yC^ s@d( BŅ| )"$S\ȧBO!E9t:???WG9O!ƒ{Gâ2 2^37ą| )"$S\'bQֲǍ(<)"$S\C;PzN< ).SDHLq!)--uu)"$SDHOaq!"B2{17ska! !BAup?Oq!"B2Ed V)"$s04WG9O!ƒ{Gâ2 2^'//!xS\ȧL!B> Bӯ_?WQOq!"B2Ed V)"$ |V%;'Nزe}#<2rEu%Vz,^|9>>Ձ^ʨT*ez׮]s;o޼;vtw s )"$SDHOaq!"%<[Vh#Ս#o:/BFF믿N sڵ!CTTTt%FZt)"SD$:"""999//n4]cv_A$F)\bVӧ㑁uuuC".SD$q`8y{[FAr֭V6X񶓼<d]u:6Z@ h-Z@ h [p\~REd t1`c{2`id2]z511vC)xQÇWUU^0ӎ{sssSSS;pB>Ņ|).SD# pOOLuuuEE˲َ0'''%%z̙7ovܻyYfuw  յO~2AZm2fv8v "ӦM۱cGUUj-++۸qc=f?999WjZvժUGYp1@ogZ$y;V񲲲.71D._|͛7T#Fٳ'++k鶽ǎ>~j1sxrOq!"B2Ed hqh ]nVj666w rA8iҤZ^^m۶QF9W_544444|W?D| )"$S\ȧ0M\ȧn?W_cwމUFʵkΝ;^xz糳9(j̘12^(r>Bh{<}jj"Byyy(8/IW'$ֶR^^w# :9^\ȧO!"B2Ņ|+ 'ӱ JIIIHH o4B 6fF;B>Ņ|).SDXG\ȧn?a```xxx߾}פBͩ|aUUUׂW]< )Obx>JQG#}Biy\<\.|#r^یBAnFxNn2BHeKi߫j^o;d2RAjx[FN^^C(ȧO!"B2Ņ|x-xќÇ9X_~1'A;g?TwΦΟ]DžICCC%1:\S :su)"$SDHOaq!"j3Fh4fVkcccL&,+mqimn 4Nd2\T*v)O:| )"$S\ȧBO[}}}:~Gc;O35Iwm86)qt~)!DB [jʓ`!6 B\n{P]tcذQw.uDdDz:n/BQZt56YĂkGQ@OhvVy>(((I%6ި/ 1BF^P#bAQŅ| )"$S\ȧBOj=@?'l'q" 1BL&md&M#*c^,hjj3XQFV WK+zmAHu2EQ#N0'SD^O8J&6ya.vAW+bKR'$$@L>yJg֙yqH;w]MS?7t< B )"$SDHOZZ=UPd:тjU5QldZ6Vz}9Gg,B|6^8ӍSRɃ ~8~^WvP]KYRRr5[^/ubiL؋4:m5jǃD(c.يJak'))+BTS_Oi. Ք2 IH$ԗm>J̝o7.v).'CGHuuٳgRT*OLLtuD=ҥK[X5jOm/FCBv|b&9vӝRz̜rᜥQ8;l IDATh9Ϡ*6?J>DB(BH`jdMWIAŖe7OӄLyrs=Y6im`wgI)>} }|||}}57n:tWB>Ņ|).\KE=sDaXZch6|ڞBw+" زi*og" %!D[P73-mePkxq. wd7?cf5\˅O nJ~*.%ݘȗrm-g|ʕ e.\d6jqIҞU~yP#G655τ'~6R}O>QBNөuЪIhIx$$ dhB8q+2C ؄P9mW]*4u~z86O`%O.MS&o}SZ R5zhBq)5Wa!x8Nf5H1SL&{yVcFe%n, l5 jBOuԒx'C,ODЭv+*604yv6KHT:`jA(jۼI{-F'|އ#h 8{lHHHPP-;BAbi{!l6=jy CpeY[ӧO+>H zƖ~Z:]aJF}tG(Nvv,3Oq!"B2Ed Nsuy'.ϧBFqDt-i0$VKpUO57xƷ|yEjˍP)ҀЈzXa5r7y.ۯL1oMtLoVpu+y08% NMMh4T6xJ6(wnBJR'J~TӅd|2O+/ò|ߢ{Ϟg˥!_g+[0TD$Wȥfh\C#_]v™<:c|?,*--qK{=j-**b gk+NdwԩaÆT#ڮd*>B) EI '!~p5/Rm9vc Ǖ6xJ'G[H$5~DiM(N~\GA>Ņ|).SDXQAAAUU͐ }v,T*hJV^ٳg+++xdu¥K&〓ٹ&秧fNϧiZ"TTo]6BbM:cI'" *ġ/67NʩQ $Ŀ]W*MV)/P/A[WWhU<+ VaFe+8Ã}$BnC4TEübWk%ը  M84􂙺~'!/Qd_kRj iM@iLL&!Ņ|).SDV&ۓlGKK.fdYVi&OV[YYI;]yپQQ!tl"m mh?{|ʰ6tL&B@g8{gwDaIԻlInIlr$9ɍ?('$&}ؖ}bƊX\$Yj{'ADeXNy ;ξ`;yZhؕhp J*;6Ħ"z9L`2=iPq&.*4wwB Lͭ[QI555dREAGYš'X8_2LĘt5#/.^P0[eh7$¢(M^K5AK dֲ:vr~y[ҟ"`0 `D'2jAj&ijjJQ5dR.:!&ʠ/'aٜ'DQj(d{\!v-AO/trSA ]|ep4wwLAjQ'&&APPXuVk' 6b%P>'m__ф]?ׁwl]gx?z)5iڰ[盷KX B `0̚GE%  5d(J(Db @ HI躬 &,Y=ۀ Fcz*IO~N"w-VfNj4gB"1h21IlBy_ [Ji;3) өs\6[DhF1HT<I <ǸӉ {O# %GSr 2 RYvb" FBO1".$E8=*LxDESBu+9pSY$Xv3`{fl Y=3Уv|BC8hY5@-ue) z|a0-Ȧ__$8 %d]}Qy2%qe v'/i{'C7w ZBsnn@)ef;μ󇆆X,&iEʲrd2)ja6՞\/%O2_C)i;%zhCN~\[oH avJoS,,o;opf,؞3`cfl +(A%%IMMT ؼ@:/"~&/m:E{B!߯CʙDaq.1$#9~񒼫aIt$!AYIzA*'1=.A]zįweޘel!|ӂPAɡ(n;&mm=>؋Sыպ*R"zhZKr?5i^%NѣG_xC%g}WO[w`0 9pYBT 珦 \#k$y%GS$ĺ.rl&a2>ھF ٰ;嬼=oN;1"HACBm1KbVY=3 g ؘ{=C="Lt,ss ;ׯEBP@vϝD|? Dݏhb@ã?y#>HIslodM~'KxŵKS  Ճrě;!I!\5_)4ۻ##,w%؍.渱o}K탮]`>f3`{fl Y=3Wz Y¼сlʖcO~?iQ *g"p"Bgz}^{0Ovo:`2+$~W~[(|E1M{c]õǏKm-0#Z](1oҌ0Me@O+EÚ+.z]f]&gͲEe}Yyyy^7;;waÆ%]`0zk,iUvyVӾewhbYz⛿Y|S7B ׇ=CP@!df@lMH\HQX>+V{y5!+3WyAy~nݻv?;_°ꦙc)bYDn!?%u.{u3ɔ&G KFY? |{zGկ~ϝ;ܼwK.-0 `0d2)TOģ5ghIe53&{Ȋj${u#vϘK|0"E?=-5H$5d~Dɲ9!mkzuϊ¹ <Zil&%Kq)"̅aI;#p'}޼.e޵ g'я~gogV[XX?>ϫ=mmma!v0lkkpК `pװp̙_ú92sMUryZ |aAqU_C=ͲUAn^岓PI#\v7N*j9ދ I c&z`~;O§L["ކ]ӹE,[OW٢E T/OT 镗,z,#˲bIɔssg8q2.e}-p7)Q4' X2rzo\x㩨D{ԠB.֬l̂A136ff qx<P4UߩUntJ;~ RYf{J;_N˓Ýh~uﵕL&O8@iOsoIFj;syʢ"SvQ2v.\BniiiYYҽHdCOpgU5hſMO6.OΝt(B|;߹܂b%3`{fl Y=3ZW/BBtܝ?'URvjQT-Ia| օ=H1R~{ܨb=-A`Y`0n=GDU$:[7!΋,pYQ2z,;sxixy Td1Yhܶlɰ o8p`1_}]vev  `0 H*;.*< @;$ՅOr./\:l]:Mv]QvÈf,`,5>_KG(_}[ WIGu=|30_q)SEdhY9pu7yXiAt-ޮYsB*[ UKމ~>=x뉉 )k`0!$\nu`0+H</Gf wVVu:0<*vfw2\[$?ˊiU`!3>?szWKIO5 Gy,MOt8HHϋ>Rr#f}[yn4,I/~&Ǖ Rwx"݉~*oϝ%k –|32 |^__u-[dv Qgbnl̂AV1^cǎ;vUbzsMDMNNԻ/:qߞ<ϻ U=<~{m2V\5"U%-g׮={{~ߓa`]oݚ͇.-o( 24{m{ *AqŋB }Q`rxw&߿«iQj=ٗCh0ueV\,˲nQŅPhA8s\ϟ(JhYeb- Q^o" I$p8<22"$y]w-i4 f.~u۶mr~:W1/⟖w΃r(///))I&###*~k,O']mhl\:<^8~+S#oLYehhsU\F~KAjZwg> l+lɒwIܻw&gh4 E4MQԊʌA*u=!fmڴiS- `0W)OIqM4`n)I۷nJWó DZ;TijE le+**feىN!@ӓu+SQߘ E hyݧ{,3/G$U I-{E $ 7k<++ {}OL-kgZ&nT ,}j{֓?^\EqY0' ryX I&QGcزs[h47>f \HW$*6'(wsE,ƛ[H.BDnޏf 蓇ʡN*){Mr4?y8A ^-QZmYYyꉳ`去'xvFdmrٖ:^tuG5*Dα;߲]][Y=3 gY TK,˶[a5s=R J5#m/YDfyq6Pt:ueY0 CDQyĨ<"t -WS h4NtPXH]8}.f!*}5(4i?b߀CƖt:Ժ:++Kz7nWf=Uf '*.^hvm=LW 0/{Q603`{f`̅3!j0zb)fZI]o)RvF689EQEqVɹ,dELVc8 Iҙ-eD"1888<ۖ&aa39fGgSzq0V3 r Kz0| .!wdRi$?6OoHL (ɣD¦tZF!J2c-qȳ1yv|"M)b>~T9-#?}3G#.D=r| 0cbbBu\ʊm=:eمRqFrnᲀ1 1[_$$i<<@zAfxǂp"?EESODp}fZ )ڮ(j`xCrpkuh=c䄗O$1A ѐ'9IhOD*ꨛ(AtO~ݎvvRIl&jOaF܎@>ON,**bYVh4c,˵dzgmnY=3 gYczޑb;'!23sV?z W?mmmן.ޱFaCjP Ï,΋wF*@T gnziɗO=?~wrt|~5hH)Z{m큿iWF%" WzeP`6R$YYYY\\kZGqNsyV2/mmlq=3 gY~c& 9u`0Ȃ0Hp gXlM+3,=B}}}il6+ֺ m+/օSOxyRVˡ>)t)ͣD#g>^ͯww-;I!L&d3ϕ|B}K$@PĎâ#čCm|@9c?EMI 7qDƨvt s@"ݣZ"KA,,f͔^Cz=Cc1:f֊6W-%T >VD$$F6:/&9997dόp8! Cmmdub4)Rδ\Y `A`0LBLoh=$8eQSv ŬQj=~%oX.bSc@J{|t#[CP˔1:BV6Nܥc\K0'-z˩U[I#ZF9tGtgт@Ֆhj 5U"Q_Ԫ[qOnqz-)$9X/ްBkf 2CQT~~hVmjj) rALn)]`Axr7,8؞3,1%IR~r&F+;.U$qCx!WffYN{Zh4By'`2 j}OR؉eD={-5Zɬ aG߉eA~畸cXhZBy B0I^_'yv5E5r=-""uN14,L;\Y1Y(V+ J ) BanۚעJyd0|>lp8V< |OY=3 gYfcA9Vu\$jPDN&=muV^^^XXx>z 䂙\ ڷW^WIB(ε1K'Ajo>2ǹnHFFRVTJ~?A4LM;pIOHgݸs0ܗ[?79%r3 Gܲ4TUo(ʹfZTuZ oG*9&r1 w ۗ )i$ItZjPTTDj/Հd BFl6Z `0L&z$BW R[vj޸U r"C-Nm!btt4''G@"x!ݭv055b1EH8]x/~*,4&*32~ xBII1NpR "cR IJ)mh|cKέz5"Ey]6#cnV\qEC=p@ٝj,~!JS9(:MrV ~yfYY*+5÷J<`p5W$[s`{fl ƌXpLWwm!o͛G\BTWffYN{{r VUU&{^WK$hTcZލJlr4Yp' É>wb+\+ZPEO֟| v"M0D]vSXH9x@PZ^8A@7+ vPyyy~? J422`X$d2r22Xv444*؞eSxsgl̲쩤РYjΘp+Nęh8u$G7XTȚRGyX$Yٕ,=1E]5(Sݺ3x#kX"pYpU((v1ZNE108RsTi_=`iA?> q3mu&Ɣw;&f*J&Bu7Vrh4*_j_fܯ Wn隸:DuB&o({S`" A3DĠ[˕lazRkvMCi'f`Axہi2 gfYgT5-[3 !&'' O.T%64y/M6mUagl8^xήg){H؀2HWv9! @ V\8Z{(ã6AK5u=\UiZAVJ=LԦNkTUL,4.NddYvW]p9ªhZ`0H4<99 cxJJŜG3# `nYw3.)"NOɦmw)ӌiJ8 p#ۅDy O|=!z=ؖ7nM˕[Ko7T: ;}uz"|&Axj+nn] B PPSZE䞡S7x#1}]ޒֱ\k!, x\*0==qܼo^ǣ.+L\х-P(` +lv΢N0d]gk+ Fu L&>ԽES zh4*0? U_N9_PFzeꖎ1H5[hIȜnc<}SB }]oT2gBٗ4wNց&IAeQ)/6[Fp2>a }3w_c07hkkl2gfYOTjAUV^by>XVFL&/]aÆY-rrr&&&,ǫo qʭyȇf.~qT6yy>쬩[ݴӕ {VWW|pFmVny=rC8hzy@`5_=LOOw] {|YD[QAj!}&^~1$t_pCPZ5z2=7aOzoX6UCGG pzQ=g z֢ \GgΜ$x<^8ԓJΌm[T䧳ۓy+q@XYk`hBӚ8{O(RÜ8EB螆f$uK)e{jZ $j {N)IcCMr)Zejk yFUT-X^r\k2zہ=el̲J:AǯEi$}hhHFkZ r(䎏03AjnGQQ:vU!Yܨ=EQL$.FaTJ9$KV+Z^Za9oAbE"kC9h۷5Z_/BRZ 2~MٮDA6Rǘ:Dz#, p8 re/5ĩCiO=5Zi[ֺjp!Y"+uȨh,((PvoQ(|>й3ҕK©#CaK`YO7 $r(2K$o7U Bn+d}"ȼ7|cWg ){䎫Mⷧy#H^ jx:.*öoٕ 0 )Sg-<ߗ/{pK[On>sn"1zcSyH%2%%%-;3S =h.SuMj:c0CF1zL&p:4οBGjļ/pެ of gI$E5+7\;- f.IdbK%)WqemnJuEXF*`Vc $JY|N&maGi&IR*tM֔Np`p7\)dAr gH)B"ɮ1t:0?_$w?E=x@8vUR,-ph&3$Y\NeBiuB]3Ly6[H=Cd0u~C ,؞a||p8ˑEj֍=9MrpJD"hnj )ý=8yWj$+-+-Ϊa`ppF=ii`kG?#4Y9ҹLvE,Sy'a"+sIAN|zߍ: bTb{amzrW(UZF"7tAҭG $Ke4ng @Db2b#H"xxU;E=GRkZ &g` uр6 % .?H  jY8xD[FqҙHǸɞ nɃDu:s\޶y'v7a%e\K,V< g<Gkr-,'a&6n0m9Rw)0kzb‚*AKI@[4A=czb[ÉП\ ei2ML^.,+iwSG]`Nzx0|Fe=Y) 4saԺHiQvƞCF i__8ţ¬q됪~u/ju 9*u) @JH۸0i-%;_b3i&z&pnmLUwith(q&v8~aBVڒ}5>!VVUx#n[8vfqW_!xn%[xӓk& tV)]8Q\&shAm, л䄲;mW#&_~UuL9kdHRi͕OB9a)=EQˣN.(- 6W.Jm3 QZ B 3%W[ lS@)w3Ah/#ŰlovT~q2yFK#ȎOVv\ BY-DhKy!T!pmO}5).~-|ʖyt]XŔ0%`T}rWC:#N.p#4jOt;ʡ3a+'ʫIh8읂`Y8;{b)//7L?lݺU>K K&7DyKOG"MOL! !o:A`-. 7B(]υ?Qm_$[֩)UI/sj/*/GQ;w3-8 \Gg4ҺkIjpaAx^xСCdg}FFF>{1:@}' _pjjJDK&7Cod֤;km j7bA*$fQɧ{ie︟r?\d?rMOȰ d[-%%6}NđRא2} Go^Lx'Dff͆bލP*o\f९t:i6*E|>٬!B*?y~ =Th@"h}rx[6*9R7X)7l5\C!5NinY ~QAvw/*TP9ܹ=V l9O HX<{ZcK]R)Ԋb0aAw7onoo<==3G#ȁ/.]RǏa`0 ñ.؞ (#IRQjAJSP(FN i@r(rيYM2 .TRa= Mwff=AJ}@|v}LZkYm(ବa4ӫfe!ϰC9̈́Ū)UYDQ\k, B|_裏vڥ뛛_~o|џ';w|l6f{o.C̲122KXW`{.:^T)=#$I<Ϗd$k)$/[9Hb/ksMEBR;]?ٰ>дMfnӪZ<;R SGXN? 4Z?$J̤NA;(ޑRN<SzI<^49i{&AePj' <ZCrB '0lٵ19{,!^-v/S0QG3)e Y٘,|H>Z|>⠢:N&{(E|%飣&xB'3V0[$M 'qJR"˲$}MEQpWdO?"}HJ=(GF?ڦ{@;+fInt'ԕ"iZ.744vJJg5C R44$5m)g*2,M<`V5KZkONy-)kPIJm-k?Wr&68pEe}t*H{{{SSzBcccGGǒ* ;ITWV "EQ%IsO?~mR?cW WHyW?ЙJ}=t5@&m``E@h0DQħG-ԫjxPb_K;T6hL]|")J W* I\9ho=j)0]9:t4uCpۄH$D[[[249i_HE@ѽ^SZ 6UOoH%߄$ aY3x4Od٥0Ho& -!f=s?Oߟck1zB'e=Ʒ]"rDad)ҭ UTTt+D qS;5U:TEذxCj߽B]~39E}TOJ f]%^DyLQg\\#QO.y=_*(d368 { { QNw'c}9GhN~wߝ<{z {~VM`5 ]%iA(u^` 㔚1EUXL~T)z:07ZhJ72N9p8a9QFLrfGݴ\N3ta#;]>gS__#!bnarXhO njM_N4n..զ6%8bnr-u-wמtn~KM_R(L@cҿ r#E Jso-r"* 74r B̪e<O<hϞ=9!1?::M}W>mmmΠOzp_ê=|'GbMYmQDQ3BiF _.8v:Q[Yk+P<)p֛[s7Ϻy|c^5vǏpq >US+xE vP_ODгqR % Z8aKZ,wm:v׊)~Lt_8%=# Aw aꪖWaz:Fd0D~+⪡iTm˺['y饗qX.jѮ3<.A1T{#cr6Z,u׳w/|o' j1%.xNgbB6[ gP^ukPB~/tiéi&mYGh||yC\;klLA_ 35O}a^2"IRyW(V쐑39sfװ+|` Iޙr=C<mmmUwؼyuVI,:1̒rQ'7^cm)Uܖٲ15CjR, rAz22S ?"ޫ6 Tҫ (B5xYdjGt*ԙti:}s߶N-!5d񝱍 cz]n|`yЧV1.t:Z*)óI?!|bn.w52_+N;tg\I1_B@%+$eG{‡9z\b"9pI +p-ʃ~sT؏|˧iA v:4ߓnYjaO!dbٳgkkk[v  m0ԄRำ[8ryƋjp0ǂnڵG?D5~/*_|;sn ""r#D:!A̙C_ʍgwLXl犉!s+y-/ H>N$uMQ+۩Q=qI!jv+[zp~1_kԢr\~jtkl_x^hpOkOOQ?CD>o0Hn>~.wBz"@U[o5>y9"  /.oD|l6m$2JJK_g(e! pݬF衎x =+ߵGeѫ4#"MjHADܤ YQ@D(]Q/){9%AEYA?znE۞̂-0MYw+^>shaa&-%n)J ˕XϟG$3t#ٔF$"`̱ ܵkݻ'/O?׾<D辟[D{NE8ic+R7Ay~' qy]rU cO#Ux<,~ (3,"1x0>ym÷7+ ctjf:\!#h2`PD7Psc+h\ItJ\\z>q ðG~#I$a ՏR_¢XWJL+$n{"pbHrq߼}jS"Ս JUh :? '#ؼOe~PskRczJX,iPh:dfoKwE؋϶J_\ԛ=}޿e~7KVJrJR(jZTN긖7'}k){.?_I ~-Y휻S`$uo?ja?f\#{x6طVΎUjRCOy_Gw$ #Igu _[^~85hOߦN=)//ϟT~~~uuuꚝD"Ŵ bc{队o훊aVdN9X;cV&oJAJb7j|v& ,˺naΞ=[__P!cQ<3 1(**©>|u#20&slNTI y-+OKv0žF:F2낔U[VӔl1Scr&Km-՞qJ!ȶzΔ /?8hl 3MiPˋ^P=R~:o;efsr|`y(0.lˎc,ˤ~6x F^J(]˦,J#6# QYC] ~n] a8"g TRi 3 #j` IDATIg$6VoIM5 Dd;:kNfw)5\JdZ6kv&zw©q"gU*ك47T~3$׹שPmxq1}{!aRAðܜ }FlLX2""""@E4czMa|iAtn_nފV,x5h s5=mX5ɋ22G!:A`}*0{#r+8љ~Vd'"'d -jPH HsO[m玡c&D<=ӄ7䫇}c`~$Krz@Q^1y KC-MJȵÇfu&ǘL^z@dS2 Hj)LĐWwE&R@ ?C|eQsݺ~9j.]JJ j1 AE5T{xإU},B"/7 >~aogtM8 B4M^}x]XxxP)Kt())F|Kmfbϵ" B9s JtQPlԍ4#J L}-,GHe+-v8J( :ñsA6 mʤ qK!!kmyuʹ`՛.o(nmJƃݴy7i Enh}9hfAM4H3Hz:x35Ui$ TwQ'+epw헭XƵD"D,j`wCDG H=;|ݝL,Vay jS b v$#T'0^/0 Ӫ* SScv>}0ʤhC'gSW%o+-HQG=PL?/ sKQa/1jN)S`ֺ_g==Onxk1NH{D5&`@~w1Kc5Bj-+T@Dj4WcQb 1%eVB`S!1 jt8B_2mDp gzul@`su ~sM,F$(8w~됪H$T &[8m}%φ1fJ8B)QszOK'Nj&xχL9RX4yVm䏯И)QTYP[W6(Jit F٨-d2E V_JVuG/z>-< :zGphr=Z#;1KD*9Tvz<'A+V,vy9E(EDDP($ 'yӒ$RA[8bʜ`ǣRO a;ؐ3^8拮+#IE !7S(uThVQm7ޏ~]P6GjkȢjIr?%ݮxY(D9SZY(>W/8Κ<9Wn7P Qy$-hQ/ {@ߊIKkO݊s8 ȃksԫ}'-id*B$yk8>."SK?U732aB~=&or zgg#BL~OUTr\pۭy^o>x(!.1yo=I#Iu 9^csfr-%t9WsDc.DA(""rS%TIʭ"HtNpshЗ'=fEQ2.\৆\~?uוG}n?Uԟð}ɡquڧꤿ H,kdD K?~VVk5t:] -Eh|t:##2,~ԐH+mIWark(x]'{8qSϰK.Ma40yA=UF!߰+#vjJLrJF$Iu't~fОMJ,2}\Y 0N5Iϕ$Y:ͫKewmPEۊ, {ٱ3aў%sL}B)€ZTiJx) s;HNg/\.WFy=M jG\TS['][ŗCSd|Uߺ˽ Tߛ٧uzzzVU8kAU'E-.^/aAp1DY\$IzZvyrwW Z C\GW48#1+lx8d6ϞBC?Oj0D/v'A U6o[͡"r˛n IAVk4ƅ f7" )FBMp@jsv٦ՠRE.;s&| R<y$B^(M֐J8jg'{<ӢF9ζTp0s*a c'ڪImc~@;&%{K }G5#Jrx4jJJ5kLď$9&%Ij /qOHs\]>_"o Yf kY=L\@{g_Wn灿9iT"P'e鱖sX`Z*#˒}cd'we&~~78J-p!8]v6yqEʂe|Z}X2t hZTʇRK$kqc(ܺZH!^]o#h2I({>$"<pԧa6vݮFwfCQmL&4q\.ddYYY!4iA8 @I;!p撬kZ))@x(r*3mNY= rQ0 ^ym-X0%E, {*zQ8FH~H?y7p 5jF#RoN|wTZWWwH"z5WEaM|UϻGCXݎOCܗ>ceg?ͣTXM- pxa$^NEzF[VT:_"EWN" ]DdY /;=alb}ZHR/x't{_1NK3S57=ێ{Ii85v=؝-ud*T_n`nzTk;+W  EVVTψT a嘔Y_]5͌z~\#$I-I~؂X5nߊQy/?Nu~emD׊4;#AO4 Fh.l _rcVDc.DᲣzaI!ړeYa cWiPXgρ8GOry\J1ioEޫHy2T6VeHX0I 娚1F欶I3زJ˧9wT(BdXL->I8N dh2xv@1 cXff}q*J\ċ $IQTHi  ûG!&Am{hyrbCCC0V 4AZ,;=Jf>5DO/;O8{6I>S9QLD0 z~9) e<6VYMHBAzf䢡j"ϚǮ'(f]Wf4-Z}KT 5[A ɓ7 _~bU Kz݃qnʺ2c)\y2rJF0b0sII0oa?K̭y򬩺wNA3\P|7u;B&Ph%uERG_=*Q uZ*=j#b:]ޔ ߔ Y<3{wf&AڳKi I|+VeYn%ґvd$9 EQ^p8t:<TA(PNΪh W̦я9Cۇ Vo";0GwhNJBY AnZC aSvi(9fZTuB 2,SmI!SW7>ih4 Y IEEE P%)8?k;; ZB'ewe-6٧C!C DcChz$F TDfP'ܪC]7Yy$SZDDdi" efnH{WijP ߰VRVuTpBx$11۬Ģ`r\&ə5rA!G̩p Ñ=^ũjq.p(Bplx`ПK_;0YBtV7xhsñKIU7|'p(ۑ& JTm w$DU_EI'a "JTҍV#V:5s< IMȐ^=h.Sa9 UHP (=c(,~zԅ `&n`5nb:y93v5<#+]R+5 ,=oɔZ }6}+/i\f qX,/'Z]+~,+ =@jG̤Հǁ/LB桯 L+UK 3%:*? 7:AW6Gk_/ǜA4bA"""D,HNϔI8:im*498hδGZ43TΪ]$:GuQY$,G(qeYe07@Sgþ24SuF,H$qh4NfMͩO1]?P*JT#:w\Pc(:WXuPZ%¿O|>ɓ3Y r! 9D4bA"""@4@SVI9茿>,l6aä~BQ\\i`^)E'6֛F1` EQv]x )n1}0L-|!LC 5kQèHPOTFBgzjF**tq1,4=NNwk4~3ek`+>LTP-kf҈ĩXH$:v{ /6Fz4iF9Mv]dq[X@0Ute+!r# PBdo@!E:ܤóDmT)wf Z#r2N"""KQ.;rsiyb9φsTSsdA-dkRvؗhēek*yraXaaaffjM !rh4|>~'*JT APHFq2q0L/z-\ř1sDA4A4l߉\O*ǭ ^`)k4s, %suuYǐ6הϸҰbq6YVn(n9 фaقOOV e`b`U"l^Ehb@rTF$dh03qk:UZ$ ʲ 5\,p!{[=K\XC+dթl =H-n[p !S&L2>aB8P^i6>^pO aPZix@:Ћ3T1{?yy*˥&biuϝV;s%ULC5nNO5lX 3(+4i466]G{TW}D,C, {8(dRWDg: |_Ff:2D0shł(EDDf mpM ETصFE 4Tl6_}BX8.Gȵ#B VZ5<<ӣR~cPZS'4ƴ6 m0_0 >m鐵ԇ[yZgH:$ 4AO̞=_,#NnEI@nSnSH^dY`XA,cEBaҧ@z2`XIE/`BT5wBj7)A`Y q"""`illCXR,{Nsf0G Hqڲ hq;]WTH]zUSV<=233 gbYFXZZJd~~~~~~eeeG$9`{+\2 j{?SYƜ&{JUOZhEa}{_4\v5djv FJ.׭\iϫ7ztJ^ 0I/6?u%X3[N 癦 lnnhD[?6zcؚE`&*1 \vs˒gkkUiujK,Jpq?y|(5iТǿu$kZashOZP(d$4Y'/f %=*VO"u=p3)Lj6@$N~ o֜{Qs:x̯Z?Geф/%lXQ$3۬Q+61 +++q<A%kl,d?pYw+$;/=* f{oU $ſftNXnDc.DA("LIx\.ݩ:x#۬yqt[QwV{56ޭ+2'%KK&[V\2ճGZQ$r"X`+9Yn 9 ^Ϲ,caFoi5]љ.xFXEgҊ9&SRVVf0Dž|zsjdFR/Ua77=өgC_q 8`OjŘLn({-FţјQ,S`٦:54p {ȯzEܲszIL֫JHZ<"$Ɋ锸5ayy9T}5D߫F}˪!vIb cwߩZ˄Sm.GhAck.)ۡ]e UUUjZVge%lu:8%E$P?QZ/'m5[i=2ae7<حm69b9(K&saړ~V<w:`۹&gA썭t#T|,K>i(Yt2Ԟ7&ژEO_A233׮][PP TYA=]XpKdQll`s{ 1'eC+DᲾ| #|G=1 bj5a`6SQ@SO]X˒iiq-ĸom57Ij6aSTv"""c)en,R{\.8nddoFZ=ojꤟM!;\d/c EܷJWc]hEzy =._h6f*s%{l@(kʎB[Vtd3 ?h4Tn!9\.ipc"0='aNb*j~vnt % #K+.ˇZqXrPhdd$fnO=?>KK1$M[o$ѱUM6M6ig/Vo`l-=YWx.ߔ;'Gv'"ۻ1peFaxT }(lEaOoRj_,Պhł(ED, p8YhnB9+$& {'$k7v@^CXyB6[e7OV&1b<߼[W`I6{oK?!p-㯟xGƹh] AEOLKDR^tr>"`0LlJ k$fc]R:ft#,;4h4:::JQqzHx*A})mgΚXWDDdY! eA"f1 y)iO,tP_ QIkD}5|XsrTݰOAT6\r?)ў7,1Ql*k+i%QQ3e;Igsu /Fc=G/CaYyp/ 2=gB=( A'Uw=D2j,^ڑ{Fp88;mOS_g}[EbـH< tAɌBDDd! eG6ў|vwE.9o:`}qSۅ|g׊R1=oXDcbp29A׏b1CE2$b>pt/.czx 5n($o]/U>D~Rru=e`t>i[NU$^ҷ_ +65M45`Kƚy|QH). 2y?FL{CDc.I h ȢHz5e;GؕRV(jsz  g8իW/"&с\=+ʶ 8L}ɦŝu2czmMTjG֔7TˍZ7W/ŒgSPqqL*c==z@ş]lӧ&!1(CIX#"]O)<_h#DIjU#EGGG[[[k4=پ*yL"""s "1GDdyDԠ"/xZzW4.'趌JIjAT$LX{Ge}֏|jI%^KϛC/-+Wmii;pWSS%_`zFcNr&k+7)2x)7U 6H*%83ss:#f ínǸx#H5Qu͘^{kK B_},Y(QJ5A9$Pg= ;$ WpBu^񺋑+n0Ƒ4ܝ[Rwb1}XUZN#7Yb?n292x|"WF[=SaUGAۅ45%,6_|m[j0Oݘ˫ALf0`Xt95UwXOg Fo|ꊤ߸۠S&!~v==К)`08a+܇_ᜨ*g\Q$gO2Fo^pcV'],N.=*M @45ڒ= l2x0\,̽ŋW?H![=Ndh;ݭE#˹$"ʸtkgus(1H]QH/lLQ(JR.OϚeјSmVhbfGv}*Te$uD E_:gZ)0d>:8Z'X(˖ݗTM*5 ;5Y&<{ No3ZtDدt]*mεbܔ Q@tEۜ1BBx cXG[Dٚ- \Q,Dc.BeLh=+M ZS߸0$r/15{ˈ|\`p$bd'ċʐrӒ-lM'|<ߏ>m=}YJ\ HEDD -ٳi&Towͩ٫O>|E } suǐ{03B!fHySɂ4l)W)X*^ 'HCȖ\gnE) .˙[ + X<skB{u~E7K0¾_7|[NŋSp@ 0O3ynO_NS;ɊMЁ7B/B}Ru懶dlPa ]^n+jn HStk3ENd*k(mU\-FGYyY8vU?sB@+2.T/qigE7+CzYE8ZRRg\fP*ɓ'q_r啇7⊷^{Gci[jfNNNt?;M"i=d)d)DjUnVX>;@nǏ j\.74G#H{*7Oz/=me}rGZO>=RdZ$x==r:i8UڀgG^^^NNN88ntttb/tcmQ_(=KPުMq\ooo,+..8Gc5B0{`\"ugUܼK+X,&<'G}K87qyb: ^{mÆ w "D&x<:z㸉~kyp|@]&fqiH;r-% "tQ*8lt_>_49n82ۚ1ԥ2 袝r7V?B(ɰ3p,HJR1oh4 ^n(TAgavQUbk+d:D" d3ֿ9ըrS9z-IHv)k<Ȍ:2ss[ՆMZ!!vu,#rqzs"(JD1Zc}~b Ր%/ity'筪w}_N;iRmY^dqr6ǎ3̝s'Lr92VDeK-ZZN+H4zꪺQ]lX@>UUWW*xR?[ϲ3[)Jn)( ][I]y,2Zc__o)Uڰ+^t_ s}ڒl IDAT6'fڔҜi־>X,fY(,X^rEyf,TJ GNE>|ommmX-Q/_1jjϙgyB@ Ǐ75Z<u# p8J o< ÜViYq*y#Q(3&4wZ?h p}QH1>oz-ERac&o'_9d*fq9Pf+ \-p:(D7nW=|J*wntլMGq9'5:::PU-o]WFIQIΙ`P6̈́áv tGC:T&V Č-MDži Y߿?@ÙYr Jvx?˲wM7~Qj:hPHzs?%g ,6ul-#G ݲ7`9?}?ek-uC\]>#T5cܴ`,Wm{UlN޵IGzlɜv/-<<0LX1݇h4M/A{xJsmEQt,s82kLK'>P2m2C~)B ]pZV+( _YWӞ+q8ZmDya?|` KA{t,wѻ>KNn]<\;֊g%\V,d)8yho"%_xt@۷oeCꕟYdž3[eB #OmeeV$b%~oE3-w9Z0>&F-:h<1((͵6yg0 LVQBّ'Z-}EZC|*O0g<˲0\V-r6|4NfFKig:S?6#+8lbjPϛđ2Ǿ}Kɝvl_m+Ϸ ON_9]?XVe8uueyddE:r.NㅙK)99Na`$i|G%@kT*ʼn7~u^ 09Yh4*Pe]ŝAٓ2EQgdR>/#7zE %\3w."\;M9w 0ŪWKznjQj[e"3:F#cR79- Qg! VXҼvA y'p55Ѿ&79'aG8Vغqe_:vvfٍΛ,;-7@tzeY? g<4 L8֚UH$h̓? i @8NS?9cv]Θ8ew}_PQ B+x?z/A >Oӫ;j`>qӍI TѾt\l0[,a@R䄔HJ=TMniN1hd|MXXԒYQi})LÆV Weǔ ~PtWrH\A/-Yv ocl0aF!2AAXc%IsdTK-ȝR5VNfI>bV;@4 Z#!ܼ*>l wIL)"}h ٳj[-xsdܬoVv{!aKfIw7;U֍{ݹX_X]XD==j5vkb"`Q҆@gZIdYzs}Y)1ٛ) #/ ` BƝIQa$7ygooYL'qMts˓<朴zkVyƇ}ozj~NLʻoi+& -j[5|}%JԤ9%-ξаdN."XK<| Bw4kj;C10}ՍU NS{)geB9 \qzzzHh8T' 1OIFFFJJrWZ<2=ǎVu摲U%[>7BH-?yU+@I ֘,@% 3]y( ]_Yhx[̸7:7sTԔ)$;y|G7]de鯿:!i7_ܨ%s"'$I'i&PxutMI[a;(,U!׈Z ,O/&I񢲫UqDΙaNӺW72 /؋-aoaFc1rEQefA3߯`Jd23Hk"WԚOZ֑*Oʖ|aI]P4ovbiM7lqS\\LaabyC*zC˩6%/ <-ג[%BWku{Ǣ9g>Da~'`0ȉ"! ̰QGbKKK_-}A<\xD启}[{oAmMtn V+˲$(HD{ [g EQ`AD+{8+tTjHHR(޾}yi>Qm8M=dk݊.)F*BxgF#FJ*&S{Ls:ɴϹn25[caժ5<_qeʻ}9D#!{$=)D%+gS+VUU-=$Ɏ ِ#vV;~zkhyyدzz'g0C?  )InW`F?BB9 0qn7/;~4'|J`t&>tGeL9~ Zקz~4e\΅ӿP|7cAt:[(0 Bd$i}yrkjjw.E@ W^ p/<*Z+3(B9r ‚~MuW.{444LΪ* uBHQUuGZ],644Ns 7oToo- ժ5:99-3 K4#,`(0b)aD BLq\&!x***/G ԯ!IR{{}V*> y4t̛T '<,KeٿB9!!tVkjioU]]R]])..Ԭ*))yvs0Lqq1˲~V Q>Rd2MP BtX8mmm} I_T- ?~og@ /WHf3 OIijxn[_KԸl6[6n3ap8*++Kpuuu[^oaaK{"}w>OQX,B^Wa O̓pg2!Z*geO5!Bh:,WʹOKb@2\Z$Ã_D][O{@,_N]w]g; mTXmnnV~C|k0455555566nnjkk !D$bP'jcfo?|ʰdsZjΝ6l()))..֟0 5j6kew待iX84xWAMю([i◬ (eT`P[? @QՎtmgjjM nqIMOC+m6[iinWMo6.Eaa60W^[]|8]vmII0V lb|GaF/~ r .Wv\o۴ u ጽUeY?蝋M(DQOVmv6msw555+RbEEE,*em6[YY>~)*^9?' /7|D o3aH'S4/81'f8][[hzY~׭[҂#xDiEQ]* }xBu\ dA J͸ ]EEEꝧRH$_*/}Jb4^\"$f1{> |@%%%Y,պKΩt``f Nf.xDiBAk4'D(!LF ULSvr`oaN ~/*F?#(|Rc&o_!2RӧXJNr-7\Ȉ 4 ,1dTKRYC!y^BdD'G&POǴ vj g~0)Z0ڗ=OB,WP[=bf͆0ͭڞt^}5=ϜBɤ5ɲ|mX]ӅyRaԂ59!&TLub̿gJ ۵K9Od"dVgzdžr `>dz*ۮ&s[֬QWK7F|>IIIӢ 4 ,WֹO3PyUL˂1djk,Ҧ']$9ytef2SwL&u4XRN\H׎ﺔ22̓iy@h3oaata0-0O0LG dUͤJTѡſ } U?}Nv +J J,h~QbRԦ7Gg?bb@ii)vB!B !2ϩo!g6HZA81ڷL{b{r4hh1˵,,b'Ir"]uK;n:&]ek B,2B!ʁ]FW#N&$eW $wAHmOp4Lj@,<Ղ;6I_tsd|ye Goy4$4˦}]-}ڑ*[Vj?L00L0L0O{]'EQ`A?w2t'8G fLe p&uۜ[E]>'OATߺSwgJMmg7蕮b')d']u5IGdR;E5F|>IIICIie@2OΫ(gb*k;{bDJn[l#IghwlެWP#])=)dgϝfSdN$mxZB-CIiX|(J2m pV~EJHZs];l|}IPe2(_ϔsݷݝY˱[6tU8vJsLGgtP;>Pՠn|[oO{T {<;e3aata!?7N81h47vwwwwwoܸx|hTVV.-,L24)$=˒BʫWMBRY)$%.cq{$˃̩GۯD߲fe]:D"PʙCVf~"\pg>0)0<)z<)0bIg}מ~i~СCKypC_dq,'R_m3}%5Uoz+Y,lHOۏBoE,I7?11qb0\d2o!dQFWSYQ9XKy^8Dɴ @Gm,7Yk\>nDĝ6ǔz%'OZX4n(#w]\~sbjBط?E00L0L0Op]'EQ,i ii32g}V-c[[[(mҿBo, y~Hv_<d'\:8}#7?ؑz̙"1u颯s۲ut]..g~&GBQӷX,A wlzĥ ^W+ =) n{᡹BOOϲ߃X!,֥I׎;}ȑ^ 7/572od&׾97vzٱwm)Pj)U(&aFofhS.ۣ]wܹS~D=|!1ُc=iTS1jn۶M_Xtnj16(B!DKBO>#?*"Id]l^3ʨJ6m^vfo^ժAV$sÌfm[mk vp6Q牢$IIʮJ'^Ac=yää D᷾'O_U0 yԩ??\{@N[sX+nsdvdY| ǤT&gyH+E%RcS꾆Fgx]Qx<L;UĦY<|9 " .̓"<)0~AtgΜ:{#Gv;{@t2iM#"`6úaJYN$ÇbWuWݱ2a, tb'[ ok-  r*; k+3'W{kWyE!`uMIi+޷W^a% Z[mlwrm~oc<,=noT9#rUXq9̦!,= ]kDȔw׺GLi@s^/ۯ_zWJU M&>B!B3_<  `h@ jMy>)vH gyˌ.IQ(!o} ȻAv|g#!_3݈߰2h\'EF|GNRm3&emP{>IIBcI|ӳܷCfW0ˉәْІJBFEj/wFߪ jlLP^^88-z#WVo { sfyo&E&]'E8L.̓" (pimm][XftXۖ ^0L[`Z^ ^Y4 X2L&#CMQշ7.֟fp<ӎ8loJ Uiݭ;֎W퇀wZzj=҈wIt]`Dzaՠ'_SjƔH599ߘ* IiB?2hs]S䥗b^*7k/t=nVe:*\ .H66ZrfؕT zGw17X4^ͦ,3GTBHccf駙 FJ7i!40L0L0OzzzpL&E'EQ`A :>K)⏢ 98 \ϸ x_z؝T[ζzfcWUYZjeST#{rkR]ڒ:E^+_ޞkĜ5lY7g5ghttjB8K b<lp"Z.̓" ( DKȮsyVЯ:sʹm{f衙Ջ] yec+&L.v3հZvn&sD%})AL%Lpb/`*x<0 \ x8l+(B!ZJX8mmmFH̰nuQ9A=3*U\q BA ԝ::λlNkDJ׹*w8)FaJrBuow m;XPXJ'ԤnEEEj!B'nFy> ää DSYYܷ0/JvAʹ9\漎 Ԃ6rgVO8s2Uv 9ވn&7l.)yaYhhs>܌|IIIqL&E'EQ,+^[/[^"l5lo̧7hG*o&m|LRlirG7[;0 0fˮe8ϧ!`atataaF-(O)قvi?p~yMNa^sIk6KإX٘8ޮ\j,Z q%9祼kyUku f=gwTWW9L&@Q8!B-,Qu-=V~A  T ̕|UK"|9mkռE'=xKOKa9WXX˹*TY[̆-PUU?R B=BHAA_!B \q џ[ N@,n'y2TG΃'"ҡ+I3ܶhaxtg65Xաy jWq$u[vN i6:EQ#ǭ^S!4 " .̓".̓" ( \q ;X?LoI!4y= ^}6kߴi޺ ޳q=A-w}?W W.))yf"l6 ϧQ`ata =taaF!Gmzb'_yoPψs8MI;eUHI萶k޼}Wݺu` 8?!lp0O0L?7QQ.j 8s{}stT$?^ Vㆺn"wgf ƕ(sJ1zJz`lQB!.;?~|oa94❽jw{y T+=Kf o]m#i,'E&E&]'B,W<1&M{ǒʴ,LuL&ӌODOxnZ˟FF:T*fKeA;o-ޔn43B>O<)0)0<).̓" ((#2(y'I8L`³_ Ҋ !¼gn7o6we>ywYB-<)0 BGMߓҎD=+ T9ylT_ ꭏmryf~^ Tnd^*$DkR)FB!v]qBr̆GYBuCeT&߹-W ~sj|>_W$dE1tcccz4g  BmyRaRa҅y"Pp%|uQIWmBM|QBATę K/}sx|>ƋS0W.vuux<~̙6uVB _4.̓" " .̓"EIiDQZn>}{?q;Ob;C8^RqegeϯOf>)AgϞe;ZΟPw,wn6m~91[,Cgڅ!Bݏ+-q)t(ݨ@ Ͽר055('=:?L@PV uB!P‚-EvP7_nXhB&Dz`e?~_^H>O!d4P) 3/;#m!B<ናo?ڮu}";9KjL_ ֗úr,;ZZ񌏘۷glO&P gٴMBit'E&E&]'E8C]'EQ`A՚01%mwOm}QHKe|sL09\q[=B3O??Lo_8]*χIIIICIiXr݈YfKi4T-oB*] |>nܧ)"rTE #!u8&̓" (pazlmݕDPSfKbwY,eҿe*W#tꃷ@$$#3A(fK^>!B|-+N[['->QI= WƴWOVAow}m߃V`2XvN"93vMۀuطRP^hB&myYN]Ÿ9WsE!χ IIIICIiX?.Afl]X}[;}a5y.]u=mp.[LL/VԦt!B-,R;4tKv U\ʙclk-va̺75Eʲk2Gބd0ϴcEe\aѢ B!BK gsK$,igDvm^ ƶWy]%ɭ{d&!F{e/¿@< BHub?.̓" " .̓".̓" ((sEHn߿!K}T*u}J*;?_әeWsMaž;w޼ ujvqL B pL&E'E&]W-C r,FGGG.h .m9V *\ԦZ պEOn]3:QTWqV!MIie-I'OohGر/hHю*H(f[{Z˶m,(y)awjKy!B%ኳ,#7ϖt{gvB_Rvp BHjXT 쾺~{^GІyRaRa҅y"PX1@`||`?VZ5waRC;t3~Yfj bS"W+0{>t18qB+DXJJ޾4B:~8FII3 _/DΜ9e˖{^xq!# #KnI.jՠrn˩j.M5wVL8`@,-!2?<)0b C޽b>>o$3ygNBI  AC).Ƌw7˙]k6ˁwEq~ }]-kՂ- x^W+ y~g}v2wF]F)Z)v%<j=˖}U4^{jkk>:;;ʺ:8uT"Pnٲp^R.̓" " .!2˼ӳ"⇡uOi^ W VﯨO43ʨ]FcHL&#Ynfi\90O0L0L0O- aaF-owo۳-"ʏߝl'!FՃ&'btOwpsNa@Qp8<444<<~zkbOg-,Զ[<]'E&E&]'E у<)0b'AKokpڵ[nuuu rOO߈Q)L Q`ʒdU]ȡ+F"]'E&E&]'E8C]'EQ,BdDZȲl wF^@jE)0oXuw*6:D0zc a)FBںܷP<)0[ǵmIRsN\}6RIvB,\WTߥa<*?ujr\t:MdXr4#B!BK ]qr:϶j^=| t1=k*nTkk~d"ˈo$Y.(O4'̓" " .!+NeeOz{]'D7)(l?C?t>eHh'3{-))Bרf[]PhN'E&E&]'E8C]'EQv䱱#Pޜ%eA6f7oœ"3O_A<ќ0O0L0L0Op0O0L ˲@<@l.Ҏ?b^ߺ%<:Roܵ8,˲x<ӿƿZB!C B4_~r#~=REgvBW;qN ~ˎŽ|]]rB!BKc^zcǎ;vo0ӟ[ _ph"0HaaQU;~yD8E ;_ax0O0L0L0Op0O0L0p a(D"{32ܳ$% GĴ8C;Nc4ɛyax0O0L0L0Op0O0L0jA( n4]ƛyȲL&mBHKK qZgç#cb'w JdB:vwIBhetaaFaԂ0 wc(废I</^XPvUw\LQ+=/'&w'۲ jnQC<ƘLՍ6!B9u aNA(rx^= IDAT/(U7ſz֕3=˟l8"{+R촬–D҉qFaN8.̓" " .!Q p8s{Ӝ#7Ԃ妫gW)6S͋;DQTug3/˲#͖zC<#a<)0)0<).̓" ( Yʲ*(-.&/#B!ɐaB fIe[׭^) pÖ-bfVJwwF,֛[)v",`*2XM P4{h0O0L0L0Op]'EQm|FH>eY>~$=˲ƍ{:o $P™c/+ ӴZKN*:7ք|EP^^аB!G_e.`PfQw(BqE iGQ}"x,V 恺ɧsG9Q`Ŕ̰}]eZ[!B!4o+Ʋf ĉFL~IC-;J"/)Ϛw8WUU9>Pqx}>Vu)B!Ђl (9~Id29ӛ]՟{2Iu[!ia^Nڳܻf͚*`vQB&''A#e~<)0)0<)qbt0O0L0XASq1h/Y̸&L;X^u%3ui=?)ygc۵@EQY9cABZsDää Da0gJa RYYߕ.྽eZ^f?KfJ2'z@'E&E&]'E8C]'EQi mQgh17He-qD[n 9ݵTc2>VMJ_lIE&gw,)aV3+(.}IIIIICIiF*ILUݾZEe\>WÛ#v.p.`^~uT2˾XAm-oM4|1ל8l6k NVH !B!Be.B8rX+"Z.qȩIPp8|U#9tquəam4]]. ?[gQM0Be B!q BY.M{4<|2rcNLa Ѩ(/_N B@3D{Z5kt4bx0O0L0L0Op0O0L0LA~eP]f-} EQ#2vq0I[˻,i!\!ӆyRaRa҅yR3ЅyRaaʧ#n1TJzI=^eǼ#I˲ڮ,jgQ[,z^;~uv?:?岳0o+!ZF8C]'EQP V{ǖpRPD>\~XLQ(W3S)%,d[kᲪi&Ŋm!D!Bȸ T$~͞Oi{|R`atttddD;- ??Y2ưåYM5Ld"rZq$ ]'E&E&]'B叼/ ݾzSi}Z&eڮaŋbpt:FXNٰzѬn3 }ݭ>>qժU-SVN' CIIIIVtaaFaOO].:x`ooo!ND4MLO-e&3M MJgNҾqQ BA:;;3G"瘩Ecg:2g+d/IYVMD_4 3<!2.<)0bI h47vwwwwwoܸx|>ظf=CwDoFۓ?zĕ>ݨl$΢/pDtm;V 6߅B!BFm۶=3^>3[n}\_ ;B<4JS3j*tj7R-(͛7}=ej^j\heGK*`ܴR *'E&E&]'B%-_{~Z駟>t|m+-M~ЖTm<ϋ&`EvD:$܈MHDxnj,1 ⁩~|z/(en76.TOOrCää iхyRaQp@ p@ ڰao$|{/r_Ǻ+2ō*-) 3ГJNȮ访]xߞpo4ZN>TcrB!B*ܖt`0yXW7S @l"QQ}AhK2Y NEGę`3:fdnǘ'.KT0⎬"t7Gann(>眪:rퟵm[:6m%ǖQXH\33VAP*fsL!jPtsS E %pҌykBBY q@|yU DVb~fX.\۞ξp ]{jjjد[ gjJi@A+/"PONdz^` Xր5` Xր5` XCZ)gHKF]VUUe2>UAMZ.Zܒޯo!N-F>TiݢX,#~zYY!K{>M!4%a6`j0EMֳeee{ O!L!L~!O544wv#ɯd[ڶƺAzaÆFΓOU'K7װ-їωd2}u#F `PBk'6GEP v~ yaa yOZΝ;7==ݶ%==}޼y...!$QS5G{ - )V=";j;)RqC1E4JGBBԢ_OſxÇ+ȓGStkAϟ}:<<<<<̙3V(\^Ezco_qe,b8EFt鬼8!4LW^.Juڀ{g>( (Bpa]J.xBc_@ !/#)_Sb=|겮GRjL454`4h C||*ο<8J55lKlllPPPH7UlB Uc_OUqcx}dyaˮ s͞X2,V:!踈Z)|botcG{ p=6JJ>>>]$!eҙ4ET㝦~I)c KF Ԩh&aL$ &ˇ{k>AG|PӤ˚?(>-&ԟe#j|jypA Ո'0hBN^  RoX/h׾UqgĦsfߝ*,lql ~!O~!O!L!L~!OÃ/u`;tBȦ R]義7z2ԄL(N0A(7vk`nѐ5^'~1H @WxpicFeQ(-²41_i* ڗ O~!O!L!L~!O>iu:˗7n4jԨ]v,EQ  vBMaҁ?N?z 'NسXҖņe-5;A',#rkAx#Lvk xq??u` vJ.xv҇_hjAUݩvjtL[UԚ9dK:( :BG~ Y2Ezȑ#׬Yyf֭[+WT*` wOrNʛǂQ߱FItزWY&x雚AF:vDwd3[JӵK%-m(QѲ 1!Rs[ FoESTtttXXX7MF[?/_#ܸqԬ]v6mjkΝ;<|}};,^;<}N]>[b *>3 E'G&M7M,i* ZJMfK)RKF bo ϖ|Ժ#7V & >\8 o0jNs쪯3fLAANȽywȎ-KbO\h>q) -!%QWY+[ =0D2(T/V}K:%ڑy FFIEJH$"jd4-KqǵEe ! Umẗ́ogddzBP(d8ච tEמx#*ë%ӾvC̀~)ui}>*={L:k׮SNߟzM\@AxDD 5LjVsJ΅ߗk2uvGJnc zvf?P1 bHXP(H$m… Çe@'ߐ'&&'@رcW^/{Rh4__?ĥ+p˯f5|4S,K$o}C~JT{&pY!vABst鲦̿2F UR|}}JW[k0`/S,K}}}vv>`СLWRRի+++o>ޫ8Cgphr3l۲""í41+i1Ja^>S&̴J[,Lkֆf`U> an?ҥK5F$-6MfoNt@D3dȐ3f,[,44SWW~պ`w}WT2?8rM´p ɓف3L| 4F;jԠz:w%>5 L\]2`ȑd谮+phjIz8Eء .Lm5^SCcATVFR 6jDV8t p2dwa.#SRr."Гrm<,JQĵ0++f!O~!O!L!L~!Od2egg4y~l'\X&;`nB\/DHtffX$M4;XM)b۟Q`ҿo&cM7~T?;=X2y= V !V5+ozo& bs#O#*]"e(-(OlVFŲq- zqsL7z;ߝ7^a>ӽGg Bܹ//##/ { #>e8!*"\di!v4ve`8~ )jbVG],'Ny yaa y}ѣJZ?Ç{zFؼ劣ڳgOXXEQݰ-7 3VRRh"JR-ZTZZ1rm󼿡 "|||!!EIk%k>ui k4.CS{uد tIں!* H8hD"Q*x!bƍ~|PUUu H4s_y啝;w4tZv3ftпmS)(--qD"y衇(䜰HT8L|D--ou~ IDATY))J zE8wp6}DhhѣGcbbؖׯ_ߟ|n͕P(4S8Mٲeٳg g;vlJJ=;[pp0_AlcM~s;0qvл(ral5H$^Qc;򆆆Xȓ_ȓGG_ȳݹs_~- EQ:^Pfڵ4M˗Zl6;n8BP(ƍڮ^旕eÆ ^^^111۶m]۱cƎ+J#"">ۮ/&%%) F|rM܃oݺrJRꫯ  ;숢(*l刎(^jժ ݭ3/FQ(IIIwq:f޽K,mYdIff&W lD" nNQ…Ob Mjoƿ6W͇L/YWW|:ڰ_?-^d:l#{TRRҁ-ȓ_ȓGG_ȳ%$$USv~=C999Ǐ_bŊc^~̙3gΜy999>lJJJQQQaaʕ+O>n/sڿ+VC}[lٹs'u{l͚5_~o?0]3g| .^lٲ&L=ztEEѣGx ;vqWc_q^ȕ/[,66ŋ?3n޼#pcGa\tc`Xx+Wpdi=+(7v6.'^{qYYYm[ ' ׋=^ {L1s$RTTT\\.odh[9%]@QhATp6VЦK.-\P.Ϛ5+..nl/EQ{ɓ'g͚qF%;;{ʕϟ',X 11qŊ۶m;z_nKF׭[ƶ۷/---''dɒ#F+LWffG}ĜUKNNYn`jjjZZn 3fLAA s vdxl޼y͚5seElZZڍ7I{wssD"innldniiqG}}BBBMMW_}iӦ9c4}wF1={cv]A݅oi~4]eXt_{M1F$@_WUUQmWXڪ|;~m@B0Q!_{_8˴CT/}l>v=:f̘?$RGKcc]KXXsTxxxVVVXX撒ɓ' ,((8p R__UWWG޿AخÇBO 33cP/;^x S9})Rc|Wcc7RcTh4h$fрl{b*|)ĖJ qh4g3`Nq޵kשSӡ9rkv]ߺ[{ׁKFrssg͚ŶruډEƸϥ׆w3w-do;~=1sdiW͇򍿸z^A*/r9BoDuUUU~a* y yaa y-[B\ȉ{7ǻ+JFD"qq[ӦM|饗322^{5en ;}v9;Wupn]N^͝;7==ݶ LOO7o&LOꁂ088VL>}ݺuC 9t\.W*7PީZD[$ eɫTOok QL) svم<찦A"W=nݚO63gάYfժUXs&&&B_}FEE۷G-M9&&&dsJҜ͛73IMM8qϯkBΝ;]ƱIIIW_"ә;ښ0vq ~[2;_{YYYNGvlϏ1bƍ˗/'999IΘ1c'N/++۱cǖ-[<({͛7zt˖-ϟow+JKK9ѦV~^RXhZiT~mۅWK7x{C[[]7b,VMܼyȑ#meW~R^ KD"R9~O?uݲ{L&233mGr2Oa6dx$R)ɦMv!P.$ŋj__ߥK655]̽#ʯ_~j=\.={v^^V:wSXX8|RT*ϟ_TTt&4M>|x"(44499ʕ+N뺂 kMMM=q;,//Ν;W.wܱ/k0?Ñ#GNZnmMX5lba9rdgA?zM-.޾jm!??C79n^KC_3a޽=>f JׅOﴽt +2ϯ&V ;%X~-Wh}k;fol\X,˳Z=r;!!={V|ʐSWH|frҨv*FCCOoA;ȓ_ȓGG__.|ʨ+34$$)LwJo׭k5{NMbQ6#F\zUk}ӓtد5!aVHPtf;_ȓ_ȓGG_h9Õf~~~c>N MMSݸe{:EQ!!!JRVהTW|]SY&M;"l&4m6gF*bmQ7{vsM1l0\>iҤ+Wdee^=ѣ###U*F˽ iܼ 7 5~QY~n\kQCCCU=pA"/##/ {xmt;lssO?d(U^%6_YDLqt!dȑ~~~޳ I,9;a@[/+p7 T*k4 EƇL._|]S}ulxV3pE (@F 3Çymnک={Q rq0999˖-H$9s_݃󹟠 FqlTh)ʵ N BϧE'ZB%L&cޅ =6n~UUU'ND3gil5+sN5q|Mɣ5Zŋ 8^CA?FLFDQ|мMMF˱oU""##y9=;7<vX\W_Wx7(**?~|OϢ駟~ L UQC$IHHHHHH7qίXȓ_ȓGG_ӳܹs_~-ׯg?S^xZh֮]KӴ^_|U'3;n8BP(ƍڮ^lu;blذ!""+&&f۶mk;vرcRiDD'|buŤ$Bh/_ξ )nZrR|W DŽvDQjrDGQ^_jUPPǙviFP$%%ŽX,ƥsxCeXׯ_g.U(cǎLa 'Ξ|o>LVkEc&ھL:u/^})S<裵ɋ-ϟZWWSOBrrr̙uD&$$k^xA,]4$$̙3o7nOB^:qw}wΜ9W\y'?өSB &L?cǎӧOرvGDD>555k׮8pMNc`mo7K&&&Ι3GR9]+S(ꩧzݹsMN<9pvwk:!77wڵ3g1+11qxǖ3 -O, !f< `ذa]ƏQ5Ա-Di|rǖEAtNׇ6 ?QqtbaG>tG| !O~!O!L!L~!Oc6;vG3?&PUZZڿfdcc]KXXXCC!$<<<+++,,]sIIɓuZ0'QQQuuu4>|xYY!$88=(((vk{`x322JJJz=!D(2:Nc# 0""ݺmAhiAAI˝uRuuÇ߿⋯:H.# -.ZǎS6=-6p=n4!$666((M_pa| ''&&G3 /rUU՞={ݻl8ma~I҆///LJٌiAhX]#3AbBD"V}O^Nmr^z+W6mP( L&c+r vdxFXtUnݶ v;RL&i/pGo~SRR1+D]Rh@ DM>~ĝ?e6bȡg |BB=zRT?|pOψB}[k놧ٳ',,nؖg;wnŊNgRRRh"JR-ZTZZ3/ IG6lXTTTHHHpp0ZWWSO1'jrrr̙uD&$$ /h.]r̙7n|'!W^8q;gΜ+W<䓟~ԩS !&LӟČܱcӧwd#""RSS񚚚k8pӦMN'1iҥK̙RlwE=S> ;wܴiɓ'nn]'9fĶTVV5c=]1ÎF "up.+>>v-aaa 𬬬0v%%%'O.**jiAXPPbGEEB?h keee` ::I())N'1ؑSXXtUnݶ `ҤIN{mwk: #1OOg0^~媪={wٞqTJ ^^^lWKKswӂbFfh"ZT*ez\.w{{ի\iӦBa0d2[\٭c# h4r?ޕ2"J2LڻNQT[o]5j7 mOsUWWuʮ8R79h4g3`Nq޵kשSӡ7o䘭[N/$sq;~ܭ%rssg͚Ŷr/E `]Spaӳ O~!O!L!L~!&%%e˖-Bm)//W*XU||޽{moo]JFQ"iӦeffK]b۝O۾};q+\ܺfddIsYsMOO-͛ǽ rC\x<=B^^^OOᾂ<u+qqqw6mxbHHg}VSSj:_~zPPл[YYYYY;o޼02MMM#FXl !sss EB.τRyȑӧO9sèz Gu={ PQ((} B>3 ’ET*JhѢҞ'"v;wnŊv1DvıǏ?>>>ƍ۳gk7LnYlYddD"ׯ̙3k88]n88;rРAn%<4LLb BV;}3ft'mGHNN v:cuSL}={***nݺ~l/Np麔QF8p@^xW_ݰaCjj*Ӌ-a2ppvMӿolqpv0.nXb͓6o޼xbۖŋ;=5l$wǪ[~[VknnnTT[äqpvڍ7|}}88;6LgGMNN ΎqW[ө'<= 6mm[<8}8[rp DjnnH$Wa&ӊ88;6Lg?~Ȑ!/mtÉu2O(+++m[***{j>$~˗/]-rx9UX*>>3¤qpv;w;6nܸ^{iaa88ݧ?2_m>.0ipb BXl4m[Fݿy?~\חnٲ%00Luc  ıa>~8ۂäqpv)fimItK/~8¤qpÉu2O}?{l3u Br3UUVVN<ȑ#88;ipp*##_~oӂt۞={&Md[Q 00t!)󫲲RP0[p(\)qlĈkm9|Ia:-**ȶvwpp:v"...77׶%///66h+Om'qx; j˓6oݱ[t]'O2dg'ن'7s#l#&0tu6O$7|nÆ QQQZOk׮ x7|Sќ={Enq;@1L5jԎ;0qpk֬Y{쩪2eee~ihh}^ng}l$<= ipJRTΟ?zep D+W@0qi9pB&E:0qpv?P 0qpu&On/By=PQ((} B> !@BAG PQ((}3RIENDB`gsl-2.6/doc/images/gaussfilt2.png0000644016036000116100000055523213373111455013710 00000000000000PNG  IHDRbKGD IDATxwxTg{K6ɦ@5H `JR~KQQ@ AKh!6u[};sv yxx6̙3svwaY,@ @ m؝@ 2D@ D@ D@ D@ D@ D@ D@ D@ D@ D@ D@ D@ SLJRtʔ)%%%JL:..ťO>_drt @ G wZ=bĈ>}gȑ,XO?m޼d? B@ ᱀eXW͛~ge?>T*sNHHRXXأGR@ :t^÷k;caPH(2@ ±=##gϞ=zܻw9s^~sΩT*Ju٩SΛ7ϡ-$@  *5 C[ NX,'O>p2iҤX,ǵ@ @x<8-z3^n]PPPJJJ]]]]]]JJJPPІ Z< l+@ >Jc=wF[*++{]QQA/saÆ-O~mrl/;Ap5p5(P !!֠@ CAqql{nn߾osNLL cᲲx|K|||YYG @ <&8V7n׮]]vM0pPPPZZիl@ X[o]xqV|o O,X0sC5448p`̙ .th @ $.\ĉ#G~=1@ɛ6m> ::>:uj UAp5p5(P !!֠@ CAqy Mn 88A(kkP !֠8pQ)@ `n wB0{n#n£n^i/kY&>>~߾}R['Bnb'ACAaڴi݄G 6lHHH8x`'qo+WQ8e F0R['BnbwK; A ɣ"---77Fr{ഗ5j5d2Km=p5: " V?9;;dI&tI<#ptшx%2Oǝ@p'e۷o߶m[UUչs\Q:Qx^G:(ܟ;)N _k׮~nݺ۷oҥh/Ʉ8rn£nkR=r{ഗ5Pr{ktDoYlܾ}{willD{Y,dZreHH@ ꫯ:ΝxbV.3xn£nnNnq'FA;`/}Z,=z'gddƾ[x{)55oݼy4(..ԩSEEE˗/ov-q'/$Ɲ@xLlݺu?ѣu6t`z˗/\pΜ9Ϲs644WX??[lYbK/NNN۷o_f-<}ӧ[11lذaÆuv+mJΊ?k Ś5k;w466y#""233t Nw^bbb޽{̙g ,}||b'N$6mڧ~5kΆZw]\\p8ӏ$nk4DXܾ½nݺu^^^ hNnvVw;uL=p5: " VrG9rHV}yejjj|}}-?CBB?礤ٳ'**J"hZHd5NPPPg77HƸ;h؀=2ik8PmX @h#BpڵhP/f[[|ʕg~~~DBSZKg77HF;:`4활JnvL)cY`ARRXTTԱcҵk۷oo޼Y s-[u}=qw4d Ӹq bݻqƴiӐrpPr{ഋ5̡2NnqL /tL{`H;`/8pʩz:~8(7hL&wYY4nv@o<}vJ uCllW)))cƌ?~.ppX,~CPӞ'q'ڟI&;wNT߿7Xpag7@hq"'N~%޽{ɍ#<nɈq?{֭[q{Z*< %w,ܟwhdk}֞75.O:5<<ŋ=6SXXbDDϔ)S.\T*5͕+WO-"0CT)yPt,EC)-((O  {m/?~k؈W'{nnn~~>Z~P;ޢA`{-dӢ5 脶A;@߅DR ϚpW*ެ,qG*3f̘:u*%5ho?[nC[~ *4/-6vGFc]]oTTm~_vm @  <sLk'Z?,qG.Ud]r:-~lnXҞ;&[F? …;Ά XF"ܟ6mڴ`v6i&gYYܹsCCC/^=#mTT/... nq^L+WZmߖd}bijjzw]]]͛:thD" 0ȑ#=b5™3g' CBB;|ݻwǎ+H<<<}]ھbo=z4willD{[4kD t$wCV*ZWWbВǝ>H۞ꄄA>/l=SxҶ w`J;#(ek=PW=uo1}r/*S_____վRn:ʗ5gmEEZeYi[iG&G o3`p7LO"mWV/" Å{qq)SRT*2eJIIfy˖-ݺu 2]!IMM;vl WQQqԩ˗S̙3FcjjB(((xl.;{555ovo\s8p`^^˗Ϟ=q{_~999ׯ_~֭[a˗/Ϛ5ksΝ1cƵkZ p-Ӆ^xa…r|޽V:}4ܕ7jԨ1cݽ{7**7l%@dgg=zĉo^vo@9GOxhzCe zmqollqGأh`va=YYY555-@aCn4n?vzܯ\Fqq˛={vFFFrrrJJ ˞<0=bjYYYiEEERR'|wVtm8p`Cۢe`O;29:zEP[[۪[qGW߶=77 #*ƽ|ǎ֮\֮VG1{[9֭[гB3L LOOO_z%))) jXaa!}5kִxʤR)@&7nܸq-(D駟޲eˊ+o\{5kmƍG^zٳa 6̝;kYnM6 8}􆆆ko-eFVZ+y_Æ ,[lΜ9>?..?ph nj+VҥX,fX2Ȟcbb-ZTVV֪]jSO/?ɓXFo޽{~~>|ƍN0 ]x ЮC"/_}U^{)'(-~6AT;dS;6Uwd 4n/ U" ;cL;ze&`7j~EX"apGMGHOO߸q'p. ta<ݻwQuEnL%;tᎧ|@lwSZAA;~mhvСC kw1w\(-zDGRRŋS]] Cmç/]v={󆄄ܬ8m\x|?LSG -s`{/#6PRRFP2iQʟ6٪{@pTJ8qLNeaHtǝfۅm{<8~m۶/)`Uwض[<PL&'wJ QTÇ-ZD gGw&j?u?HHHXla<4믿*29E*Cx:رcΙ3 _u@yHBe%dždddңGk3/] /<׮]p8_|AvgQ&99ʕ+O644-:a))):W\Yj￧.zٳg)S.me}9t{g S>|;w%$$޽T?ۮvGwޏ>mٳg|k|c5IFHdq;t5n;qo[Vyܑ5Z*C/SWW ?Cyo26ʴqOJJmۆ wh Zdʴn VٳgϞ=v1c`I?5663ga^SS/l=2'O 9r$ey4 [W_q8kg駟^{SYZ-~>Txqu:lnffffAى` &IR!+# Ow'6TU 6̞=__~} ,&-[ĬYfРA7ot*ׯGeƎ`J\a4p;w1//?s :.--56m:th9o\~'wﮮ޽{g}d?KXh4'NxЮj˖-UUUUUU_~~;t͛7o۶M.[Zcx*t]5WՆG Xp Ν$)(W njF#` ǚ_Rxܭف"Q(qx" ;,`㭢HD]PԆr|:5;PBe^=xpGKf5~m%P|0C3#GP?~|ԨQV^z&\~^[CCH$8;;S :u nРAoLh'gΜGm߾n |}}b/"O߾}b7oF[puuiz$$$w!|?LNNvh G0cƌtzjPHx 0Q/6l@]EJh4(٭qg*p h /4`03lݞ[,+WPDD-q[n]wtHUWWO:uذaN_{A">3Dza'O믿kXF{zcƌɓ'3& x{0Na <-7w(wnxPڵرc?9ѣ/_Ni /wF;~f a@Ømf;TGѠm w?%%eݺu(o7cނtN  ٓ7tQJ^KICw(A8Nq CqSh/@9{; VKR8YfAy=AMM PS;}]U\ϡPcʔh@i6~j*4^n_|*bU G}ap p+ܵ& @VFz T555v [ii)~#^=+5ʁ:^ X9^\\gLȹ<'2S | jkQT*|$CAaLOI;ut|Gb b Ο?o'Ӌ-WLkZ E!ra\8K=JxzJJJwt| NLLăpERNa-(<82wC1qqcXMxFN ?Շi#//b1Nd ]݌½kgϢϸpx` B)3 w aẺ:=ڏ;?q[5fLÑhZ乧=dT#Mz-|ks<^Z&ᗕqGɁM;"'U~ܹu]|>{<2Fv*V__vS;.!UUU0RFw{vvvRRXt;h'n4 c 3!aA]pBk0/yl6SAPO?ނ ƸCagi%6b܁M0[cl=2 g]យ X, p(?p 'HF|*P(P8``.ܡ e6BeQGY~-cl{aǝZDx;mVmC-x ׯ_wg [<7E], W#'Zt=7ɚp, pxj=!!!>>Q3Ƹ766׳l2 2b-&8A([)(( AO/}EÁWVwkߋnj͢DG.|s_ȼ{ݽG!#>rՉbUNb ^\\lw. %#]P ʀfu wwk V[&9wЬCe`Gy)8;;ʷ5k׮ŋxw ϋUX iQt:(q;*22qDx:o̸rz( ~@n]'''c02d-zhТ wt7?hV0C]p!--q`ZFByfY&zIH; 8A(tݚ$EF&͟?qwqqZzJ+ xUz;@jf ԛLuWFʜoMZ;= UuuuGJR֌`Cw@OVeԑ6;% '$$լ Уr*ED)};{8xxgggہ,PEx@ (1T\4W mi0<6^=>* _Y]E~3 5Ž6BeFPk`T*m@I uerqGANQr3 w/"++by{{Ozvl`  vs5l\]m6أAYРȮmHV^Ut!\>|߳gϞ={-SeYҠFrg1 !3<$pxH F^w\$Tk'B$~*T0p wWWW;wP;fᣁqq3(зDL)Ыk~2Ҡ՝*,p-$t:. _APh4''~>YeaH u?dFkkP `c&2f\.Z hpeכL K O)VrrrD\nȿu`4D\)Gٜ=zQo}J-vWU}~vanMQOHR+ jucc#xLPg|TF+I$<ԩSff#0, DH3TBz $3$$$==h4 ^R@*0AZSC=|0S @8:VR.ܡ)XDzݵO ̞ 7.O Xj9 yE}+*՚SS7f00wfC]޼T=DOVxq,HE iii%{[*jj===A...p؈w\C,`0ÂENsqeUt\组 ?3s2H =t O<0V}Hp!BXX1Zp w7^uu/USe_qݨv횓d4f5FtÇzoy/ѧ2Yh٬>}[81P]gȏ2QiR*^ **F[Z%wQQQUUUhh(ڎ/tE@Èdzb1.kjj>5k0zãÑ :r;B;@ !))Pp7kg-urjgq~)췃"''7(]yi oϟ%g#Bx*ޟׂ8*4'b͖S_-PRq˫H.Ӆd2͔wJ6D"\{J|Eۯ6U[D{U"Qo<>~Lq˸ggb)lPޫUY} a㞚zezlxq߶@ ;tpq1ɬ0@["c@tG(ruUVhN fY|nѽ8~T M܉I!f8,V,Ɠʏ ,\-J=[^ݠRTkJ[s\hdf9]"PL}'^칛u4RilsqqAq<R;x9$ |^zM2.ܵZN :sl^DDDf@(p%;qyi08M&̚eJ#ɶo`Q4]((GIxܰkoV!v-]$7Fb95x~q],=J2!!*#n㎄2!҉1Q|=0}8JƂL`c~fs~"1|WDd EUU111b/B*ߧ{M&jg?RRd2P(TT<OPXXZWWWР؞=-7^9?-6f_'|0J?]Xz賏'N~ӥ(*öpG1T^WWW$a (@bup۳g ttxbѰレĻ =Y(5$U(x[Ԭz˄IT{x"8bIl7+f憄/{o^> a)|=~^S3얉 ,L(j4VD@a/{YݰzM>UՀc:BBe#==$CkkP  w ķ\(H5' Ë-Zm:a<@(B<[c`0X2wVs_QXX_Ŧ^/2Mo' exaS~ʎl6<ٷnBbKݢ^ 24haO4i){!ba!c*(3wq mxQmh#EهN* ԟ.t 6rVap`ZI<N0IR X$>0z0Пb99?{( }ybdNq .E?!K~1N|Q9g*kΖT5gw邗7JZ ?Mr|Eܼ@$lJ`ؼ2L4*4HD"pْZӥ3X?- zz{M'$>-x &@5p5(3~Q}}}a(J񮯞 TgJ7eJl&x>>>?%6OO3i?YӋ\]̂F1$$o߾7/_L$ :[x/0R̐eP,TZ@_C0 mqB.DD| c":R/RF4iŲS<8&/П1e`/Um4J>^:'u?o{Gz-[,^"x_ CcRmYIիWL1\.)u w-r׬Y={lbQ*,K&;i\RNw9ZK(,,e6Gz Iq,J)pwfWtܩQejjB'yDhDWa_f͌*>WXUovrڵO,Y+44L<+D"Aq){ێ۹ؾ}V͟;0oh" Xʦٴ- {?OME=|r(1~N]<$9E H[UeT+z|uؐ!Qр>y[&sJ5suMZٳ_~ s9,XJWWW%55544\ ~3d";5:0La0dY8o8:.2,!,htXDmvHGb-9U+>7Lӫtzwٗ;R["~ORL&M$dFJx.&-,0,}U=u<)/%<Q@d-- oLӏv@<9*00IiLnn{{eH z:ؿ= 'r)ţ Mګe7*7+'λ%,|֙SN"sa%E@?ܢRA.ldH%TR{nW-~ޠAO"Rl6XTV^e7555K,o൓H$R4^ϓs[.{%8@R}-?7U3C 9MS"ݷ c-5* @ !{ 1G B fsҩK_]yE"[(9hCPjB ;vqqE?ewH$:r ;ߪ;sْ/NOĴ–NdYR矏3?v\.tk׮W_}`vP #Vw2 _+/psP p@K ^!|ސdees' > |>.+e_Gҹ [?ȷ#ȭM%^cyx8 Rg)$I"///mAp;hM&`2ssl'>U( bq=^ܕz/{U5^\.;]ק/Z(==7Q(6x){6g9<>tDT:t׮]h!OHwwocCSȭkȭkHz bW^n,*էW{207S#&rwc_?6ٻyǷ*@L&C+./%z +XPNPyBTSO]* Hʓ{jE{HN܎`B}Ĉ @[.`/Lgg纺:/wJ[>Y y9B.`TuMR 0`@fM݂ أG4\.W&)ʮ]m5R/ݰn'"Dp5p5('҅?}5a49(h\_Vw$**J.#GP(D"PbщP@] wX<`_|1""b~! j'zȉ0$ȿ{I,rۅ֤y fd=z&jEf5~q;B#9,G|% l6 7Ç|+Vr=bĈm)GE^x{CSdH|"R a.Rg-UzKcs` G5nK|^kTZWWX,^44s8e&Q2@\\rAp;ɉD"ѴZ]ڎN =b6$uڽ{<]-dPd w6 <  *.=rHԻw{l*H$PP|pjpNsY,Y„ݳg}`)%zdψ;G&,mۣGT9چS+|qa/_()JxG$nћLJ5|P^ z\TTTɾw=ą;qBBBg?WR~7e.]BCΟ?_VX,)yNNNh)F{iiixx8l,K hZ)#@ee%.&x׮]{#GX,X50p7L-44n*v8)Oe)~˼.SZV-xߙڗ3@gk{g=Y0h\\Xr >}M< Fx~p糁Z1]nr*<>œSq1-TV5 Zn̾]j'<Z/\SND #vwT܁h.Vܡ )s2)))'N3f n ICCCS]Nqćv'%%Xb * $$СCc*!N>|8&a$)b'BF Utp8܃;Mܱ2%zD~B+Us{oJ h\$qtvMTwBwOμ9_e;z>VC{^jAƬ2;LcBZ#2l y!C`P[666L&e<aaa111*n3U=q 6mڴiӠN8X$L&q1-hq*EwJBGB cp@8 }e=>>"}).䈻ځy$zPppG {R,tf~5+NĝIy@W3f̠Nooo5~-Y$-- \XmH5 'wNgZfKV3w. qɩh,X n3*OO)S :T,%%%EDDf1t:$>{,<$Z 1lzP@(AAA 0^XbE=<$Ax_{5^GUotI1,O}Zi4\w*[e(((GGGc ʥRqgsDDM *J/eɜ薑ʈܐ+/ I\L^T(ע+CLMh w4>qD5#3"4]+Ibnoe!tQ8*cN/G!7_UfV;*DBN}VBqg\C{yyVwOOτ Wù}ժUÇ_h`0 -6lիzBCC88888 FqZzߘpCH֭l |ٍ]2U~z;=TRqgCz%wիWW~BeZ?, `wȆ'gONE ĝQܙ8tq'n髈wwooo`^^^K,9~8.މW^yeڴi w5;1u'"Ċ\F;#w5Dqr*wf0 ~`gTFY***֬YCDZm׮]#""cyfp.qߴiٳ=g S졾=ti&${xx8>PmR1CC qH**jw8ꫯ@G$`yGmQ.qOGGy* ë!Hu:N6<[mCN4q$>>>k׮5L@Cq!0)A@9?~||ܩD  < 4ĊPU10:1h'``>g͚E. 0t3hŽ_~SNE?:k2<<<ފ pJo]Bm6gΜk)fɩj$QēS" b| MN+tU4qGA:`Q~rlA*kiz9D^)XeVRI;5*338orVlU)w&ƺ:BH@@ս{8P{BB‹/^kW *c~3gμKvŋ322oꌌ ?x ^C&Z,Tܳ7m^5]p믿w^{ iA< @~yP܇`|yt9Xelϣ> ;OЯ_?8 ɓqz/9Z O";ی} *B Zj 66* iii3g+r]@vvb1G-԰xbI Jܹsqq1(,,Lplllnn.Ge}@;Ӵ=K¿_ !6H.N9w܆ J2)((hjj+lpϓO>I_*BAAY!111}7oa!GZg}Oۢ"AM!ɓ |l6K2o<ܳsNkpأ> sX !|͇~vZ,F'O 2iL1b&[\|9?+Yp!^y?/BBB@}} 8?i5Ȓϡ*;p2dڴiYYY ̙#[oEqssX, )%%ß6m  KJJ$+),,Jz=Cw=O?4!:-k׮^=j-`׺%KRRR!~)U,F0}2sss ,e˖1744'|L܌}YI/\rAFFOrѠq.^F?)SK OFFVEqK4'MAhl"""VZB8To>,c]}'11ѣpv$C/#%YQwPh;N j⻃{$[xhtUFrILLF=}ݷfYfҤIBuPDFF&x4hh0xGu"ץAM蓡/G !zh4O qm۶577˝n̙3p< Pe~+dT6m:ǝ͆5W}}\ SSDFF+HjVDEEyyyC=^^^wɦZcWzJNN0a… q'C###w5C!}B `@jhh&B^x^x!''^}JLOur*b >00#bEy*0>Tf +**}ܹqqqo3 ;{?8x4hh0(7[,^J{zzԠTj  J f2`:H&<~ ҤIէOQFJq_ E)p"e]ec0L*kV";u{qƎϫk4H*QN98888&Zr.HrA׫yYB[zU-Tʥdj FUƁShdE5vr;ϸ8vIؤ+XeqɕwrSmMVFݝdIHH UfÆ Ϯ]VM{wm}YYٔ)SBBBnu[888@&\--:VŀUw,t!::^ѩYeT{rr2N+=zhMh,Y٥H9M֭[BBB>j{xxfLʓSmZ; NW9lkvԩpіHO;&)vAܻvb nU: 6MNm/;zŝE5j4q;vA`e֣).JSzŝ)CGed.-!RVJ!`%qwꗥ]w ȰaÒ8w 2巔/x5ehh`BChiI5t.l8 l[cQ ~YnJ& ˖-s`KTV*~{-ű<.rV[K55G1عxwLNuGɩ*# F1""EaΝ;^ }!܌ۚ%. "?z،6Pܝ }/j5L:5:::>>ޙjk#Uh➑(=}tۜ>Y4lƧ~r!疃wnsN-CʨS,~=ӧOũ,0o޼D5K4L ;v ;wlFن%H5G +EE]h@'Q[[W{?ɓׯ r Q[NNue֭k_ZgD'j4[;ˡ{-.+,hXTT٥K륝 :dG+tP[@,>h.]ois\cnH淁/Kddd{a~ADƺnq-fAH;q!8tPll̙3ouCls ˹ J|`;@DDlpw8x{{''''''؏v<@.d"X,%ʼn 4qwvk);9qP۷V \qw-8:BqwU!M ݦh<=\ZquBpiL< 4x4 766]Iuq+ !r@ xV2ӳ{E(O=];wFML< 4x4 ۵ PM!6[e\kbb FqǎsYb ]˗^jGL{Z@[B a7$k7.,,!gfvK-. }NwW0޹nS4``=mot.v^=!Æ >|x}v 6Ӊ{~~ԩSNze{}CBB?8m.|<&ٗ_~o}Aqw(6Eé3g[Wʐ9|zۥ>!G=t_Wg]D-BG\^WW?v؆£G.-->ŋ^کsAY:֋x+.*cJxk#G,]t׮]8W$GPY.v+ UV >|ѢE`0,Zhذart^عsȑ#f͚46] vOG҆{h46lh9c NM ]۷oOMMq.D}}q~ű<&7|2ǯh[U\iӦٳg{fϞ-l~5 ~ѣ!{uu5!믿Vv{$ښhZUF}4ZZZNR/d,;v==;ȕbݣ-F?gΜ 4ٳj_ v.B?O?$Y=ZeJ!CG)/Cagϗ/ C Q^zha1Opі`BG\^YYtS> VTT,ZwZZ9sҝC2,((8|0Tlr*VyX+Þ:e:V6VQܑ {\{(C*#:UsPTNG[G 6+@L2ewqC4RXx1(##X48 IDAT|ꌌ ?5kG m\9ՎطoP`*X.\WC>\ iiiK.?9 /X wWp 8TVV|ŽnCh><^H+ jNx ^kXx$%΃LtܹSTTpHAAA\\܎;ԟW!cB[V{A5 ڇo*y衇$ ̙3rw} \>̙#WǜiJ]:'O/9779sLW. :u*!d8 N=l2BHCQWW[~f|Y빹ourppp}_~r\2a„w}h+Clu ߿ߪρ tҥK -VVw[gF:t(55uڵ*˫v Vpضm#<32vh"p u+G 6s5k{֬Y3i$W^?~|ZZZRRS[8$Ih4˗/FB +Ǻ{KKKjjjjjz*qg WXyykĽ-=(W'O~7{e+LN%; sF‰; < 4x4 ;w|%K>|L4~^ziĉNmR+yL'-JWW_< 4綪3]0$6^n[)wpTắ!~{#V]窪*f KkyFB*p.q۵kױcǢ?sNqə3g2~c￿yx^;vv`0B,XR(ͪ\ $!Ľ;HHHPoV;pNU8*e˖+WfeeaΖĤ%y9bsppp0qƚ7FEE?00- 儐x^KkxǍwɿX,* (gdd VVѣGGGG~kٿ'Tkm VIŝ~pݻw_5JGQ0eS2+WLII9|* u~eL+_X5S5-  < 4x4 駟ݺuOĽf.]?Ezz;V&- q*V |a⎇8{^qi,Xgk0 0 ӧO?}t+%R>[~V Ze8VqٱcǑ#G#,ʴ{8WޖTrq[ˉ; < 4x4 :???'''T⨸0qXNJGz5u2VYeRوCA3yN${@@'=|zz%ÔXeुCl755=ӧO󘩏Fq?s̸qp: wޚXw'NNʯqssr;u+G 6C!sRAAA}Aŝ~^ڤÁrRd~OONUUt5~w:"wqwd{vqDZk]k;\>cT]˗Ǎn:%7\7+jt#:=W9888\X{uuueeeii)qؤÁjXXXff&ۤ*99UMVXqxc09ó+j=ɣwAF.mIf3l]nw/^ IV!V٫wSG>Xrr ?ЎR<;c fmm-!d2k{yyyII g?FqwwW*I 0זwUF>lV֬ 4Mށ!w9>CbƍJi0[ڽ{w\\|eH*ϋ'R&$,~ ntc] |M< x@hh:ꜜ1G⎊;-((P /Ae`i2F#MŊ{kS].,+fUZeh(زe֭[^q߳gώ;M29JNN.,,;%TAP tAddb*pqol\hܢb'"5ehh0f ?ЎRܡH܁0{ss3_,]OEw;At(7Ҝ5w1qWcXfMJJxyH:{kX E=qh4={T(z 3g?~<3E: :ڵkA_FceeMԱVjC@#?1w1;$J̺$2Bz=#l0CCL܉ M;ŋ)))WtẠZ;LEY.%e~'rppp,:qj[Y2^zUn*$!kU<''ӷXqS@z^ȶ2''Ir?~jI N<ƣwΫs_*qGd˛>}yhظfo6)rYTH[L{a@G._!jCG 6CKNNV(<A`Vw*ʠȱ㮆c#33k%2 4LrhIe 6L> #66v儐'O?~\}ZU(!c4bbcc/A܁aZqA J/66v6#AAqd GbUFCz=KZe%4b(_| UNG)))ٵk?.ZH+&G[IǡǝÇ_^=&mAkڅP&wwvqǎ?OxU]N8ÃiSUTT`Vt؀KعsgHHd"ur* [D(nXF'rppp,: qg<|,>bu+Ps)gA477ltb^ A% Ͷ;PC%=P l+ (bٺuehnUC*ר*4c۶m)))f͚>}]!ׯh4!!!P;m݁;Tٳgʕtw}'߿?+++==!-ĉVY&%%eϞ=!zl CIIIYYTX]d#%e&sהF@UP˗/[rHKK2e Dޱc]RLwɕSϟ?/:u";vضm}:9ŝP±;#ؘUabcc"$ThCFF\:=n8(PVVJD߿BkBFI)--E+;jh###CBB@<*PVVVSSCshe^ZZSOBfΜYe(Ʉ Ye,d–544c,YRYYaz6*SNbC-tw{mm-CбLƦm۶N2W^fؤ}Iq!!!gϞHlŋ|ssq… mtqgYeqlN_6mWa9uL%;Oh֬Y#wDddn G 6CTa>,bY̙3V!JWӍj@w ^^^4)6Ye233dH2b>%;ѣ\6>j?00P_OLL/u#$2pZQ2H׊f3EAqc8vٲe˖-dĚuqg((4q7f̘o>f੕'gϞc`< n0D6!j2)S1LNqq qgClhh,w*]жX,f믿É;~8< x@hh:4Sb lI639r I=@i ]477ڵkٲeQ@ibPqj y5ͳ>$A'Rw %@%-""&0Ǒ~Q00G/ qi4waVa[[H_;]uAw$=[ܼN{тE[ehv\re;vpzŝ!0C̓"ǘE@kȼء3&..P.,H.DP! 3gN.]`$qCXe!Gዬ@! vXep0(++ӟtqB`WƘZJywf4Ki<&= {#)ۀ!NSS9888\ziJb]C3Nܤji==PҳB;.\d:ϳ6lR^BHy)P-\S0xFBLK6x&qG"///1wKSS|XN]ºן-?}c`B)7ݪegJ3*LuU7k~ ۪+%)P?PƧz۵k π2VTV-[:'5kRMϟ?~8hr  5<>sT_\l V465c)Xq'w"qGc2񸛛#ub9u$ xϞ=A~a"&yyy tO qvF70dV>&&fرU;[.Wl{'NDhh0fp!^WWO'O>;vo&$끼ʈw_{: #zvZsjl9vr#_ںwTIh ^Zr!sHKw u5ǿ⡧]ۻ5>7.t!haqTT&!@*毾@ݛ(555EQhїT*#&4,))2;k,ITe@{6o\XXqF1 jM'y`/h6BaHXm_mXoitҹ &;lI!o3>2 } E<8j|!!>^=Y_)9pʯy'6\AXh}؟$PZZKAnDb={((ĸ[Ej鼮oKcGuvj>^rDމ'fddp.B}ժUÇLJE233W^sϩ9[,:מUƪ284{F#[a2O_-+k)!$Svӆx<&Cs \!y{٥fzLxϡU'~J:GwEu}O!sboc{Zύa !l: к 48Mu:o}b-(Eb*ӷo7|sԩt9iI2ˑTUU5+Xe$On[\h2` /M6GBFmƀ^Sz%/8ܘoqLS /޽;رnJŝf2}'00B7s;wğ;At6k4Epx=B}kM@WFly"ߜ!nmMf^l0Kĉ;…MRSS=g^tJ1i]]qoll4C69G?7?Q};MAn7Ngp])~l=<<Ν;[CwbzF{i (oRWWPSWR`wwo֭^]|yie{Kgpm'64H[L/Mh8hIZez}rr!CC =ku^Z77_FwՐs~ΐrGu)"xf%u奋 1k&:gqq16Ye/3t~jhdnnngaB#߯?i w"@S1:Z|.]iii7o~w<&!8}/<޽{ˊ^ko!Mzqci <6ۈn:<<-k}Q]K͖F$---̀ڋ#|pIBHW5ܓԽ[܈NݺnnA^A^Hys!Uʫ`H'"m<m"gΜA0h XE㐰NITh)9q'o1bĄ y!$7fe4?=~+eN1 /++l2V6 !U._%d\mXm8tW:x_[]QUOuwƫb !Br*,:7,bEU$`0}o#>AC l[Ze2B<̆OJm}I}߻W2 @:_d|'5B9GgBZ~X ;>k?]8Ʉ"a)=wǖO; X3K2///>$T/###11`0Bz-S#FѷE [Oy Uش'PAQfYŦ=t>c\S*kH !zh7v<yYյW_WXSBCY~bKߝxr8qn#qO ybpf3QHisi9)Qni"5M$V̺&}nѱ&;o{jp,cvs;qvޝ:nѢEEEE@ܹD<m"̤`m4~jF /O\IPWW_AAA $wWUmՊ96V0DJ7|jʔ)0@5$A yz%l>f>M(o)'za/Vl=f=wAXQm3[_2}~W_}EBbgp~um~uk9v<=^TPߞ>~<;'aJ z !aoP}ק<]BIPrPB?1h6iot!9s'I2:>ABv <*}!WNJG6>~|6yμW{K\q?zF۳]=~ ' 2 Bb;x_oa%%% q$''رl6744 iΔeo}Y('N$:tph?(q3>T0-HKKKׯ_i&TUa~*K>ã4jnU !1qErr3Æy;<g;?~әQ};idDq]zV\;p!+<셓E%g_ *LD$*#gZ(GY"Ma;=MqO2sC}{b:E I!N$h܆v LԼYWO9U%/OlHz$T46'#7 MuHa1vFC L81<<<44rnvSػ+Ê3nFťwnF#fGgMoZ:1q?y$jNJYfM.]oy|S呧g0Jm>r:jFooKqQR]fֳ[vlm;?p>KVnO,Oq;5F${jSZزa7F^c7ɸ_{q͏~_jvNaYUf) \dZhmR۰.a|G3k;4koli/& tcB&z`"7wxx:##COk5:p /H8 ɜзO(..2dF1^K~5ukNg~wb#}'@5bbbrrrzĉ}ЯדqL'm2uM-~o%q2IIIvzg?C؞4iҦMO'N矇zw}go;ww W~ u0CGO 6l޼/ϟx|pƍ_|q555'O%k8pc$_ ֮];c ޿֭[7,g+I*/h5 KMRkl0񡡡 Z;󸨪a`D6QRqa1I٧E>Z?İE+K?fi~Xrw@@ddq|\a;3<{랙>lB͟?"B(87k]eQbůNq]WrE6^=g2ABS&M>1##jͻ ~r7j ,Yj*zXp?64>>>.\pvvvq&WH>Ov2+]..onjm+W}__Hoyܸ/!!!?^3¯Z+s;eI?qDXXXvvvbb|PRR1,YdܹuH$MMMVVVJUPc vE][~gnWD1`?k/?"???lPkD--{~!(o?¢߳^WM+5dA >`W^6!\񳙗,\(%''/YdȑW Bرcw{{7|cmm=gΜheNDPBj0 Cggg>2''O>֊jiWZ 3K \2l`U[!'nΫS]s!"#fLf,<%_(*4Ẍ#3cBScÈ;9zڏM_S*_7"B>}GgWP]UR㸗;880"t;J666vlL}||.W׬;uaw n9}^^𠥾AKcKk7_~͊?k}^RRrwZ8֩8!9s,..ꫯ>xٳgcollK#M]6/Y[lJo_~;{V>HtJwpd+G iiWN).ёSʷmHwo>NGЎPvy_e,-'y[ܼYXXH&bu~ <[ w+ƍ~Gm (VlP7~'KNV\cWS%inrX2kk;'C]<'HXC""60dv94---MMMR5!Ǒë߻ ygoDzYÇfo];BG*677TVgWTDxPCCôgHcƯ>q_ۚ.UHr\߭P7yoLeM= Bjs6gsҕ7n8Nʐ$P8o<:|`ЀG}„ qOMM8qbYB<<}&CHV "ԴUoiy,}mll^mIb(]qs.b4ߢ{qq۷;R/vqO92cooMø_w vvv_/T*eI;Nx7:t̙FLv}6kޠ{URD "/^裏8yW"64 y\\xo+|F͒oW`#Z#}{umo /np]ٿΫ.W9 l:P qj{0myOՁlW*oͫr&΄_.-[r&g~|w!+11qڵtG'.ˎ,khZ7$kֳ'Օűc#ЕsCamPcbw=|=z jq >|Ĉ2666xF3#F2BYV˵(.7w=Ek{꟯n?Qt7*B ]CPt\Ǭruuy&B+F_hX̾UF=3ןpQe&NK$nmk()~~Uw@p5h@   a0xd͛j*?l'OܸqF;ډFm?ڏ?x.>LZ\]ęyڕJt8 GmllwV #26IQwG "AP**qv]iBwbexSF]&qw23BH  ~X,V(s]vmZZk999tѣl8Gxeи766>x2=׆ݧV$УC`7QRߐuwS&zz 'K>$9Z߬[8^yҽ\<}"N=t޿!Գg3g{I$2:e...|w}Gs}|Q$ 63*BM4}Uii)7燯Z[[Mʊπߨs֒+**.]L #*aw?sL&:}3g233lGKol[+۟gm%6mxu쎽>a'O|x*O'?St 8W^9s:o({OaoݺkED"ܥGG"0]RAog#*]^W_53G7??u[ewB b@@]nK|..H>xB;;;|!5ʫO[ھ炕mEs"-k֜<7x \ɧ;[FH"̞={ԩ_{{{|MmmmUѡq')SRf{ge4* \鉨/2=13;5okkm۰'MqwuuG!]Urw|%cL&ɂQ!;PjI.M͹\뿛w:{7u7 wjjmjjQSwZCGGGݛdB#~G@D"QqW(?}>SׯWI$dR?Қihѣѓ\\\CztD"̀,v[ $~<#9P?0Vjݫi~T-Τ(LJ$⎛7H,RSSBgϞ׿!lmmݻG?l7么$( aܝ7̌37KeA{y'BݺucJ]<(c,>m]\\߭8r10 Aj0Ah@ /EOۻ|_~d^^^t`yٲeΝãD"C'*rpppvvF]~|掸3;c.N4coooH놏ϷV(<833`ubE4vøDҽ{7nݺW^qa Rѣ[ZZvލjW*\BP6c{tX5 ~_d7+\̻r6NwCPQgq8^zٿڸ;99UUUia>mll&vvvwܡg.x8kwj[믑2,==!Զ{HT];BÇX*2K$""B2wwq Zd qW 8;;GGGd2<4w>,bE]v F'''q&bٳ@,;C'''}|THϕJ%>BP0:2""'pMRec[::ʞjС䳟θKlmm{UB"t l㎇N'>|ǎsss3۸/Z(99!sߌ.آ1^u#E"ӯ_qƙ3g-zqK8"b1۶<ىZw//XBQRRB2I$ qǥD";}8___rFq'O"wTJD"O>J]ĝ݊h)r9, SRRՙyg'''3']ƿN񈻺YZZZ?N~b1~戸yԩ7nkamm͈hЃ 5 F߿_WW' N2 !ýab1v3vvv!!!(4 [N!YȘ&@nݺ fF#666^zN6􈓤Xs ).c]{{;=4 a8D`DaP'#ˈ.͍;Ɋa ԓ:2 tONoɑN?/OHĝ.v̘1SN_:#ӧO_xqXXzH7$TBxb|ɴ[[[ީK?;F.#үR#F$zY2Ϟ=ǿ׮]#3Ii@ PBj 34UUU펎mU.Xޘv!bwH+b ڴ1"^$Zұ:{CCC\\ܷ~KoFoQytׯ3Vs2NGVVV׿؇P*3ReH>Os{^XIz!N`,+@:eѣl:qewr;uTuu… *#k>lii͛ѣ ۓ$e$jsDiNwN!HիWbW !4cƌ3Dx;]7cÈ;Ibs|'?j#B9YLk.:q"]b:t~AىR`?:gfF*!0Cgrrcǎ>s^]*;G/Äq'o3さq8y$WQJ4OA>}AO>}Fx_|KoJa'q !]w췎9Beǎiii%0U![SScCMKKχ8iӦL֣a!L%ø/_V]=YK8ijh܉\BP.kh+R`v;;N*nF@ Z:88Щtqq *F C[U6yyy$ 0-иe}ժUؚK$Lo{aoD'f0OApWo}Ԓ!g{cp;۸^~唔 CK_xqnn.yFq LII'8G;0.hSݺuÎ]Os'O qFg͚5k֬vܓRwwvKhnmm{ =ݸq 1j< YHzGQkF˝6$(+O*fΜYVVC Ύt8jqg 1l{ƩkEx9]IGGrr+C }w8ICNEC2*# {k.JT1q:u*Le!t ի .-Gq{]M"=zȪfQ5h@   a0и!#K,_o޼9rHȸBz>wP(d'z|q6l؀}-666$cilQqgmɕ *%b=~Y~=w݈q'g'OV&w6; %"'\yubյvz|Bh6$ǝ~bD###ϟORCƝtBMRe3sg~kq8SEC!JNzuƝ숻JS_-\?rL 3qЃXYY<,\w5jc98ᄙ.ǝb[B9ظcoD*o؆hqsEqq#ǎ]LaIĝ9ã24={? 8È M;qWY ɉ{UաqGZGvvvǎ8p ccΩw6ї q7no=888""̙3ǎC1DBb8<sʑH$Faك=ђ=*`a8IT˜R6vNutt}ԥtҝS:#;sƝ Ttπ+Vp0 [; O{5ީo(w [dT*{nFøsԟcwP߾}OrD2} &`5NLReȋ ՝R h@.S]]I? TFvx cǎ=s̪UAj0Ah@ aƝǝ'9葿@g;@cȖ5ܱRGGGv=UA쾾SepH>TRfݝBCC;cǎO<]霊cemmOV^"HmRb)SwͿw>T 6nܸaz흖}v*p@ PBj q(]wCF3Ψ BGGǚM"J2p̟IoɈ9rlo΀mIMssVq=~QiRΝ+JdO+:)ϩ2x~(2;^20ʸ DǙիWg$Mqׄ丳+39r$HPѣSY qG-XΠ0Ω-5g`t%>vXPH|D"0VVVmmmwРA8RGg#qU>pZtLJA݋DܻwﮅqS=$$$""ӳS0Oı[;cٳgcYݯ]VQQ1T0i.\qFz7nEG> 3*qWn,Ω8;[*::zǏKU0z@ #5S1|c*H$§EЀ40fqGݹsu9f+蟷lٲe˖i][;#...:Cb13FTwwwŋkhM$4~)F;V9U$+*_bpWY3E9+CqG=x@@EԠ5 407Nni] *vT&{ @.I3`YA]DqwttLIIlQvvvӦMstt$/T*}駽h+ة2/B_^]ޞ;UF;5yaoZ9mMM 1:*5ǽ>ød.>ZȤ?BO?! 믿ky߾}Zw7nؽ{w 0C Qw[[XͷW*cw4'-b[/#U8x$''?S:tJ< =_iӦȥK:99999-]tРA[o9tP[[ہj7;.owM qA,l!:Qaܹ7mxiޝ?2JtA(~wAAARxxx~:eЀ405KBB$!!A]"G}D2{Ww|kqmyt*utF׍;OrܵSCWwwr"\]]lb*:tzs!R9e fQ5h@   a0k%}t&8p $$Gը2H#&%q )))xD ;oooURts*yqg;xB4ZF@ٹkjj.]iӦQ$=-:b(hdŋ ƒvhqpaR~駟~ZU']LYBucT9s8SEEɓ7l؀#^{5o߾IIItUnnn]]^E;zii%WiWBuu5?:h^t xTԁ12<vvĽS%X,|t5oii%`:D ;w4zSjg?n:ϩ)J M,(!))I ?][yy9MYYG!n qg ;QuU#VXr΂ }'ND=3Ʈ/BݺulԨQAV?ڵkZ~\.y4'""!w^7|hĉF``2Ψ1B(888;;&''O>J}رc׬Y]t;΃upZaP*csqT ō RSS%8"˦r̘1)))Zco~8pgt;s*и I.5Ժ8y8qbժU'O;w.ـN3f̒%Kƍו#q}ذa)))p{:ymTaP9$ON.*Ç;cT@Ax`_jЀ @P`׸dӧO9s&33Sݸ(ϟ>}:#ݻ:qp?: tFRevjtѸ{zzΟ?ƌZ+ԠA\]]B7bxq=Aj0Ah@ wWgukpNB_ظ KBCCY[]jh,爻vjt1wƍZCO+ ǎf*z P`Ѐd݂SetO /0bĈcWD#fuhG;~{3vE@S6Q(: ǸkGEDDL:o߾Ʈ·P"$$Dq`eezQ4 =M3gNZZ p2]f9vjec/ Ah@ PBj s D;˰aÌ]C5zꕒý6윪]BjЀ @P`+5)))󎿿+ݻ/^ U}]--ais2体)^|\cWG^ >Ϝbxƍ7n4T0Ah@ PBj L(Y萺:cׂ/^z\nj  Ԡ5 4YSs`?kjn/,&w3A5h@  Ԡ5 40pqxEL0fр4BjЀ @P`Cv8<r&w3U aЀ40`͐bcWG4BjЀ @P`CN   w0!0 Aj0A 4 5 9dC; IIIƮ5h@  Ԡ5 4{7HOOG}>>>U^^u Mw  Aj0A 4 5jĽ1:::<<(<<<&&{/R9gΜ+Vn`B iڵgϞݶmY2k֬A-\c5k\p!55UxcЀ4BjЀ @PF嗄zIBB¾}8vp¦MKV L 0zI߾}/]n愄͛7d2V L ڰwX,&KZ[[& BjЀ @  Aj0Ah@ àKN_3TSSN߹sGP7D=.<f.sܕxIpppvv6MNNN>}T'@`s RSS%'NTYJogso޼9;;s&C_7.ɲN>{̙Li ߈;:;`&w0 `ƽ8>>^.cH;wW^qttjVG}g]]]"##9yܹsbccGzRAyyyPP[ciXk-M P{{u낃%IHHΝ;%mkkkEz_~_>|l`i2D**ٳgWTTk-A Ncƽ1:::<<(<<<&&#gvss?ث0KFQUUw޲u%%%}d p 8uՐdBL?[ Ç߼y3o/gKSCq5jԡC%6V} pa Zݻwښ 9;;{]__|[cpw T;x𠺵(;}|I6nnn "J%[Y}L޸K<<sٳfϞ=Ν[fe|-[B!xHc0W0þ|p֭ r?[7oޤ NaP^^ngg?[ R(wܡZ~~~;ǟ-PÇ5N*:tΝnWg1lzINNN>}U­jucǮY&&&20`@ee%lj1-',PJ*^ki`6n3( zQZZ:`zɀJKKg dĈYYYMMMǏwppx'* TAW>&o'LJ/IMM8qc\0K*++nj^k08qD޽g T#R,RiiiCş-Pɓ'o8@AB6lx-Pݻ={^r)a~yϠFW>38 mʕƮ!`_>n5RرCZKd{hiiuַ~oᵖJo k׮dgⵖRlnn2d֭[6o윕Z Jrqqqƺu|}}Zޭ[/@AƏܹ/X45t:wRYXX8i$L&&MHi5?0?TQ[[K6(ALleeIzRC%\$33sɸyx{{Ϟ=ʕ+3gtrry'd,P߿_* T#---22q;wZ ?C>}{駟>|^k j}uJL>,0`q;`&w0 L0`q;`&w0 L0`q;`&w0 L0`ݸr\_RRnˣG>쳮{el `_Яqoll/***** ijjR#[VVnݺqZyߵkמ={v۶mdɬY pBo~H999SLq*om7/$$$Kۧr>~ѣG^ X5yyyaaa}^tI}8X!===gΜyU~{mmB8;;tcMMҥK?Szĉwp1… :1>---kkkˇŽz 1`AthPC=srrɒۥt|ILL wܛAVHAjЀRЀ 4SC2>}cǎ]fM!k'LJ/IMM8qʍ+++njIiiiCA-FCCCXXܹs_~e7oޜmggW s=_~yذaηnڱcڵk:]xwC)h@ PR@ PRЀTSed2YVVӧ}}}}}}Ϝ9I\;O>]8wk.]}[[ۨ+W?~C?# 5h@ HA)h@ HAj@ S\.}k w ^0vxAj]^ގjhh4v]x4 HAj@ `5 jZ6XJHHغuc|a@ PR|YZ[[BO<ĥK]Sr܁/7p5BGxxD" ZT[gjJ Z[[[ݬPJi:/Rrr{p7w8xq7e^re̘1"H忖< Ǐ7vx`10  A) w]inn~†wy'((!..nd/:F%/^;v/Ԥ> 4/ȑ# H$~~~| ]?|pʕ~~~666={/͙3&,,lΝ} ԉ}=zh\ ZqBii髯*y﫫 Æ 3vxy|qka@ PR0 2Qa_y挌M6]!C8q??a#4׮]=zO?]PP2oG^PP@[Shnn^|y^R)D"F,[L/?"ڲlٲlxrrr]^P[[/ a@ PR OF[T]< _"##'M4qD-UccD"!Kmmmش BVy/հLsdq -r|гgO;;KRꀈ&HS[[P(BƮA)h@ HA0iwڸW\믿P;C<<ŋ[lnll7nG;=YXTT|矓&MLs\LիWׯ__QQQQQ_Μ93f̘9sfYYYEEG}3pZSQQD IDATru01wS6;!00pʕ555555+W ³iA5;uTXXئM49,HzxwU $;(VP̛7޽{5JcǎdRtԨQgԩ酅3gtuu۹sger#1]Ο?+J +++mll49;w̜9SP8:: `uαcnj]^P^^ 0Μ9s9}RPRl̼صkמ={N<5k֠A.\Ɉ999SL{pIOO/\`(++BU궿}رc׬YkCI@\O3Ƙ}„ ԉ'ܸr̘1)))B@ PR`XQ{{{VVիO:e*7 rɸg:0Ӹϛ7ĉVMNN>yܹs1c,YdܸqƨP\\l*P F}tA.;_ Cj@ `L.ɲN>{̙L;;;?~w&Mhh#@ PR`wl -9g `20swߞ={ԭ`0"`:NpQqjttNK#Ѐ4@ĝ;0$0 FN 5@hݻ{* h:C%w7 *) A) DД͛7'&&^tʘ ReiӦ"MYrrP*q صkWEE+ `-\cWG4mܡa` ǝ"L"[ݻw7vxA4۶mSLJ8/g3oD6Lfee> `&m!nA888 <ԠP C7xc֬Y5558 4 LĀ `Su"رc Ca0LH ~{ MW$:?x@+T*!ǝKf/FZ`Lw4ŐQ 54V3Vʘe :qD ^JPFC5 o _a8oKщGfѢ0 I9i#Ѐ4a0b, 00ب2:l"oÄT,w|S7̱L&@wP9)**0`ɓ]bTX#b?hz7r\.Ǘpl|ܹW^yQ  X Po9F400*|ٜ0 qP%KرCZnw7 aBR@ZËcbbm?{l77?CO?3 r܍* c9S5a-ǽݻ*ךxo -Z$H6lؠMH UF3mڴ)22rҥߥK^|믿^pZq'ύ#n9nedw'V3Dill|IST/ } YrS1V3@e,/ٜr9>uVbbu]mT%R]]Ϫ\{7|SMq]=///,,^ҷoK.i]X,9s+W\AˢUj,/8Gܡa`,']T}4 R9`PȹSe.\P(Fi(R}ի7oތLkN.ѡMMMGQ"##ԩSZaĽa׮]CƽVPKkjj+mĉvjhh8}Gq]TR(..6vx_z饮 հw7 r8H4F0Ϟ={E_9V/Rp<p(:ar0:Xw-YiӦkZBp틊H$ݺu[hQRRRbb&;IIIt\a^EU%)!44Ըuꫯ.\%G dzgϞ ܢĄZujjjFFFyy@p555|AΝ;4h.]<ǏN'R^[__ qg@\͛74)<44/nt,tYmm-gǝ]y6,TL?ͭ^RVV᎚TN'EygB[n5vE:BO? SNXfs=tXU\\B(>>^ OF988XNLLs~~~ ?q._d?B=z47d*1?>:$++ !ԧOcWDfΜzW].p qttT655!ub!n:u9s!!g>qΦG'+M3708L%nc@^帧'&&fddp;޾}"= *rRUM:677gdd;v` MIfupw;a;Ϻ~ !55uĉ:)<--mС:)BP79͛7 L7Hk>U~6ah"P*X#G^ѣ-@|Yu ŋt X{"w6 #iӦuVq7_ P |I}޼y'NXjUmmmmmmrrɓ'ΝK6< (&&f孭Vz?TuԩSzX4Up8<`Z]]}93f˖-$OڑӶzxϒfK㞞N+Zjƌgq|"r&nbQԸyHSrTN㎁ Lfj4FjLBiaCΊ”gX*C1R=, ;9g܏w JO>Y~܌W 6w-pזF:_Ie\JE! #mN51XnM 0Z2(%1R=, (atyi/]֌~E$i4ijr)t>ԸyH>cS)L :@SYQeXQwT_F#cNaQ{t&v ]g?Zsdܭ O>'HT3(KOrw6IP]]] -{4ځqL*ӯ WKviܕT*c9K.˻@v{lY㮵IeXp.҄ݰөq?ʧ3ƸCggHƥq@M05 R@a$øԎͩJe+++@v{l #H*ӯPqS3R.,Wև{7,> ib=wlc/@S zDj,w̝ [VitN[N{@ {nS'(2ɓSwS˄qF(pOк3<þw)+GeԌ~5bs< p >裴=+KpOT&Qe(Ui;SI@z1Je윺#T[[[YYi?m|q8^/> ??nK2'' Gimmm~[oessss/" ̘1c ?!OLbMV___TTT 2/BQQў={O}r߾}%%%ׯO2SXdIe k7abO{]G}̙yyy-r]*cG֯9Fmmm\S~Ჲ2zY'k˒x Vnt'h&,5]]] 555 w_&j]ŋ~ŋӜSiP*sNȥ`g?Y^^… 헁|q7u10xqB{bݙ1i*6=^$ #qgE1&p%ўP744444@wgUVVl޼9fWJ1.K#^U>{>}#F1}{Z.^n7)**z뭷bu{ ǥ|tY0+{'f Uո'`2>TƓW_ݣʘcV wGzlkڵkL+gq7aw7jZ/@I2s͛7yYf5jԨQf:z)6mǍC:::ueJ-+++))9p/pGEĵJñ2InV: ^x8^&H6oN?Ḱ EBM㎳p8"][h$H2Bq>S͸ݓvȸP(³:e'\ UZ\A~Gb'\W*u9nؗ}"sKxk~su`[J++]t}"تU~9s[(Tƫ2J䞘 bڻdθ2qߺukAA7 kܤq gg5'ϰTe7Y3 eT]t 0ȓ9Sie(\Çww :X`GX p9]:}r#Q, .QL/khhͥߌ=Z+bJ.HL*t2Ĥ2qΝ͔)SbJe<*#F{;=*\-VKgÑ41xjU_wL7mT .Y!F*:o–6= ><9՞)Sq߿e)${21ځ&2{SL***~ˋ踉qu͜9sƍ*=_bwQ,+ɓ.׸~2i3[n|衇찢F2?gdv+**RaQ 555A Aw65S -766>|Rj֭9Pp4,Y1o> Fyy9>-bŔo}+W,))پ}cTO1ر()%- y*OɧPYY Y&}$I]9\~cǎOh~TOy[)Mp+qxG.v_Hn*^$g)ˁ@`֭9ͰΰI .IdS$!1:V}SSӧ~YZZyhll̫0A mq|Y^^---aժU1S` $[ rgg]zeXúC(*))Yl{#e?Ѓ%` w}Og*u;;8@9cW?H4/~kbH_aJ˔RַǸ(g?A0;. _}M;w.|s7n4=ӔRwz;?ݻNك> L_ IDAT_tK/;v, USOg_R_^)5`h4:x`-F,Y:ӟ*N?O(ck֓Ŀ/(h4 v'|2<'ڄ R˖-^xhuuu ;cR7'&c=C=4zhԱE~mF4=cRSLA|<>,_~\zg7x+\z]w]4}'.`χ|>g__z%K"@?=3RӦMcvɓ'G5k(rrr'z0D‡*z/\OÀ9眘yK]wu&233S)5sh4L)u&>޺ukGGG}}}{{b,>%qk7wqRjgΜߔo~ڵkO4xΎ;ܹ>wIJʔ#VGϝTfڴi͟?g9)2)FYnN2}bq8eZ=&đ}Enc0ip8f3l'n޼y6mRnwRdIvew|qgj=&mmm-)))))ѦIgr&O|L]X/vܝnlcpw*h%K,_|ٲeJ~C YhH%˺v2?=OJN;р.fbܗ.]ZRR8d.H˸uk&Ɲ`2R$~ᢢx:QB-GQ*ݤ>(4sy=[X02ڂb.]8$h ' Åq={6=3{}ʔ)Y2pX ɩh+++oE`wtOSffCgYžĸ+CɛqOPU0WX3g9r$cfgөqtc—K)j .}?я9.E; `rkϿKl?1~f.L&fTXmYUJ+gS[yLAv )f4P4q-2wM)Dv1 }RzIn*`ܙT&E|rjKeokܑ d$,1 UL'|RRR4_0( B/6mډ''ƸݻN3f jc]4{:7bSѦItvIv㫉qOԐA㞀T&u;Ԥm."cQ (p8-3&<ݻwC+YG[z$7U Dhjj*++c]HX\'[[[ 6q5Nϥ2&D {OKqHs.fJWZΓ@>N {=V*SVV` Mڭ|(Uf3fxg!$jܡ]~apO`sj;?O}7>lQQQMM K?3 ;ppԸ[x;sCooƩ:c P pθ+RYIJe6ڝqOl#/wYʘo@[ uvacB / ,83op8'L^*0^WWelipg{3_LRw] ulwZZȸ$-e&xcRWNq>O+Ԯ퉹θS$t2#pBYxBV c qg]2^裏ʵxOc=D.Qe؎q.jMD%5#nݺ_|QpqAgy/n*;VqWiRxw,Y;%wlJ6?` Cqg|g(mbqtRGUp,KgΜZbw0gθ6,iw*Ș;;pL!Xۂ2enLyϞ=o\w&㏯:wt؁-[JJJd1l/gvo4F\c [o-,͵ɓ1)x5`vZJe:::\׾ )iidECKhƅu{9i(VL6^~}QQ… e Qٴ߅#qیeR*`*~x-L>gΜ" =޵ug}~RQPv<6r0krq7gL* p-$S#*e۠mmmoG}駟7)bQ(ihhݫͩ׿)d!R?Tzla,wq$p71RLwI6+BY;{?'p^A+;LwA4TF}p1⢢;v+V@53Y&P2P{Æ Lm%N5>lAAU޵-䍶sJh>dG~ 7^ZtqQ*]7l[󬫫Lv]F(*pZ{:ĸwy NAL MθI Zw`g{キNq }#M|755|3feTE;n_e<ӉO1}VL= 92(pwayXOao"yg0s;|3 S ۇqX51dfETN@ZKm~~>&/[ڻb2&v`Ҹϝ;pӦMMd>I jjj&N8yd=nƸVd͞*Gˣ Rn~C"2_JĕsܭΜm0~ʸkMmTcnN5j4.I7uqOhvZfgIF*!pmQ GC+qB6Ā{qZ Vkqq%Kf+}-pG ?ǜm4[hw v;Rzq[n$"! ]wHFdܫyة,^{_,hqwxGw|]*/WZo^VVFw l98(v,FG]paܱz¸,zvOK V(+P(\ [dCX{4VݻR/,꽄pO_qyyy۶mt0m۶O?ݔE:w܆΀;`ߏqdX2ZPN -., R7ۅ/f){(ѻq׺9p"a-TeR0`,EcL0פq7M`Lqelct.`R%K(([reAAYT6@{MʸoٲtB{a$e&2ڱ[Dθ#p3OԡC|>G 4ڨ2eREEBKθB`K/A ;^^^]F^ {*;$pOqS7ŸKgi_JIU\RwHh;iL k!HB!聾w2 䔏)tlkkk+++cKm? ec\ *첍ÇKn(`aa!Zckjjv{ 0$M;k_ )]cx2oz,}Ϟ=ӧO1bĈ#Og_%pO{6L MN-&`b.i%Rw;aAl+ -C2аp·z>!3|qV}3DlUaR֋q0@沪bjwZ&nR-**lJ_qOxs*^ jʠI.iqie5y睇;22AOTF:[6İ !g(##RnL^nݺsZR/gzyyy .Fۤ&T0sqx@VQ.)dy}3fشi}}tr؁;P lN (,3SN4iRUUUUUդI./r4)td%pHehC4 J-2^{-!پ}{ccĉ Fq8$qdRx([[[>YZƝ`eǤ/ Rw<]U%z8 (ݪT^]^~e (YpaNNθq6lؠ[J%xbݺuW]uOS ɀ[>㮕 /P"p%i! Q.`QeibܵFKeiq0u{\R˫aj׸[|C!Z9UƅqB`Zo~'pk>=cU;i Xa&Tjgc[` Y!pwd] D"pKə-cܗ.]Z\\\SSq8S56j ڕbBZjy&OxWρt5 x#^˸ӗ 3X*+p7(7o\__oa̚Ǟ={hu 2cSY6I C,M o4L5؜pOq?)ClaCP~~~~~@zJT.;{\w툨eqo46?eMM4wY C)rZQQ*MY|6'-3‡;v6z IDATŔТf+˰:77۞wi Owpȸc3כJ)~]<±NH4= fnW:,ZR /^|oE%qq71wwVsi.Ӥ75PԸe6mpfORH"[GnאH$fF0 `0qg+㎯P__ shR HeMdtZ5tʬqgHg/Jט;䳬lƍ[4p T&01ZH ǘIpD"_/0Je,t"\Q)h@52AO2&65h4eR,1-OD +Tƙ; }x3f̘3gdQ\I*k{0uS\CC*;-Lh,WvƝdRp$p>b(rXGwwwdܵ]*Y&OvZmj[jM=\̈́ 6oޜ|VV '2Җ6E3& q?~qG!mRnM; ;aСfddP]*$'FMwqg#Ykk |{Ç+QHQ KecYR;d= 1'mmmhqHe;wbj&.w 2ȸ:qooo<{(?ƍ7lpA avqb$fb-rfZĸa:Z \ѣq3ދ/▖5k|_׿gCJ1&ĸ+Ð`ʠ(kǎuuuhC-T@L`22⸲L[:TF2lY'awv{NN˱H0:, hLxpڡ2~wG$DG%r7E IZ/pQ#e_]sssii)|&øthII <) ;oNq%fUV]R7vwwgy&СCThܽXp8,q#p[dɕW^裏2Ɲ1YT1l v_h*Acq@chLNGRJib1]RBkMz;=t>P0VpXhZa݁ 㮝ӎ~6KI -ZtE 4褓NBGRlvp" @ pSpÆ JƘ )ݻ/vRloo&t$HH&/#$C55lxW[[[Ȏ^ ˁ eaWiHMwA*FN낑qgބ;=[)E u]$%p@# wx{4䜞#f}/E0|g~i#J;wVTT@$C/lK);M%;e!wqG~~ٳ{椶.z駩ʢIaN;؁; -HANKa}Q3OV;!!QJWTT+-{&h{&- a?UJ1- e؎eK[#ژeb! 2A`]a@~lܸ/C!2EN-dWCCCII @ad,8SN&wx/P}s+c*ݰ^QQA3zj,m۶]QQA{>RH$>_ve=R GÇ3Z=RN:] \'ysWWG>Wyʙq>tuuZcd%6eff?ts[ڮgee CGibܧLs)op+''ˁJh;|'x~PJehHȃ%R"N: _ P9fmN̳a'eL) W]]%= ?~qD"C X}/2[~3f o߾CdXhr}wL,??>tvv߯zjSR]]]g`}hqg>38$## %cETkk+ގuf;p>ن)d*ALA1~xȧ$ pJX*)06aÆ!m#Գ󏎝՝;w^z˖-ZƝ#Gb&M? :$iO9~}СZ__Lķ& ^۷ө;&wXUJ>l0r\(ݺ4zp8›5 tg(aRÇ7w|YMQAEaDO {̘1! XcI*N;4L㎣)00!ey1r`ƌ_R2qBf=#"){[[[02db>EG._&;ƍCc'SklMԩS?Xx-"oqObe8b47TQP2ToxD;N2/fj6Ȥ2trʸT=3u LRV*Cu>`RbDjT-+^{5=jܡ~e+Bݎi4cʹ9+]*#aͿƔʰ Պ+ mZ{RpY/= "dC=z -p^ ?CJfXK>x%;O?t֪Cw k]2oN0O&LG UaMbtrCq7e1LSM;͆S*c:yJ2Z RV;@QHȑ# TwUX;;;WZ5m4mڴoϟ'Rj^x{f  ,mZ}w4M*w;iCu ?=Zx |@%w,;wVlS:t]1R|kvL=٥ z2ZlMe^ :鿇n8K@1 R/3 Ȋ)`N,3Uƾ9r%ΞŦOTsp̖dkssSO=e*pW\I_V-&(@w0Np"NL9D/5YkO8n_B ԭ[c, -VAۃ tRkUV;K)_&_JnNE#u4J!t[܁{C$zqgQO0zKe)4M|(X_׿կR P,]^ba 9dfޛS)p_z믿QRg7xʕ+gϞp^n 芆K.䥗^:p@ww]fϞ}±^t`VV0yTt vv;>˅qYK΀;Je,INBBUpZ][0LP-{nu*iv;΀;eqWXZK(Γ3$7ɸEɸK^SS#O5ɸK#¡1;mxZjKƝ~ zkġrQtadCUn{(X;oUTlWlVS*x6$=hۘq,0@ۭdeY1FJwgܗ,Y2cƌGye;{:mHDbjKlϞ=%%%t_)JqD2mV\ʸi$'JӚ5wwttlٲEr[j{5k֜r)rڵk.]JCϚ5^8s rE}駥Tt:;;233A,ECWp8 jw?{W+RvƝ- %^2mmm6LT;:;;񂂂DVƝ^ZZZ!40- %QĀ;_wSzLq>N˸;MQ&1 Z[0> {tccciiiqq1дph;NY(.;w|q*"ķl(ˊGX2+Vfze&g)p`D"Xac Bo~>92=a%- ܁;x0ð9:]au]}, н]2&=T&fTFA-tr,q1;K +)08y 'K32TweZ=;;{ <JeRĸc9tttNTؗ$gzꫯjN;3.:]&}Z[[sEa1v`A2 [K_̙3D"tˁ pg(JIeCq1ToD+qG3J"cU ܵ9joWnƝ^TuuѣiN,ܞ2hD Zxccٳ|ͅ ^qtdh4*2ZƝqWJٸw a$S9u(zof"XY v)vKo裏>_],XK/!ŖaܛWA•nq1b{qa(K]VV;2IwTwLj,Ҕ Tnঘ 2TF[tqKeVZu]w}_AX,--2e#pbAICLL]Ͳܡ(¤LN :ߝq pAɩ&1Y+Cq_Tm?5VaR*Zd>x` dTJevQRRjժb܄ a$кx-ptԸ[P,0T&^~U>BKZM* \2֗4wiRO|xرCss].䒼<%wO{\L]OxKIebw-*P0P=BɸS@SSSŒ;!tT¸k{ŒB!úSe].Мkws `g!ۦJF`/|]ws=2 0{Y|Sӕ^iƝ5{ Jt)kuYxI*6eܵLF!K,h3:tÇwԮ]|\lK6lJsnܸq=/`3 3θw*1ܧ0CɣyX:e;;;B:]Je𡴸$xm)RRv e^tEׯ[dlNe4 -[Fϊbs=WXXH Ga܈ $ebIZyMM 6NuҸر͙)G-'Цq:];ո{{S]wGq=9,jaJƗWptiXqf` KYZ|%KPׄaz4׿_K*]Ӫa!ؑq C"ZLX̡ⳤ2&L;YBotRP65°/یN V+S/}і$ľP.G 'q6{Yջ]|& D7v:IƝOtVv_[nk.Rj@駟]rqw'ez(pwѸSƝpwfUo*))b5;xaaڵkC: =a ))$pBI3அ/(G,HU GtʸCYAL*ˑ<㞤T% eܵ2IepSSƍDH] u,f('*pg3IvK[[[Mbz͹LT4S3p_|yQQr%PWJl1c%pGY< FR2̙3 Cuuux,(8/#Z4322ո+݁_IƝIeY*f>֭[`P:~θTFD;Ґ|?zv 7'& e,%q8p >EHk j-<رca|P(JY`0Kض7IƝwj=H( T35q0 t_!5% R ˰d!0Pǭ:tPyyy x455!ݜθ.zCOwжc)R&]"̀;s\ 3о޽СC%%%^fwA!` 1Z+ ă>x?cI]N4JepJe-[ J15[vB̙37l@I,{Q2 BV2vm)eYLgg믿N{(L} ʰSg;C ^]Ν;iC:ʸ(e=`ɸY&77 /[8bZW(wm#=2`۶m;I8@"N@dw Tv"uջ%zGV4/dee!1¸KƂ.}ÇW} +*h@ E;:[wiO ڱd\;2`۶mco!Aw<\{%n4et!χ`'<}Q8*nNe-[`ŒF_-&ճÕ]]ZZz[' IDATeܩ.ִ @&Q)O>de`#jYFv۷{jaR0 jjjiSX?Sw7mĮwaiИNpTeLv-/!qGm۶]r%WcSfNʸ}{,J;݅MlفTƸr4-.wSFi!3N_|M$^>cƌ *d&q2q4PDh0Rn>WGW?޲eKee%nr饗7nڵ0J'-YɸL8#zZβDӔ;Xɸ]2L*#j׸c&)#pG2Qkjj; zSaqeܵw(qDBX .nooK?LNw)''qgsehXC01Z~Z9HeL݅qzhaܵE>ŴJ+w8ȸ#p7/R9TF0C]L fgܙnw.1&Jq~eIz6I@Fe?яT]1_WR+WTJx≪Txª*HgŊZT4bL<.߫勥1f]I=WV|4xf7nTJeddPpFs+wX,P-SO=o|C)F+dCXj 9QZ̙6Ke=k5h>$fupȸ7j0LOqW[X9?).q>  .h+2ҒUZq]+;{ڞ>'.QF=s`\jW')bi=PR¸GQpwaSdyK" ~?bVGƝp8S5rYwVYDD}<+qwH0TF%ĸ@+c1=IƝG1@M5dh„ 6aFFƄ y8Nؾ}C\ݻ{ _E52ܿqWn1@*dɁY' C={M{(wB[*jAꭑ0MޔB/}KJLr*.vpksss}}=\H0W*#;XpžKF;A}ioqgܡ࡭Pa qf'N3N`N*ülw=;pN)ͩ& lpH(pgRe7t$U+gY&t?k;Q=)ՃոToa KӓZag;U㎯NDˌwT2cIb,76-ݻEQɴSzٔΕRq̔wp2ln/ph N͑qRt엌T&#uTS$+p 0aqҐȸC>&HĒ.Ydڴi1';)B~R*cbܡ I`q7xXgL5ʊP-1@L˸g.wĵ܌t;h&hqIeyrNB iq4 AY*TYؐټ[͓9dFF %D"Wֲ9Z \]*c ڴ9Ei{Q]A?0)G/N5p3lA¸*"" а fZ]8r6'9w9sѾlR%S# ͘.O˸#pP#9T*cbil`[Ɲ v4ʸk1G\V>dFm LiE0>h :c4I?ƝыfZWdz3`tzw??3.;{( G;ҫ/qK΀{ss30a2ltlzq';r8wm Gz6{ !J;6$;M()]%4d82.]ۧB!VQQDZ[[}>%$y;m۶͘1,wr:һˢ3}#F1b(]*CG$dzYi2Zl? 8T[w0mH[$?θ'&2ۉEK¸[;Tf&7W__=9UޜjqwP=^2cǎ?˘;2d]Шǧ!Q #28.ђ[[oU)@Y1$w}Ԯ[ꮫwji.°h~+܃llIJepJ䗤Tθb#ce~710qaB8rHY'O|Z} a$MSSp߽{U` _, /i/H̡R*@*q׸335`ӧ+7.X~#.6lU|ذaW_}5Jp'ʜ|---Hdذa!w;5 qQz|eO}8sw4: Z[[N:iҤI&]r% fhjzJTwzJ Rq;6Ge?x`٣ND%2t +%)E6%K]g ^WW8x;ug /ĩ]*4 qN%V a8^b3P4h999lM2IaÆM+AԻ.R՛q{Œ{kkkeeL"QJi{0|饗@mj`^Z4vȻL}TKe,z衇RƝK CQwy) fff>2P#G)(Qx}_ET3]ش`0>`38&qonnhܩ10˗&o+Hv*ZZZ͛Gرc,Xp—x()9990麔ʠqBmύqq!XQ(p?7oɓg͚5jԨQF͚5{ꩧw1LX2LRwY2EEEӦMSJܹDKqBvĬ?Cfff|>qj|C wV .S-C\2;PeԘTZ+3N_?B2VIw1~ ;ޅ-䰜*;NI8H ܳ)2`{,,ͩ( ;Z]6B-[׿6MѵV(.ピ'-8Z\R:6caܷoRʸG"h4dXss3͆ pGjllF999>26FrN;b;cT3lK:mmM<$ Nq>|xQQѓO>zoN=|pb>$z衯*TF)1q#Wccu͛Ǽεl#9Ϧʰ MqF%5pd#H$A?UdߠAh{> /^|oE2Ie(nRqg" #/L %0G~BwE< d~X)T4GƝ1pw.,,P`qs׸#СC')yוRֵ22 DDvdgZ/|ݞpFqg@@ECW_.;*-hf 6h Xbwx <Y- 뎞GVīKp*T8LUbqsjHlVýh.RYbi܏9?^{kk+]2LU=uRQ ;yQr4O;e]4TpKhܡTGS|Ks1$7G9.tkjjVӸ{"ɸ'qrd/"~)&&ABbAh~Ѩ';!Mv.6zh eMĸ{W^ye"Z C8dJ.] i1ƝܙG0`&M+U6 'R=&M{ #[qؿwwF ʒ pWJ}_deeA\*2TyS4 WPh21ʰ,):hP1"fyr P2۷o+X  ᝙9zh8ZbC :)Gؽ:x`^ZZ M.SJ^<-8y pD7tS^^~!pJhȸWTTBHAtM£Q攑flfL{ Ǝ[ZZ K82VoРA)@6؜z:aY%gffZ3&-6s3fooÆ <2221S$Y>{ uS/7h<.~o2۷&pe{UtQ];w)SK{EEh222[kZ.FRZZ 1C*:r=묳/@?-pG5ڸ4`ZF2С0L'C'Ƹ3ڵ~c_LҎ>j(Ư>|qҠ`ҤIoR.{UoQ1+43eMMMeee=1'?aY\xZ{@x;A xi)ôRzd 04mBٻ YJ\ȑ#;o^]]N M2_l~o8q"unl>m۶)S,Ml@(X wKjޭeG)ܓJKe233'N^fPԌRPKK_駟BC3VJY133 3fTF{069sss333Yתgb`B?}!bٜ:I'La2"Q1++ <'OS*sr1}ܸq)//h8O*&^siE5, z5Z ոϕRKs!6'K~W'?\FKK|Lp{u3/_|ŪqQ-jچ~^j7ookJ$DAp߼y}s:deeA>ªx"iooR,.4)s8Hxrih7:mN5wMS*C0 f`u.;BZ=TA{QeR3a(k29px~˼ɠC+m,q8Çkʨ63t!Cttt@ƝͦTy2^4CL wZkR ŜgDfRp&U6ۿĉ}]K*c£Ȧ 711g;t[F~D+Ά1;5(E*S_%W㎉w1TFoӦM?>f_~.$Pê21Ab"(o3nѸ;F%T{LFqٜt{0 w}<ޗWU3e$ a L2)`3J^E,UQlQ+ũuRzik-ԶqMQk8"S8?'Z{}d^{ z׻Ew vءݜ |6A/^CBd IDATD"%8c_Nܕ.@z܇ RRR'@%@?BՒVֿCH3Ă A7nǝw9\ts* ).Lc,#7#v]:i&86qEqx.Iw4_iSbZG~*7R]uNǝJt hw:9Kqߧ*cb.yamNIqg]ٳ祗^zWN= ύDJ.ǝ;vgTͩ(g&*}WAA{]).~ɒ%[nݺum/^tE_QNA"N"Iaqw^oTՙ744?O:qg}MP9NUCRᑁoܸn =yyyv=??hu딮,{Ād2i"~ ʓS/K7 q[VlNu!l-Asˆ{"`Eq$NHwl05mwJ}:JY׭[wkwH{ꫩWq*&lݜ4w|5Pn(;q/..~MgT!;kqbQ 4}'iewj*eU"wNc7![*Z U(hZݴ/39!823%%%k׮}嗫yS;* i Sc۶mrs'wʽ,Qeh6L>@}gmU:N 5 *;[*0"j=_ IƎA*w}~eG:d`َhG]Ze\Gm۶z܃51$*Cw# b.#dD&\6ihh ??~w=9B1̪iFZw Z]:rN:]ڠIdi( ܭ2xGZ|oP[L(ImS5ղx^Bqk@hpae%6;={寞QeU&HwH* hF25Tܡ ɡLqז?%qw'TWW?䓟OfɐUΝ o$w|4NܥǝJCjМo=Z#wi1ޅ*X w}T u`fp%,;87QqǛ*AܱZ>B)MnNzx߾}>2DB[s㨋.!2A [E PA;hiwl4mNC)d(9K=ߎDٓL&nڴ Y#>;R^WNͲ95y1q⋟}3fh_NQPJqzR 3NSk{Pnٜi$,'?Ʉ ֬Ysy籼Y;NM)7 ٷoH$ʪ:r;|X:=//]qOU&D:/^7yyy!]9k*P&M , i2I^ILt>2\w-)`mD"-[+.u;ξdiWYYuRkCʮUCL`Ri-Y #؝j2&yJkFM*;?|I=Rܱkw5!֘)L$K WoL_; Diw~NwHEqgkv0wRT-25vd#F0f2%Q]/K*C;det#^{-ԥx9l0[Ё_z*ó0~2v Jܥ*UF&U=k*:S-[j>Qwd&Ta5m5k$˄g޽M]pE/iJd2 0fG"J1En I1YehTePvʨD ׯ_CC=Tʂdho+i cg< -+V2qgWҗH/pW7F"իWwR 5[.v^b*}׮]"S]Kwi6+cUw,ޣG$H/H5jƌw[vS:DƏ?o}@_, *sG766uY ӑ~ s*\?-i_4ݰa2DazԅP;qtNDEDbʔ)z,:&:h;kt}в[ePDW^23Je#bЧ+uJ q*ʋkw q#!zUW]]%\ž;ʤc[N2eҥr ~CWDBwEqD"H ,[ÌAXg_ף: Sk81^mPK\/ǡOaإlb<wVKij:6j(:*`9WZ裏9T2"9se˖Q*~ovcd)OS}}=.5JPB=r/))IPSS]q7 H2w' kχYrnWQ(..jWqt6cl]+r(((vnQ) ܉;Ze|)1/JAqg:]q6mڼy.ʰ.`f3R'`p&aÞWF_s1(JIq/,,rS` %IՉYuwa$@h"L]q>Cj4ڬ*CmL_+qGhwZkLq7)-`:0?Iŝxd7K_g"U{Įˬ2&]q82MGŝ䕴bJJ d1TU-qϦ.SQqWr3{ 'NCT ͩZդ1s!qnA)o*%zĝ;$YGPc ;](djrsjV[l v;`Rň]IܥUhV<ߵk4;[e aÆ糟wtUJy)Xf8Fو(wmS2ܷo?O,tPF+2lNf/FͩnRSdTϘnL1).Eܟ}YܹsH$~ .tG-B|+_YhDPVJoڤ#zwLk'[<o AwIٔfۯn'$02͡2(J{^;cSC=Jm`O۷Gjcbfh"q6)̙BKݔIPSP to0 iĊ®޽A_1v UY-*Gy$:&w[>k9¡9lVw|Y箸YȔgWnڜG]04(//ŝqeKrbFY`oS $Z`]v\~w040wMvsTܕw?YLNeUD];ޚr;Vi6;vt&NmrwLӱ(= =&co%N2VwK^^}& mRqg,B*~= }|ho%J#G.X9͡?,,,,++Ye!ƍkmm]t롯:=jSqUF2X]*Rjze' MV`'H:`{^^RSS2Tۨ.$4,-S'M| ;w4+]ecUXeCasj2':6x q 2,iGq6Ng/B qw %%2.+nL][]I75wf@E5.ĝIΘWZfoN&w^8}l1cȢKܵk·)4eY,Z"w,;T9 $eee[nEŽ=l'8)-zZe4Zh_"ᦏ6*a]@ͩ0J$%FVmψ @ ?iw91JdWe0/}gy5]q/((<ۉis*̫㽖' w)QUwׯޫW/,X iD"_Rsn"w VtʙK];VU tmS)ճgO9O#d{+нM!dC*Rc0-(z-v=z 6r^*XMhVv_;q[y 4br/hCh?$꩸ݤqg]]qR `jXeXm(c ۜ6.\se1eFKMҩz饗jwteL.*aRGbٲez**IqLwʫSL7oĉ4( DvΜ9W_}5Ze\w2hG=U=;rY⎟})qUF鈻 RgVA2,71Uy8 Rm;ϦL2izTq()+eAA]?7 li~+婸m(i?i%wy}~~g(%1/O.w/y<wju>)Bܡ6:MVĽ5Tvs* >yʕϵ+*p7 YX^;wܼys^^lu^iZ0U H <7Zo~g {kNvoDNIKJJh&{{n BT發r Z^ݮ/VZ>X Z-ږ%Zŝ:`R7n8k֬Yf/gja@חNk6`ŵFTm ZLqgu~iQyd29h \Zŝ O]+DW^"}ԨQ 555͛1c3_WW:#+7#q%}dRSٯ,VH{EEECCðaXe]v-qgXHHmӦMJW’>2}),,d/“PܵfѺi͗0ZeB)**dowN.-VC# *ۗUYڻ6T'-ًu\Ge21*EqOtء=zЎ{*;v6m{{oӧO?Ck&ȶhs P/~B( IDAT544|ɐ9LVW6Ye*[VɽO)U]],⮝lN wya*pرc-[vW*ͩZpҔU1S__OgcQMO>*#e* [Ƿ(v !@~wOk,J &2w_;VȁfNqCtwF[wǝN_)|)Z_-ܲ`.VR(h`bOAݢVESYy3  klF SwW4-P@{ z'U2r >>%,46JܡJ؉{2p1^#$KJ+9:B8&SܱTv>zh„ .,/////_p1|/ W^^6I&-XSNVӧ'C666~wit[eL;u܉{CNxi&K/kUBh\.wTY~,҅*#;;O~u׭Yf֬Y ]]&ň䡮Ze\;]S+Β}kX--3]K_G˥dU)]*4rNY+XCҙݤ[wL$JuQxFح2|S!(3g\tȑ#(.{M;67(Z;`k%I+iz2|TL kjjwώukAm*z(DQ\P*/ @\x*.׽-AvRܵ*}w|}kO=Ui;K&V3gfΜ9+WLbȳnNE\WWt38ZevwU TxqQQva*sa577?KΪ='5)ZVmf̘q7[߿mN+MMMJK!IIQQZ]~83nᆋ.$IerWp*%SNŭN2b8*GL޽-K/aqϲ--*cQ!æ`8Y >8A?*// q]<bM(BܥMZ,Qe )h}qҝהccz_?XYWfR3:]qgޢ'ZNGnj re"'C{w}w֬YO@Y*/^̱ӨуA qT-[,I$Ha!iG-0ڄGިD]q[e$ i1:?X![Zn!0.&<.ɓ'Ϝ9=ZHͲG2j4ydxY. 4AYϥT N;:U&.`(⮭w$2tD& qܷnʚD޽[[[]|i]G}~OL2ncdWcX>}Z[[VTYsww핕bp=TA ITj!,*# ͩ%%%lEaYw|C9dȑTgݴjF7|;S__SOiݤwL"bHaam۔R=z0YeRw_kk!C$e"[l2fIqވ*'xbUU\sKJJ9yJUV1{ܡ⡼JWإ|G{Lܵ zDv7^կ~nk;{wpF7[e8E}W>2rs,ŝ2~!(?mgs߿V(,sTwS @Yxu q[0N8`q{~~>i(;[mwocߒ{nWTÕ555Æ {i>ؓ$:sXqO/V\9iҤʫz7x# 9o|DOPhFE+ZZZ(=, _?= ziN&zn^^^SS H$3Թx<.V)+c(d.2;>c [ZZ MMM8I% qSliiGgZZZ >cTII lvMVjM)75 Ͽ₎{!&O裏~*N$mmmA='|oٲuwyfZe賳_a~m ?r-/a***b3hԐ xxٺu0W_}p׮]0fSkV'}]z;e fϞ=ud2MHk_ZCCC߾}a Fгlx ok.Z$-ႂ;qѪsՅwp¥Kdݼy3桸E٣~X,o_B)sNi{{lYMٳGͣ>; e PWቀC9 @xv@B㧟~?ä́6ObO>D8x '_H{W̿Ivٜʼ IŽ-{ qKU_*lijjBFi놎W*k6o޼z B.*ETH!  7i A?n> V)U&//{9)Px^{]:FdGg9 _)y_ŝwy[Fh`QaXoSJ-^xÆ h`WAA /@NT /B VC: X^^>_+8 ]ZL&![oVg)VVVRz]]֤C9/++=z4jM#1fiN=;:Lx5СC0n8%l3zhμ[(~ԨQ𡠠`tfUWWuG`9 cx\9կ~?*X[[[YY< =z4CAADi)..OA } 8P2X ٹ}4x+D .0~g^pÆ 4}YY=VY3؁7ȄnbЫsf r _ Fs *0`uHɑ#G)..>S3*]5y>E:iii)=70ju^N |P!Wuuubىf]JTt:wT\wA'XmBahqjhx%EEEڒd3⎃/*++ϱo~Ba 3vذa+X^#-1Ex=Bkv!;mP~֘aC9l7ng>è?9CraÆ!q]hqq1M q/..*D"a))=z^Rn*&{ Le $2PGꫯk^{5ډPXuV=a$tw-V=z0v:,}J `xNU.p#H$HЅ*V86)V"` Nc :prѾL.ك*'f$UXTG 9u8ieI;3~ֲ9F6@X nnnɓ/"Z X UViܜ ]|:OW,Pn΃ٽRʘl-L3l9C9{Ԁ^wTa*DLA;%Lo(O;0N ˪*#-meeeAbItMY2`,1*s'qL=:.3&5|?pڴiJ*S]]t пBh%nMVc:t H}ԨQRUF ɲbV6K.ST;"@'ƞ\ H]2HvɎ{6fΖԲqϬUfƌ+V߬XNKbTcc#N<el:(H8H;qwor̘1 be!;B]A"פUK*,555 r'O'S*C >Ѝ}hí:wbڜ.O֑Rfғ{zi:ԽQIxqG(vY wdĝ~w426%\4>?'N>%_%{qq1ˉ=}A-뮻YFCY]]<7{ͣEE-OS 2u9FhieJą~EWa3ҵ J9VfN(&%u[~?K,ٺu֭[o_|Ψhӵ_<}'xb{}w,Yr뭷?p̉ĔIf_%\ꫯ^wu&8FwwŝEʓfSOxԩS7l_R+)iSq Rqg_Ӣ0)rs*+@?),:'qg~`N+ bU݉Vq 0튁ey*GfnUܕR/Bss)N#EqgĎs؜ Oyd2YUU%PVW^-"jd䲞RJ&lXq (aQqǣPq?&q=|+;LGt ujoM;cBH+-իW'3<V̪TܵwG]\Fe?X*)kUkCOwJ&L*SRRvkfҥJӧ?3n~… xK/ӦMkjj&ЮhYk U_~Ix<qfnvZ+ZGnRܡ٘2^m9B*ZL4#VY~㸏9l 'L?X슻zᨸ{d]ǡb#qw(킌Amذ!vmJ7(aa;*âPC iwHs޽1U~k4w%w軞駟:v]?\wv݋S)=]{IqwV4"~Ȑ!k֬)**z鯔Z;ޑ)xiF;̘& Byނ/nRܵB SvTl]Ǔ˒8sTܵQeO.Ye Kw [6;ζĝ\F0$#,VJH$ҧOqSF*8He_q,qWJUWW?䓦2iӦimjOB񳅸.O oߞ_PP@ RnkNlb͈6V R[[Rw-3NeeeccP& Ɓ4`XsKjnvĝmQڈc\IT= EfV:bVݶm[0sFUrkֈwC[V[jюfJ%KtIL ZJ. BI +J` ]SU=7VoA`ŝ ĝU`;<Xe`9 Rfn9!!۷OpbWY~HZiQMùUF+qi;{GrnDWq;o;}?fR*C=VLw|SvN(yZe9眣>Z)j2;e%%% /΢Ϛ5k)&v}\2aU}@@d$ZSun*߿0Tp[HnWX}vHTiJcJ *w-qL-LwJbIO>}ҵh`sE9չ-hse9**E ;-twav1%C immeKZ톴VG@"( չД&О?1)tW>w *&***vm.2uDad)}f3)taZK{fIqg~Xz3gIdq֒m ICVڎRQK{IE,FTi.袂~N4X9/ h!wH>dO{{;&e"JR$Drɗt64iҲe >~igW.;{"bk2~j[FzN`R9=6yܵ`mDz]w!>gWHą[wR8S}4 ݴDǏ; 6͙3G ^YYY[[ ޵%UFV3q+ZeUNӨ3A3(9s⮸k2wrݦX%2UCD"CmڴI)%Ŷ[p2Eŝ;;Γ`"H CKRAZٕ~2{V ppѣ}Ye܍~wimRfEqu$F؍)aʹUF˶ {[MY*Z3~\imɸqةR$ ̼I(%aSX rQ*t)lQX*]qe IDATWzLIe*#nx<D FP1V2Gܵ&rݻwWWW{*LF܉Vqg 7߼k.<]eXqVSj4`3"gWܕYDB#!|%V8T\`CYguYgܹb:Kŝ2C2c*V-슻ġ! xu}@!ۑHDUZe<wwxTJkfUXeS{qO슻;q.?w/;ۜ-ͩXeXLkwJAvŝx&=&@~~>9/ΨƉ'سgѣG?x$.VO͈;kɤVv0e"Bd{4`I)DbqGa8un*mVlq5j|(26Ye-r!tLWCE:qVSFK~m# "2xgϞ'_4kVX᩸(!؅Uea|֭Xe[R'ԭ}, ܇F{s8!"USqg{Ȑ!>_ŝ=]LJ*&ஸOqe]6c X;K~X6*;o<6JivLZLXeN@ڊĮ-TAIMI*_MMM?] ĻH*'۷_~+A{";nXǐ tTaӹF_x7pùֶb m*c_Z\)'(Vwhǎi)"f̘ hR&꨸1Yeh4ڣGaÆ!qLΆ=meȲ2.c#%=Vd*B$cŝԔ+]'#t".C]"_ѡ7RqWbm'Æ څ4& 8*v`CՏ5k֌1IZ(ٓmɊavp A֬Y裏*ADQXbv"!r_0ڈg͌FǏW)DVٚRW#@KqOFdNlٲ+’eZe>L/5k !3 ?U`ᖎ]V̖2 L`/q`EaOӴZLq77ͣG'q+~3ӥN_9nܸ>gU~{޽}Qqך2eO|G)!TgV{Kl?0LZhŠi5/z<w8&n&2ZmIyYeҨ^{{IqgF+wUਣRbK/f;=j 邩rcD0UFn SqM!{2.;- :x;5iȑ#G'}Y2vng"cǎ5>8%25#0ٱIYĹ5VʔO<[[[M+$ihžikvYI~czFV\ئ,Vt)*(7^s5k֬QJwqs|}=X[[[2u#{8Hw,\+P0G`V}]qV[kkʐe\]{e:JI(1س8sj!LwB 8-DS#LBi*/0.9G}t=??/ܵkR1WwKjKqω.2AP܁U2 Xr„ guKuʤK p]>kȲ'?ɗ_~ٯ_?d&~w_i{zwU+:RD"@ec\;vL6mܹ˗/WJ=ӧO_nO9{9< pxt H%Rq^#,hq|IܳМ`i\De0;%Ņ^tR=ppcʰ ➊lnLK/c7Eŝ&e')ZeLm$E>p@K*bv{wSեxsj<?CU]ZeXw?rr]<#L2`$U&^UUU[[kYSYQ3nRQܵ]{e>ÁdTׯ_϶Œ3_0x"(R(lK [PP~2$#%ƒM)0_ۯ[>$ _)` cp`)(?^zOF"CIIU^ֆsࢢ"*<W)SwAelA޴_~7olڴ%)_x3zꩵJ˗$@#G7(˭\]L!/ >SӾ}oo~S)5g=?O>SNUJ70z衬b/R'Nd[%`߾}͛7k,Ί"ĽjС!#-[ebXEEEyy*cCI*;˕)LWʰfbKһK/䒴0kK O9~j([ZSnn-XRV !SZe2[ԷQ]mcAA;(]ʾUtTU,$PqGL&/ȑ#aqVG͂ǝETt2k4Ҩ3=w #06N3g6G5ݥ:V i<wM|n_2̐ 7b(l A0>`K_ml* )wUK)W=zٝ(0.HܵmrS{R)*/h SDHtu.sz`X]Yqwm3 gXCO\:O< /yHܻ'Hܗ,Y"%E2oMޭpn0rgϞ uR7c`@*qwѱXl߾}/-[iU6;fTq>|x}}=,&i$Gx395mDi]O[eTKq RFQqUv0d;Ξ)ڟOH#qUۜ!0=~rjA*s )7_;C24B(}ގUsEXe^z饗^*ϡE{z222w@戻}i!x|߾}ڜj3T3XVV,(˖- pLӺܜe2@Ϟ=qln ,yܕR|AkkhbZimJ &_Gq]0a,htbnX,ںzj& Yޜ**Fv#N}̘1 &LH%W(2!BFJͩ4~}K:ٴʰS0VIܡ42 z6k&]H$#Y IDAT͛N_wK9y 8zd(-E</))ϳx8ʘg2˚'qD"vTDaa_dfk yH$2|0e%0q[u39ͩ=ɞ_Up 'pB2R+.OTjR>* L]ߑΥ󬯯"X8 ayyytE i'VX=XP#F$crLBDv6fpY2!cVT!LHU&)ˊLڒ_V =V3gΜ9b-dTAf*nb 8qĉg+(`h h4ntL'Ң(H^MCaa!aw,@Ǐ?t#FiF!KI*s*RIBI2ƍ[f}ݗ[[ ",oyg%Ŋz*X)Ɓg*5f6,tPhEEE iI]]1fsx &$ڸq#~=s{nX[C |ӌBFN6f*ݜJYro@6[FTܳfYPܻʚ_LW~4-. 'd WܻT/6R*//oΝ~ѣG͛7Rܻǝ_t?#, GŽmNMbt3Ȣ-qϭ@K#9"ŹT,ٲfRQQ8 ok׮L,eyq߸q5\fqw= 4t˗?cmmmdUv: qgB()ٕ{*-}x<߷o_78 r;e:5kH ^x~wL<ۜ=֞8q"OqLo셛Sӆ;vL6mܹ˗/WJ=ӧO_n;{QFi/qꪫo^VV8LoI]@d'x]trjwj vEEEmG\qiɌ:C믿d{@puZ߱c wP=Є .\X^^^^^pc9Hׯ_xq݉/\pҥ~EGqV` -UVdE\Q9@C=vMn`ꚐE{e+RRRR__?eʔ1]EKG.[1R_. E1w+B;UV3gfΜ9+WMMN=ݻ[erQ~SW~:[*mNk?|&0uMȢ V\Ѹ.[1zd2y%X۷5k'-wLWQ8Ze8#ut,8>ǎK3f믿8>O>ӦM馛| ;~;^\__a_ήD"QSSƁN%B f=D=n.q7!Tӆ[Ջ~ӻw`viկo/}SLYnr@. toޣG 6:#9CF{2?t.tv PG" 6lذm8+WN4ꫯ^x7CpΚ5 [RRD/^LX---'ҵ+UĮ }MaվR`=]O{Ν;1m+]姀~G9)<-O RyR@L,y@Ȉb)^:OQSSSSS\xqD9$l~6oLٴiSEEKRl޼=~_z[b۶mYmݦ"4R. .\kӛ ~ӟ*N<İb dQ@0G}4'׾zsrb UVJ71]JC9$-qŀcǎuE`SSqg9VJq*^;u;_E*#[eY]~KYepsjX1(fLX1* G{w-wލK!3VXAYbiկ_;޺26:`k ƍKo.㸻 C!B{GX]^|cǎ]dR>/l2 8 ӧO?~]]]޽?_?я?g&ܜM72~қ#0{N~ Q&B-.(A̎R%%%k׮}嗫yyV-…=بQ&Mo655?=3Z6ωVn|jF-716moC!"C+-xQGa@(^yV{twԍK!'45)6mڴiRIepOE`!+ie"q { DBowR<݉jte*!r7a ѕZer'nذ  ql"'Bdzp"l! (,,u.BpDoxy6g]_qx~K#3C!Š0y^4!EvpMdw. =oi 85C-Š0yܻrŠZQSÊ";!())ill]@A׏*"D "DqD"!B"DCHCd#FXlـr!"-k'7nٲeUUUٹ]d4>@EEq0oN +"kE1pyeF (=hqƬݫj޼y'pB,4aQ dQ=((@ED,guD"C" }Ν;O2e˖-o7mt/^xYp!B"DB.G?я^y啟ٳ9+R^| 7qHkqo]) ", 4(@E", DXai ¢螊U̙C3gʕ+yڕRv￟"D!BeK~coƌ믻Q2!B"D!r_$ f޽=zؽ{{C=4i$ϻk7((ҠK", 4aQP"Ğ={7{˳j͓'O^v]2Rj!Bٻ(ϲܷ^}ᑛ('dV_2-3gG<ԼIK) o<[K9oZ`]vw/}gy*1 `Pt&Mrrrvvv;III>|ڵk}||x>/jw^=&&Mlll.]CjjСCCBB4V#ũ#F e/ u!CZW+!B^IPXXأGS~DŽ-[ر#&&¢q2l޼yP?{lΜ9gΜ!_͍Y.Ci*0w@# w ;@#@phP4_'%%X[[[[[$'' " u̙3mmmk; = … Ǐwtt##c޽w]b-FXXݻw,X tCtBXXi-fϞ<|% \O""[UUU{4hPbbƍnnn{nn.ޢEM6ѵbKcn*++{g̘U- G ѣG[YYYYY=ZaxnUkI#""bرM6 z*{DQ+I̙3cƌF'N@'Nuآ8pm>}~7ZQ.]wizJ,‘z>@?phP4( wF;@#@phP4( wF;@#@phP4( wF;@#@ph4^'%%X[[[[[$'' Əhccy1Jjf "___L(JJJT;++رciii7n ޶mM/ @$-p׭[w={0K&LлwYf)W_}zj=66vر?f6H4ZǏO4dҤIaaa*lfvq'-޽ۣGݻ߻w?|߾}֭ d-i((@!CsQh*""ƍnnnnnnQQQgΜav6~$Gݻk׮^^^񑑑Vؿ!QPȁB D@rQPȁX{@-PCɓ' (@ (@riu&t+(@r`h{يcAm$!˗>1cFv:v8eʔH5>Ze7M,]jhcrȑaÆ̙3K.}Me(ܡx =~xܹϟfll4~9s$/,@B5ȁB DA!-@՘QDRZZg9;;3 ͛׾}{sssA8qy{M?iaaaaa޹= IDATBܹ3tP ?ԴUVK{c ={v0|VVV[7o˗/5^'VVV._UV&&&:tشiS/*))>}_]UUUZZ~g̮8;u/w<f111;1cFII OuGzB7A'  90 Qaudf9!d{g֎3fΜ9Ϟ=+++>~wȸr劝ݯ{&M\~?~~{yxk׮nٳ{Sо}rm텅 9^/#(r<,Xѣsεif6>;v\M8C-b,^xҥ&MԣG/ i_o{S`ffgbb±^z=y,J wѢEK.eK.zϵaÆYf_/_}ɓ'7TTL&;~8{.82hР{ٳ',,Lc!!!O>ئc:\r^kP~^p?z o+P+w}lz#%h Ac!zɄkiii ,:t(]~ъҥKM4sdffvvv׮]xG9;;tҏ 6'sNӦMwŋӧO6)عsKHHÇ_|YPPpyf͚~Yo߾v]pϟ>}:#(U|֗V\;apwkk/m>Tx}{o5EGGO0EFFF;wϙ klmm'O\XXƍ۷ooddԲe%KY cpUp\;a/x<0} uU*M>=33ĄO;}ŋnN@r` 904q K3Tꫯn߾-tC\y1 FGxbAA/9GqO 87@>WYYٵk>l„ B7 zA"##nN@pҥk׮qTzBr` 9hjwQCpjB7A'  90QPȁB DA!-@ՒnN@r` BZ K3qq*.N5 kkkkk뀀d6pmll<==;h{QQL&KLLLLLd~~~%%%*l흕uر7o۶M/E rQ0(@r!Gx[͛{aL0w޳fRv㯾j;vǏmƸǏO4dҤIaaa*lfj'k׎{ @"d~=zt޽{ ɓ]vUW;'dលkgg^boosrr֯_ƦA\\M ȁB DA ڵk1r` 9hM1f̘ˋC$ f_cǾ{|Q۸*xtaȁ Lh쯢!{رcDze޽cǎF*ԸWWW۠ {@M4 \kI4FK3ccc%={LKKSm㔔Ç]Ϗgpq*QF]tw^cbbnNϋS>bcctƩC _/_666@(B#F e/ Wa!CZWCK.v޽E[$<<\Fi._r+V\zuԩAB2dÆ k#o(ygΜ!Вm۶ r` 9h#={6gannnZBz@nn-w0ϹsN81|t511Qv.͕b/[QppppNIIi֬\.-,,rppi:J?/N]mgg׬Y3BA !X@(ܡQȁB 1GA'3֭522gϞh!%41lȁ((B7tEnN@r`9 ½< q!BZw !̒:B?~,XD ;Ç;2KڴiCy`m1P-??_&@!ch/;!$??YfYYY6MHb>$ؐQPA PC$"///++‚N)CIJJH$Z"<}T J@rbyju5OOϞ={޺u m V8Fv;Ԃ۷WX޺ukBHbbm7P Mnnn+`V QPA >cjsܹ{2[nB @a;hUw.P{3zj433())155UXkmm]XXgcc#HtzAnN@r`3Mv& :]<$jB DA!-@'1  90ųgHq2L"/yHԄBZ7(gta& ZЋvbq5!pE)))-ZԺy65(@QZZ!iӦϵ&Cp 9Pȁ!(RSS !͚5c/dy8QPA >"7߼xٳg Psݻwvڱcx7 @a:HОZ{* qp,..nD ;T4 9Pȁ!(JJJ,-----QК^ExH 90@#1@tҡCԵٳgAimc@K炤h{zz(@C@3!$##CKmEfrCQΎB̅Z!hpOJJ HNNVy[n͜9V"|5}$ttrCQU8ʈr` 9hf "___L(JJJTxĉNNN.]MGuM&@!kwv...D="<$jBZ`ѽoݺ3((tm۶͚5K޽wqE=Ǐ4i{ɤI1hmS)1f wу{kƵrqq122jڴi```|| 37Br`0 ZqgGd``ŋ 6Nr` 9hfo?dll\\\ldd,)//|UC6uZQF͝;ŋo_{5Ll[:;;gff@L 255mѢٳϟ5H$/qqqIث?պ {Q[w uU`=haDc4KS={W>11m۶-** =l.\߿ŋWR( ;T :9Pȁ!({kFA$SEuHp@ DA!-@ՒnN@r`* kF!wQQPA PCnݺ (UCejF!]T@rP 2P<Ƹ;T}(@!qyIIIQQ3DuHp@ DA!-p&-,,x>uϞ={i֭567`*,,,))177_dWFpB)q5(;T :9Pȁ!(h1LQx! 90;Tsuu :9Pȁ!(q5 ! 90;T :9Pȁ!(謎=FA wQBZ1TV5(zi:" P M≢Zۋ9$!C8RRRZh⒖4"hVzz:!EG9;;deeUVVj]P ;peodhhPYYaah(IR޾mꊂvҋgHz!\'%%X[[[[[$''[fΜikk+H4jԿ""33S.;::PWp#m@$DQPA ,܋|}}e2YbbbbbL&+))Qm':99]tI[6mJTP޺ugPP5((۶m5k ߽{W;? )6T@(B?~|ҤI%&M kƠ|"O^WpT"9$BZ d~=zt޽{ T$ttrC$Q{%Rwbq!Q/@r! \;;;{{o *֭M ȁB DgcS䐨r` 9h$g5cbbW*{]Ç ]==11QW=`=ZFYpvveLOOٳg67V6'-@#2hРӧO>x`wbmm]XXӤI5 0.hPa@x ;pjF! 90> \-H䎂b>U QPA >c@䲲_xѐ|7VZl… 6c@#x6^*i(DmSEg|AnN@r`}LB<=zHBZ%%% ((P>sArG!] QPA ~i&.N/CBBy5d?rĤD]htpq*h7AӦM0#$ PҬYJ|2>$C DA!-l^TT+e2_II Uտi4v/^Jڧz;R֭y={%&LݻYݸ]v`2 IDATwYݓ@={u-Z>"kkkSSӢ"1\yǏ4i{ɤITX] 04Br`qtJd(,--6mZZZ/F hp{n=Kw~=6+##Mǫ QȁB =3;B߿rtJA DA!-lលkgg^boo7n}z^>{˖-ջΝ;Bİ0///SS-Z̞=;88x|Xs:D>^9???..U=`ׯ&qWch~Y {\kI4Ff:;;Ʋ+HOOٳgZZ++BHFFF۶m[SY1A@ =" ȑ#|l3??~W=>$Bzq{LL {Illl.]TX]BP++))I&@!GsũbĈPP6VjWOvRn݄nN@r`qp?Ɲg...Ϟ=SmL hp6m˗W\bŊWN:ـ= {c~~~JOO///OHHXre˾[:ƫ<==аiӦj믿Ny f-ܭ"""nܸu 6^wޮ]{yyGFFd2:+))I.7o\*}(@~i&.NeDFFbVř3g}9>j(??ӧOD]QPȁRe+ w_~eԩ|Ν;վ͛dggkG@5Ye@7+G[j7k֬m۶pBH֭5oooB5B 3@!FBRQ 0}#QPA PC5WWW RQJ5L!,@r_S@JJJ,--5w񨻻{Ο?oj)t.NyQUUU6m4:[oE S wy!!cǎ}ÇBߏjEFF (( ݺuԩS5DK, qodRSSKJJn@VRRyM3T2sL Ǐ_|YPٝ;wZhaiiٲe˃ "Fѣm۶xw>}*tjCeT'TUU߹sGOPSxxx>}"""LMM ?>~Yvir?|w<طo_:!ۤIgggZ˖-5jTvv!C]tA DA!m75&p333BȤI***V^-H N8g{999... TUU=ϏҫW [襢}313&22RkO }+cǎ---1cΝ;mllRW_}d\>qĴ48|'˗/'4oȑ#nnnQQQ6luN:iMMMϟoll|5޽{Zk~@~/i&D,_parsskX9rd߾} dmmeBҥKm>'- !~mBB… -,,~wLzj\f4j(`߾}wV D"ٸq={"""j!B7A' J g͚Eڶm^5lذaÆ\R˭ҿCvuwY6< e˖=}?OYY_=`VP r` 9h *,,;w.!dժU57hӦ… >][JJJ :9P7ߤgƌ5׮ZJ"ϙlф^{M+ ''GӦM/^o$''eڡjQPA ~ϐrJOOK.ESNO>=tP@@@C@_0**[nn3f̘cǎ-Y7]]]taы/Fqڵ]^~^zݻfffZV!֭j'}嗄kjq_\>s̺vB'|B Ց 6w-|ݺu"Ʉn!888:uswYhr{ku?FW44[Mc #FԻeqqq&M!7ol3p+++{ӧO˅n^*H,,,96lٲ%!… Zk[]->}:СC>}*lXx1!믿!/**Ν;B***Ξ=q ]oW^9Uw6663۶m@6662eʩS^z%tCs6 wȰH$$N:ehhH@fbGG͛7WVVj]S9s!.>7qㆹNhhD"JT'UQQdm$N&OLM?rԱcsi \qFM>>/^PXn:ڙC8З^z?7}vBFV5kB^{Wܼy@!uٺu+!w!(--?U%rzk ߺ({O̵{jjjfUϧ_&oecǎ%ۏ?5j!D*B۾}{RR%HLLL>|Xƥ۶m_zRҥKj)SВ]&aM4vR;A)%EG+^UU+:*Qsx%.G?kuYCCCDg&xǏSȠ]Zj잗188x111UU̬rs͛7Q7oF`㣏>;w1cURNsoW\!XYYeee)ۼ?TF/0fayy9 lnn.J1yRTtxnޝ;w!ÇgU}Edd`ggײeݻ/\@m7 ]ӳ!::cygΜHKvBǃ}KB [l!1c_Q ;8~:=p mk׮Bڶm+tCL8_HGlڴ.nVZEϡ$3z=~zhqoii˦>}jժ7nR8={V*r_GT^^ޯ_?Bɓ"X>|0ةSq~C*Q:tNp1sҲeVeeeѱ^k֬7KLL;vرcyR!م B|}}oc &BϟTv9]ɘGGGBȑ#FzfSXr|4ɓ'; Iddȑ# ͛<ЮV= {{C+??lH.]"4mڴ޷~z{{kyh&7zO>!\"##iN(ӫWnr[oEשB;WC;)<==\ۣ̙3ǏdT*uss:tEON?ݨ)S4rAA=eZoI:LG|gcc͛7uLӁ^j'HjH`bbRZCc뗪N:E{О}lЫFAٺu[>;//*͛7w/22Rѩ믆JvJ婐v"tޝcRRXtڦ yňz7hժ!O?իWݧ>a„]v_5/IJJZhf bޛÃvH%Kp-oܸaccCTȋl\[FFFiꕝM_ٳgچ?Q#$$$00$00pÆ >Pd>>>ʵ:|!#66vٲe ڸqʽ5rβUsȟ8p <<ǎS@8;;+{ srrN:uḸ3g%=666G)(..xth'O3 Sm۶B ƆՊFQTTdee%HxH$?VSRR٠|ICzj=zDmHOv죃O R L&# b;q]{<ЁOƍhccc=ӻvbonٲe׮]95۷W l˗/KRCC۷oW񈢼^ ~Tz!>ٳ6{ =zzsAdZZZjZ:9IJJgN4{=|||5͢Tle EsAEEŋ5"qƩIpuBN 4booLI]|wߥ=U 7o'hѢg&&&hzT*דt9r-++~*̃L######tIGտүJ/__۴izƍŋ;4ו+WB&NʊZFG8;;+u˭{8qbͻ󤦦~ĉ,XpYh y[n(uVLjՊc\AAһwǏЍ}9T*JU^ZZڱcG'O$*jczw׮]EonDBYU0i$BHΝ;`!55Nxu-=p\½NNN ߳\\\}Rnܸ믫.M8FTTT1R>ھ}{hh(7,$^SZXX972[lmm|͑#Goߞ=m''EiK^e/ڑEPXQFI0nC !lٲCRf>cZg`8uꔱ1i^2̙3Jh;~:ҩS#G~ׯ7n}k猪ɓ'ׯ_ O]\\h#;vxZr!|J=ÃҵkZ6+*=ko!:tPvT=}`׮]M2DA###1ƞ(zA9aCٿͬSii)믿V>3vz|iF(addpظOvׯ3uy7o!ښzUUUddD"U p-//=fffS7 D2gΜO*.]:x`PP̙3GoL155۷?+V9s?GzzÇWZu#G4ӫX 6L+z;5gpABe7T ի▜,JMLL1339N7ijjz-U_bUrLL !I&:2^"RdcccCCCS?~x|gHұcرcΝ_~e׮]hlCCYf5|.ϟ?o߾ݺu۷oΝ_={l !"!H\IϠ+T]ȠJǾV8((ٳg||{VK:>^7n044JW\Q羙Y͓-ZMP#O>! |JLLH$*\mڵk+sT*5669vZ{3hH^ŋj+9#٫?屿*=)]EуoFoܪmRmx! d>^󫲯ΫMrrr݃ϹECCݻw+/[lVVV;w0`̙37mڴcǎ5kք8p`ǎsc&[d888L>U!...< {P-I=l߾]"XXXdddp!C]mx9`Cii)S܏ZI^x2b荾ݟ={݆۷o!1~'Bjk5kV͋/k'n>׮]c5R!Zļ ͛Fjժϟ+˗'NzCiiիRH$...2lܸqK,ٿBBBEEũSfΜIn߾Y񐔔D۴ijpׯ_7NT|rvUC7oQ7o泇p:H/do_l_ɁೇӧOFbMLLRGj;ºO?Щܘ$I{8t!UV/^تUfIᮋ n IDAT2̅}ΦW~gGzi '^}!d„ mt6mD?KXB2DFFFddѣGٳgݛy|wܹ|=G0`A-4= -Crrr~駠;w6ddÉc{\޺ukBjS^QFqlVPPХKB96L<<<_c CuBH۶m2uu֍3} jC<1!111t|HU ɓ' ԩ_|q۷o_x1666*****{f۷omۖbhh8w\6Љnjl;͚53r]Pɓ'FFFRg p\:v؆v<'y^RzNj߾}vf񼬹}MjB^M_J8jb*K.>JHH7o\H3>|8'W*""VݺuST !_jrrr\r5k̘1cҤIoǍ7iҤ'111 YN:Eb9_ ƎK9èQ7oޤ/y^p!#~޽[=q!֖G>M4Q;gϞ%<)11u%RYYIgҥ 4.^Kb[VVҥKe2L&ډ Ś5kX|3iӦh} hѣG4mO?զ>++'5 `ooyf!Ǐb6663˧!--͛g`%W:?ui sŊ}ΣN<^``1ݻws͛5,L!be={r;|pnnnvvŋ^rjZZ(I5jTI? ׾񑑑#F ӧl.] Y2RςQK捏=BHx߃ͳW 6LL *%$$ͭ_~QMMMzbRC@P#L94*))7(""B}2h:t0P-IӘxzzj9_J)nf̘Q|+P&Om6LfggeEƍTRRҴiS\'77݊կ_UlyyٳEDdggvZϣP(|M"SNyWK$88X)/Xe9sp̙35Nv1EոBε7nxSWϸz*E4iP\\h"eAD1f>o~r]yאiESߓ&M~e*Zjf/lFD-R9p;4&&=n߸q^[ny Fd?#4\޽{5cDokBXb8sSTT/a9L{ܮ댹ٳXӍ2񊧵kuV4n8˫n*ɞ?ސ 2SU5^&$$p,ix9@ggg˗Q *ghݺ$7oATP(|XXts74h+1cT_~Ϗĵ^zQ锣e0nGPD=zdkk$<WRxrsppԿ_=z0c',1zpKa]2??{x&''ԇzKKKk-J /'^tn޼`cc#\Ο?懆7kskNX*XQQ̙3wޕ+ϴ-mڵk=˘1cDmxevЁ5x6*Ѽ2QV_ÉRLHH{ׯ!iii}:8HdgguU 7];˷=5~]nn.8<`Ο?(Ɍ2+)kN}*Rf),,_yJK˗:T~={ez?3gjԨ L֔4 0VYYYwTTϛ4iҴiӆ oߞ+_eHÆ {1ժU111whbeܹɓ'gd2SUQq^jzmU_|1k֬ocǎΝc)\paڴiǎ|<+Tz˖-IIIDթS?Pe2ؼyСC۵kwya#*bd+RJJJF_3sQqq1%vʕVZMT^㶶z4hK`xb&M,va\ϟ?WӧO=+FTM2*D4nܸիW>|e۶m jٲիWZ4`O?K.Ѽt˪k 49sæM._LD%%%)S}z7oFW}Ν!!!J{۶mƍUe˖~tOEi߾3g={oX횦90 @DCD<ϟ?tb9EcI]eN:m}Mw0"qjdggr`A(!! ;ORRP) B(r`A(r}Pc&CD!@ 90 @ 9Tk>`D&7o>/r0m=33KFzT}ݹsgnns炃vz% S\.ozөJꫯj,K ;#QXSj`YLǽw7noٸqc߾}8XSю;:wg*θ8znݺ˗/E\J,7<<|]tQÇm۶lٲTӶ9rܹsϟj:,w[nmժKhhh|||LL j`1@`w0 TTTTTk'%%EDDGDD~Xײs0]=Jd➗orСC}||N8K: Kk׮O<ٳgOJJʊ+͛/{''myyyW^1c… Ν{'1R9|>LڢPr0aB\\޽{srr6lذaaDTlٲzZOD4yM6-[>>-)))j2Wy*N:Ni׮]AAA¯EVV;troݺSW߈UEADvvvj4hЍ7]V]^~eggjժ{* nݺ¯Vüy^z'''''' ,Ew-_%`zXu^.rqERI`)7kX[^s=z(..֖øq>3W߈UEѷo{.ѱFk׮MKKKKK[fM5yUE!W^QQŪrP(aOui=QnذAeڵZRK(]`?~ܿ~!44e1x֭[]h"s "##]' 7yy͚5܅2B_9{ԨQ_~9s].so'L`gggW_}uݻwgddddd޽ŋK.5w*ڼy>7>}ӧׯ>} jK aI7n[-Ç> 9r^zUиqvQ?[UjR?[Uɓ'^^^VC =*rц VűcǺuܹs۷[aƭG隌U_'l-qqq-Z0WyE:K)99__tixx.kB}iiif1sB IDATUp L^.`UQP:SYU-[k=QիW^^^VãGڷo/Ҿ}GVE׮]9Sz;.A!]d޻w7lܸo߾*H`a)kK, SkUQ8ydgA5, ;vܹ3lU9o?g~I&lׯg֫W(T|cƌ៭9C^hsSR4lpѢEkm…73wLKMRj۶mk=QsϞ=?>\vmݺu/k=9I7b=Qܹ3%%E.߻woѢE5kּpﵞJeAAAN6lɓ'O[FGVRܺuk=Է[U+V߻woff&q[r%ﵪ(x㍋/w;vܸq.(]ꊻRLHHׯ[~TZ6,)2s(92`5jծ];""$2|)[IQQQDݺu/>Jr`Ƀtttرx⥗^?eU9رC/{'_E͛7_|yIIxe`zN+ TV@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0y=)))""=""z,ŋ&Ldg1ʫ充%&&&&&qS :ĉFo}&%3ivٲe.\ؼyeȐ!!!!'N`O%PU}߾}Æ o6lXddt* cڊk[ڴisu=TeU}ڵδL///5jdddqNR׷oߝ;w;w.88k׮.]eҔrx\.wpp`O͋_}Uښ*Fc%S?v&-gFF%==]\˃u:F >}JJJV?zr`ȁ!RȁB)@7mW-[^|Y%..Ezө4§ V{qF7Wu:F;vܹ~x8znݺ˗/ETxnӄ?K.5jxmۖ-[v !Rȁ!BDJ!B!R-nnnG9w磢ԫTR*?ٳnڪU+vFRpHr`ȁ!RȁB)@TUmq@49rP) !B(5k,sCLw4HrJ֭] 3C 9B(e $*RPq;dڵsssׯ_TTKtkn7n\&M5k6jԨ#>L]%aܗ٪G,*o??h;;ݻPUޫWmFEEegg'&&~g.] 5w,jDet[ѣG6m*l7o޼yW2:jcΝ;={[xB6mҥK  /~B*v%,h#&&K..!!BW_VVV:u[TjǏ qrrjР5kĻ^vmGG۷ סCWWWWW:.LVRRp 8::6mtʕ^z_wuuY%/D}V&tɓ'ډF\kч~ְa3f<\x s sssg̘Rz=zw)s;˫f͚3gT*ǏQG}T\\,J⽓[2jD$$>޴={7.??_ث1#PG!P 9BJ(eӵk˗7>>f͚[n>sLÆ =ʻԩ3{=ɓ]NڲeKZZǏ7myYKDcǎOn߾wرF민Ν;˗/OIIIIIYt[^hȑ\x!xeME@@[W*k׮MHHxg͚%;}4 :iӦsΝ;>+3jOt)S"}~[T8;;gee9::J"33}wޥr>QF77GDbWyRxGtzovĉɓ'{xbaˉ'>Xi|gj]e$^۪Mܺuk\ .3g)j ǎ;v1W^yW] JDŽH]Xɧß~iDDWϞ=SRRxWƍMuk׮]^r[g"{xoFF'뫲Ν;ET"}~[T8995̟?YfμV8XƐ1c<|P]Z>;s=x@5;;[};,i|g՟Z%H:}޴޽{]\֦~6T̝;$5w\exqqq.!,,]'M={\.`ccSRRBD999B C);;[\XXXzu|ml5B.//IUPPRfH.ۋ"}~[T͚5S%ɓ'M6uuu}9Ve* QBBԩS8РA:ׯo߾yZb+񎨐~.B!]>{U)Kx[ui ˩gCZ+իfr P -addd5kLNN.Zji➔$\w!-HW{̘1_}ԩ#nv횰#33ϟ_tiFҸK~G$\'Hw/AmƤ_wr@Udt*c&NMd777[ne>^[~}'޲wޠ mӣG[l޼x"K^mLs{ڵk_ӧyyyիfIHHxSYeN8Smٲ̙33Y ۾}Oߊ'PI_jv_VZK.usrrnܸ_4hSRR?~W_®m۶5iyٝ;wf͚5vXaohhMoڼ7o~?~UeԺGUTTTTTdRT=Jt**JT'N9r[ǎ׮]+> 66_wsssvv֭Ç] o.ڽ{wppspppddKc5vqq3f̳g$4׫;d???{{{^xaҤIˆ{yyyxx9277W|+V׫Wo<9:zhDDD54i2s̬,K޴|ݻwwvv;vlZZ6=25kƚ Ztt`~!%B(et |iD98СCӧOt钹 bLJUVׯ_wrr:|˖-]"*+Ty{IO_ׯ_'ϟ/Y"Tt5tYf/>| edw& &O>5ww$&&ECD{ĉgϞ9sfȐ!.EGGѨQBBBy5\1|r P 9B0=ᖂ>`RRRԩ1iҤUV}ӧO7wq :u}†TQQHH**AvvP)  Bz*ZuZ!Rȁ$%%r`ȁ k׮QVٹnݺ<c!h 9B(!_JT6nnn666yyyD+?~СCݻw7w NpƍMr5jDD3kwwwww[:,ŋ&Ld&y%֭[DԼysaKÆ (!!le"2o=///,,,(((111111(((<<>>'NfYC 9p" Yq!BLϜ}-[v…͛7 [ 2qD]T::Bw6#Fذa/{'Ov988ٳ-@`}7l0aÆEFFqNp{&M-'L@D歸_vizө<w___ ZqoQFFFt*ɕ+W]J90@BnnǏ]\\ԩ#l*))yтC r P 9B0=L,rx0.tU9C^p? *:R_Eg8p5jH&wyxxQjj(r<r J `3B35̊"9_ [RSS۶mڟ Sʳ{g޽={=zhq'!5 r`ȁ,:*. 9B(!9+nnnG9w磢\]]8X*`%ҥP) ȢCо݂C r P 9B0= `UW2ѣGºvz13 ʰPyddd主ډۛ@C4@5r !!!6lFD.lt!BL]A X]v[۽{ʮ"GGG;;B 2`ZL%"{{{ww"ʂPPq"ɮ2T[w l 90@D;լYD-5]!B!C4HJJ2w*YnT܅wK AWȁB)@0R Vڳgϲ>|ƍׯ>|xŗ T0gϞyxxYk'wx=xׯ_S@C4b 90@W;@"Cr P 9B0=TA.]r`ȁ,4R&EDE@r `zZիWDQqeCmqGPq \b"T ȁ!>|H}U*!RȁHYYh_*}-2= B!CRXgg璒stt充`SIMM-**{xx**֎HL)0>Pq C 9%q.H&[^AJ!B;hr`ȁ,1kU&jy!9B(!*NwxX;KLΰx*yC 9%H3sW A?ȁB)@0O֠f͚驩-_|ʔ)&MZ|y <`Ϟ=KOOwrr>ݝ+\ wdׯ/ɤ^:`>'͐Cdq!h]q!BLwwwww@ +SchxIE@ 9Ņ/G׊7@r `z充%&&&&&q!{L-I֭]J90@I7@r `z:t={ٳCBB~=6d/ݻDԨQ#G;yo߾aÆ 6,22R wP~ڵ@6m\~] jժeoo_vS`ȁ!;999::ϟ[XzCJ!Bg={foo/l)**VZaaL6-88ӧvƚ!յSNɓN0wt-:MΪWUn]_!RȁJWܫW޸qBUT&MԱcǖ-[Ǐ3%҇~-$XeI[)*ӦMFw@8w^77]v_.nrݻwmllt},&0TܭӧOSRRxT7sc)0æMݨQsѢE].\viӦκ>+gΜ1AEB(!*FSRRcǎWa[ܦ޺ukL&^f;S`ȁ!^lĈp̙LsKG/^$ =FD„TVJ!Bq|瞞 48pȑ#[hQNӧWe\| e \rʕ5kٓTVs%%%YUax=77eMPq7B2e'|[n.]۾)))_u.]xQJEhqWިQի'''\VAT~7oV-VZeT^J2::ԩS=R*.DFFQDDxW_}ob+ a;n,_q>޾}{jjٳg[n}vUΠ܋]]&Dr0+ӦM۵k׍7>ӧb>m۶};u_VjUfbӧ۷`ر7oOva+Qr());w׻7W޽߁<==O8qŋ+>ȏ?.۷oOsKgd{8*#ˍY* ߐJ!pŽ;߿aÆ2o,'ٳ'IHHs/_6vqQ"ܹs{޼y .58{,U^=##Cظ|r"rvv޾}VRRR:u?vve,,ㅇ|'DoJ> sK^() ѣa֭D;\`9ߡC"ruu} ULWF>nݺzjGGǿ+88X  >V^m2( x-"jڴi{_x{{۷oه\222>MӧrգW_}EDƍ6N4飏>*((2dH%_رcK,ٶm!'Q*Ç?y򤟟_TTTQQgϞpÇcÆ >j֬ &ٳ'##ס?^eW^:ukDKJJ;wM:ոdNzh-sU"rss6T/^ mҤxiӈ?/-[h= j̽ 6$3fTlŝ[x QLrJ=NGD7n=OU!O:ӣ֯_OD (cHX~6662,&&35jիW>Ʌ _4*ӝ;wFmggnn wPڵkݻ:VZDti˓hccs%RoѴit*Ds}{zX Evh~!\/F[vm v[.^ؾ}{;;kޭ}Eo7xܳ[+/LDS9н_򁁁-FYYY\+((06m"z%%%gϞqCάT*… 9Ijj*20UݨQ̡CT/^ PСC^׷⻹J8t萳##urTC=wfU#/3~x=}]g)-.. o&"c߿ϧ_xooS\fddd\\ʐ.\HDcƌx'Ok`޽[UPN7Q ) ũzXr9^j^O^%tܙ٣o^vJD]vMOOߴiSFzaÆJQdkkkH/ ;;;oGz K,Q* )f'wԩa|/Ȑl^G2Րф >S(DTiRWٳgٸkfRU6rm{{{9ё~ws Lg ӧvÐ#*..;op{(OArss7npŒ <{LUrux K5QXx1[\}< 2jc_\[4iR搑5kjY2/}ÇxO?T~~~~<-EEED4qDʭT*J\ΓW޼yS}׮]DԥK-?QϞ=(Xǎ {L&sqqIOO-|+0k,"5ka֫G={.6k|r^xwbbN\,III O~wӧiU*_^=nZj2w nݺQF-Zhxֳ|rOn႟R(dׯdҥ*/KJJһ$\վ-UV+WWaa6'ኝ>a"o(Q<|U&I)Ν;Wa2g۷QXXNZr%/NO?ipLe/\^fM= A*k,cvv6ϭ$T[lѵ*>S/B "2dEPpǤH=?SdD}Q-رcu=ŋy*O[[ӧQ0u\m55@UK6iҤ;~$1,@qq1V9uݡRz*ϑ#jcUp_215g233}||hǎ*x='AuvAjS5jd ^H% @rԼ<]< D9ˆ҇OD4h Ri$##ƍqUn/4i̹s碢FË[jS'"kgdݺuDdcc܋׮]eqT2{_ZV1gayډ6?}Gm8!R&-[ؐ^?mmm.GK7˫\t{4ٳ/ꭷz*S-l CD_|񅲬r)/bNu_+޲om۶/^zӹjݟ>}jD[?%K+`b}w(U/۷e[A|||T#RRRjժB >M_-(..Ed/{V]*T*֭KDݓ>hCbŻwӇ'1r ĉ2Ic9 ?sLL&4mNꫯ8 E"uɣtCSPF\x P(|(Y-iݺυA iܹ?θ8B.YYYqqq˗//}ϐ7w7larOwܑ.wؤI2S)CVBTFDDp7n<|00|mr( ۶mҵ~<3f?~<666%%%??;vxe:th۶mW^yĖ>}fڵ\f _3dffrJ.Z _G]OuMnr޿e%>O4T^=eQ9_Uf.+cǎ "rNo+>+W;M)ȑ#˫+*M**vz*x''[ٻw/wW,469sX\AKΝ;̽bjՒ{o1W1wٲe:=ꫯKb' 4nܸ6mDDDO2eȑ}ԩܫW/___777W@D~~~kã(o iC z(hE W+ (H*D DE@  ED !$@ BH/$qvٖ~?pmffg2;s?sC_DԻwocLgoƍtUUU]v%E3`_n!?9 Ots"_bһ8(%%Ewjݺ:49Ub D=#uuWUUqَ;C:<[`c222ؾ}{gsܔ/''GPZ6BT z%6hN)1TERm### d<^t&L~P-[lk֬a;><<jB?? L~+~ӉԪnZp7 3Sy:eV8*曆`rU7xCʇw۷#""\e?Ν;?imwG{nӦ ǣݛ*Hk׮-:V;"&...ZY8GR?ڵO,))iںP*6j5 ]f^ %ɍ7ߐJdhɓ'I'V|5$T*R)zchحem8.\ r !!!%&H-.1=-[pΝ;-YZ"p CQ\Uv%svmĈ)ȋ"A *W###eFv͋-Ҫf7np1xm!//} #F0sy1)Z4@q .:t+ ޺u󋯼)J9c+&??/^v"R(f͒ґFR;dݷdeeqK/d 9h9.6y [nΝq0͢C+V4`ԩH"&m!+ {qug]]QOa(8J38+jlSvA)..8E7=M:R%f21h̙vgrQ_kGrжml?AR*"^|gJRсL!g0Kl͞!#G:J,_UUչsgφ{1z2z$w&:ualG 8KLRr T*UMM uyyJ#lϤR$35R q0]D! ͍3339;͛l* 5`+gϞ;wΟ?_1witDΝz"QoZv{zzn߾ FYҟx "z;w902<<9#Y2Euu5G(%''[߮m۶?87ƾt{۷oqFCs(`.]M|Q{yyFJ'/yIQD p|7 JYjF]/RÇQ=4[٭[7q*'njJ^YYO>[E:"ۨ5d(I%%%m68' `NNGFnEUUŋˠM>anMApj5p֭[eO>)~˿&kGhlڴɲIfµ,D ߻w?hDDԮ!r1P[n}/_.&{޽vLV 5={oʸ덾R.}W=:x`f/ZN{g? p-ҹB.yyy|Iq͚5aa᫯Sh)>;_iƍo^JtnaWǬHq2zdžn IZp@U`jBؓ*[Iskjj]\\؇QRR FJ%oժȑ#Mv?;vzW\-~Zn-NaK|@֭[@,¹⩓|};Vw?ܶmIKisy=+]Rn.>߈(88hf'xkw] $^HdwraG ~ڵk& ̾]ĉPTW\1zQ KJIw߄RM8GJ7vH X*..xY>DԡC.OzyJ|ƿJ)U дz+**8}xIeqPǎ͛7oժU\O>}KJnz-he 9Bf.|eeeqѻh}}}ƌnnn>>SLٴiӲe88^P(ݻKJ E˖-iU˅LI曋/NJJMș3g\\\<<JJ!S;^ 5d+++ynmf4FS^O?p@4^"##L*++ـЊi ؗaݺuޞ?tywymR^:/pษ<7n"֬Y#q2neQ*jϟg٪YKNbFJUSSj7n5LT8<mٲE{a*uDCA8{CJ. Z '&͆'N"_΀6+UUU*tr8k1zc52CZZWjժ_W" 7dw!0J*fvwĉ0iPݻwYޓ>6-Tݗ-[K6Nǎ彽W6lؠT*z)"ׯј@-^Q7QSG-~z/JMTKPyuR9w\>@< ¤JE(J^z?WUUqIO޽˷YK&%@3%6L^ *(}SUU%/mVlHߕx{d8[& XpgҰ;v S2O8AD111J%+y{|f ;"J% ˸رLJ}ծ֎\dHACCAQ^^nzS89W*k׮lj!\p1*l{{jj*EEE~] Md[ٕ.RRVx1JdT*9ZG&||@ɉcҝR才xN1GLJ+G6QBjjj8gT:\%::Zbqka"ԩp>X/ךzm'+"cFHyy97%^G[ w`mڵkDg2e `޽{?۷oTWWsR#GՅpxnuSTP*-֭ :sɓ'IBmLruu5{ٺ2E7o;wneUUUD)D?y򤛛⪆b2 #!tt?\\\4I"kL~2iEqƧV(Nzz:~GSO˿']}}=`O8!g:deehJ) p-i#_N6 (s^+..޽?PRRm...nnnt?Uddp6U4A]ߤRzFFqAx.CkHod#cǎV1~/X$6 /""sb&={?3Fw+eV'|m&$ϟ'P3G]&R_R-\&O,uuu|37׆*ys$C\H;((hs8|p-\]]5lX[l{ԵkW#ݻ(,,L@# >˹onIYCDDDի}ᒾzղ#Rܹs5;o߾CꫯL=aii)_R~V|$!N;gNgRTTIg5k髃o+"c&ū90: D$#UUU\ThqMzP*F.uo>I"xxxȨoaz%}sq^z‘0ose-C%\ "`Μ9ؽoqJn({d>ŲL:#GpŐ!CerWWW* CeEQ*%RV$/.K< |P\TvQQBigDEEʕ+{!BOnRX^=h e,((puu7߰/̏6 w1l`s_@y?͞=ۤPz{t$fyÆ suu]d" ΗVFۻw/ի ŭ[pHǒڰI:iii<<Yc@ęIuu5p1SN2۵kGDšbj׮e nz9-500G єpp‚ 20geTC~u'sD9r嚍.\pqq]!6`]/Y~ʓMC#Gp*S̛͛7}݊ OU__ρZ^ԗ,u񣶴Tk״5$,>)**boZb`Ud[ha#/^3 z*+**@1^.m Ԍ[t8M<¦N*ox?!77{'$$ps_\7mv!.. + GW*&)7/͛7) nW*b;QnLMU*>зoߌ\[Ȱ"8:TJݵZǏ牐it`'=Ihrrr|Hs&J3g* BFEX&זYv#ŋa*=ٳż"h| %%%pQuؾ};/ys,]05/qX)l`8KCCB0_^Exڵk98u=jJ􋁃===ӿ[B!p;w:vHo =waT.i&oejMRvҥ͐/_CO:P(<<<6l7Nw-ݻfUo1yyy:tHw/BCC->yؾ};I+>#.Fl1h. FsIǸ8y{.sEnnnK0;w< ֶm[7w:'|ڴiIz*Gu:P-SͶm۸-GYZ ^ u!<==}||ljmD\\R?~<=\P;vO?XyN _'лwСDoZ-H~~>OtS -rw*B1y .hl}A/Q_a}}= w`3]Rs EEEwNK:ISSSE4eAwi3xv+;1#^\ O},'#dӦM-[|%VNUU;ZnZ*ʦ@aa!2e Sy{{(jx<a׍.[j#Oug˜6*#dN6JwR3LuL0\M˗:}RJ7nhRR]$yWF/ ;v, A:0i{Mz?ģƹ|ު**55,wI뵡-**qeYܹ#Gl555sqss9r;ͺu&,p!KiPjG̎pJMotj*7nܘ:uj.]2)[֫ϕa(r Gq w`cRp??Y=<<̙ 4;:0MPB^亖49sL}bp)EL4ċ;v:ϟOD7mVʢ"/FPSSETcbb8+==S-^Jpay)J)/˧Nj`JUYYI=z}  >4S]FD...Z}p<^xKehB!0>Lj 8qBkWUU:#dffrK!Ç'uۙ2n*999;w@s:m4~.q'|rb#_޵kW-[ݻ_~}׮]G`Me|||.\@cccǎN0zC-\35 HxX.]2$t`z:~̙3yk[MV[RTTD&zܹҥː!C*++K(wׯwԉ+5p1DP :~W=<<]݁Epuu}饗(!!A?|w60܁' t @DDwHѰdBtҴ4"*)) 4\ 8nnnW{nFFƣ>{c0gΜ6mjfիJO?mM"W0~u"T\gȑ?|MMO}ZS(fͪ߿ɓ۴i#w`Jĉw7n޽ZUHNv#%%Ch@:D "_~uuuw.[ٳ^kV;.j9..._U lٲ;wڲ=?r5꣏>j׮٫/;"((XJJVMM{MM |FGz+++GW]]-`s2Z1)=++KREFFjXŁ/۷Mdl^ǤYYYDԾ}{ 2ep˔)S/`sspx5)@:D "K4ܳk5ܯ\һwo^zedd8؜L۶mCCC'M) 9#ЁhGIDATq*㨆;.jAc]ý,((H%88T%c޽޽{Æ _~-ŸHqFq$23""b޼y .F>A.]*//)%|]^^~%pg㞖& Ω1ܛηpg}iӦ5jXZp|6mڤ '//OWN:UVVF?S^^%@>?PJ]^v-##{6@A t y-}E1=zv٫wPG@DDmRU۷oQDDuesp1DP"Xʌ3&11Q%11qر26g.v4hCh@:D "={JON-))8"u 3f>}zʕeeeeee+V8{5k6go\\ܞ={o޼re˖;VHONew;2SLk&''FEEEEE?ѣ>>>26gŋwx{{2$333%%%&&ƪ6܅\`=<0! ޽k;wQhh wr $2G=,,c;0C3@.]$ΆC&b :D>0܁"##=&t`A""𨮮?؁="2 B6m BBB S__P(jkk]]]m9< *!%Z&??_TiV; w2b;p )))B:0Ё Ebւ@A t `}`#@"p@A t `}` w%0;Wc"Z"*//9ұ w\ @;0@DdJ{~~>m61" w2A9H%0ĨT* E6ml8.pL`#G:ЁH-Qý!88v!" w`l{I@"593Q A5Ё QT*{P@0HnnnxxxXX؝;w9r#Gl<63 q "B;XdQ]]][[Ǯ 6;0)0ЁH ="b@;ӭ[WfffvUwɓo߾m۶)S~l`)"qG X2`K`#\tCh@:D "R<lb :D>0܁"##=&t`A" bnڦ!" w`{I@"QYY1yyy*m۶6 @A t `}lgggO0o„ 999ߛ6gΜBaoNIpp0v8(4+++GW]]-`4ܯ\һwo^zedd8ؤS*w%4ʂ[KKKelҩX P]s0F`|93Ё"MD6@A t `}i&''FEEEEE?ѣ>>>26z*a R ~@DgBCCI]]í[ <"}?}3W+_`NӳgO{I@,Z㎋ @$JZ7oQ2$pH`0 2\Ľs8"0܁}@Dgt= Cv @A t `}`H 4`TTT{{{WUU7ntܹ]vT8!Ѐ CײejM%';sъquɞc;0¥K=&t`A"ǰNΔ @pFp2 t @D:"tڕ^oDԽ{wb :D>0܁=&t`A"Apr 1" wҭ[7"$;wxzz:|-H10pPTݺusuuf t`A"!,,ϯ @hKNN޻w={v駟4`Ф>|8;vرcD4j({ xŀ$rԩGFFfee{D`qvj t`A"'Blllhhhyy9=S@A t `}Qw΅ yݻ?~`=0$N8ѹsp{ wb܁U@ @A t `}`#dgg{M@D@jAP1*L2850hpF@3:0Ё A5Ё @ [ ĸ@; B:0Ё A5Ё @Xݣ=#GѨQ>v;X|oZZڦMvQ^^ )_wj"DP"4W{ee#bbbbbb⪫elT'O 9uꔡe)Vź5k/۷olyg;w\S~*ySL " t @DA t :DP\=2ep˔)S/`Na]ʕ+{nիWFFM:^ڶm:iҤLoXp/++ n .--qIeرww^jjjlla~W_&uuu-uuu-ZqSIRׯnjf0jd͂C\d700M6%%%Zs t*?~F UGGG_xQxLzzz=]`N%e]n1c[ǎ+`Ne]v 4H{=-y޽޽{O>^ oٲŋ>>>u.6ztjgŽ }Ν;׬Y?X`AqMNNNMM:ѣGuMm)=Bk"Zx;xoo!Cdffj4`];"pf w0hp] &M0!''# iiis T".Htɧ~uopΞ=;}:h",,lȑ{ "hߥKAID "RvhOOx ))Itн E-48Dظnݺz( ?&&fݺuD#G 8+((h½,%dn#FdeeeeeUWW{\g!!!N%.#I4lذo6//oڵ 6muΝۧOÇWVV^|__|/$"QT>ҥKJ՟lw*̙wUTTl۶m۶m]NJ5k|qjkkyc`%cdYt'M$2iҤ?^׃$kT*5^xSN?G-~~"^zɪ?4G󈐜|?(?1^ע,QUUU-4:YYYDpBn***Ti8"0qÇ<:ٿ4:[5CBBUTT$RXX8rH~$"XX2U nk۶ctEqX={htB޽{ĉ曼ũDٳ3gOOyt 6mڸmo<"DEEٳgС^^^-[KIIu >믿<"$$$ɓ'N]luÈ`YcTY`ݽNNu𭡠`ǎW\YbGdkʕE{ vfC 􌈈7o^BB… =([T*WZ5u֭[nzڴi%K=.ϙ3|AZZھ}JKKKKKۗ{\6%!!W_MLL,.....޺u \\`LY at{=8ɲ۷o~l:hHNNn׮v:ut-rP-}||жm[ooo~<:0EEEAAA%%%#B;&rر:kÇ4hPRR`YcTY0I2Httŋ[{aqLv9B~B~<"ܸq}Z5/G-T0*!::Z|lܸkPPppΝ~Xsv \YYY]]?`<"ha7U3fLbbpKbbرc5 .#ITXX㏿#F<:hqnݺkAĿBΤv4hvƍw!ᖃkс7lCk/;w]vytb3fN+9_dY, 8':tXbG-_SNѽEp$sNC{DG}o-((}_|~!$"EpF{?cŊZ_xRjjjm۶-['''^ARرcԨQ۝GkFEE}weee駟^aiiiuuu7nܘ9sٳ5DK]7ok: 3:qF""ipǏ:a„g puv=:n8'O)<D`rss'M1`ѡ_~ԻyDصkW뗔$$:|=zhѢEn>F^zƒI( t@;4` @3;4` @3;4` @3[;9IENDB`gsl-2.6/doc/images/histogram.png0000644016036000116100000002243613373111455013615 00000000000000PNG  IHDRKbKGD IDATxl[qvliLf6XPUXG2ibkn,-jUӴ桵B% hJNj4)(Ԟ`8QHGsv|9ޛok~z;77b`" `$ @ `$ @ `$ @'vڵzj[3g\{LLLDQd@[]رc%۶mc=f833 2L& B5}׻{{{Oڞyݩ zhhh袋.*!577緜={q~Gǣj%fA.5񼨩GjCon:ښJǧ閖 [ tvv& DKd!sE;wx<HRuuu ,5ɹw e6뇇GFF@ Z2}p#,5Mw`I0Lv (Sv (itxз84Z!fe̓L&eIX,IXh@0N0 @+0q,˒]0O8]&a8&a `8,@Sƀa H@a P0Z!fe̓L&eIX,IXh@0 q*a1`C@+0q,˒]0O8]&a8&a `8,@Sƀa H@a P1'Nڵk^`+r]wYK/ݰaѣG F>Eɚhk#K}oݺuڵǎ[kƍѣGO>3̴BL&dBPGGl+4677GCp o~'x"t:}w_c___2`{"~u.t O>3v5؛̖eb1XlppP\} ZdRvE΂~嗯Ƃqu#bxrܗtM[V\yܹ+V䏹pªUΟ?̱X 44iA;6mzLbxMN^</%=;SN}կ~aܜN[Μ9sן>}LSp;U >wl[o-H_ښJ[tKK# {-< vvv& D"%:ڂB?OOO;wz< RJ0sS >p]0s=ᑑ@ FGGL_,Kv 2@#eP>"F"ysS ,@0N0 h1`@+0qTÀZ<ƀc H@f 100`d2i#€:`^ 0IX[xaZ!B ta W}s1 \P cjlnneΒg!cYyy~x.]-\IOp R~1  8谄 q4 k]gcɅ8WxsXH@a P4 540 V`$ dY% $I%`BLaZ!B ta ) 8a @HA@M0\,bY%Q0p8,,e4| `nn΀qXPAĉvZzuўD4|>/NNN@^b};v.B[]رc w̴BL&dBPGGl9{T48׊[|W___2т4X 0`˲dee@ .]wIy>Sg!%($oL肅8 -hU.@Q)1\ J%0HPN1jkwq5L >L@ g9\!dY% $I%` J MLBhYЀD̼cU"r40Wх8]n~E0< \1Gj.(3B_Y-hAZv_"X%y: Î@9dZGh;tf#@0Nх8G?Ԥr p']+D dZ.W,0Fe[\=R+l Ab(ιW&wH@ l6+QG# q (D|d2C, q"@  8w>5z q"  q o߾p8zK/4 ۷?011F}>F"zb(ʲ,Y Oh/B__d__o~~L{{{(d2L& uttΊCaY O4ϗN׭[o}/L:t(w˖-ׯ߽{w2YjrT)&a4u%,Oz˲b}W,Qb w}_W^y;8wll, ڏokkY!b6G}ɓ_W[n755r9&`!@B|'N9r$r#G8qwgǗf`IWZʲc%ʉEĹG:᪫W{}뭷<Osss:nnn=s_ҧeZlJ1 $SNp -7péSnmmMRtE\}"4?|}s?wvv& D"%>  @B۶m,ߟ:zmx۷o;55555gϞǏwww0CcrW\G(Ç{{{x /~;{~x`hhtttxP(d2L(蘝\! X'?ԩSe1=p zzzwY$=T ?b{-ˊb-XlpphЀ633q|3_׎;;66 Ƿ+04  3gw}w2[oo櫯:wjj~|SSS.Y!b O>䗿w5k֬Y{}'y[L<_aȋEĹG\~?.{oݺuΝx$K00`˲d4`p8,лFe!"@09 q*#fApJNY̱Bq X8^80i|̙k#411F}>F409<77m۶{̾qff= e2L& :::fggT(^`r{o

>.:dRv N>෾ 6,555hԔD".؅8ƞ}Y ?C/E]TtoCCCٳg -&/fƈ=Q# 7|sݺuT~|:nii)sb0:,,NjFs(4?tvv& DKd XPBKQn߾^ۻwԞ={?-.xwKv-ЁB\__?<<<22P]]jH׭[wY,Kv d04SO͟ òKR zau]hACKX/- `h#ejXcI _K ȋ Da!@:z}0TG`8* 2,ƻ|PkДx@fAC)}3ufK0D@ed2)0`H$"aB%EWؠo JÉb'\hC'0 q* BP+.!S kCEhMj_1J]}?n޼~͛~%O+o!gA>r%~Usg$άΙUj ~'kd,+ُbs0WsBY2'a]w]ccc`~@[[\ 2 +2 eI \.SOLMM566ڏijjrK409;lڴ瞻馛jr…Sv^o<1CZjYn,QB:u_>z7۷744={x1EǷ ڢhiaVovwux(qEp6[{{{;:: vR)t:":lVv {-< vvv& D"%:jXx5d2)Hdg`B[nOzmݻ}^{m޽SSSSSS{9~xww sFDd Ůk@hsO###@  Չ1~Znݑ#G(_o;2mHqX(:UqXP4b!qrwJ`!eqr Dz,%mpk/nW 7RHze֠B rmxe0B t`>O^B%t`ڭnu#exN@Y͂V jɲ,%J{A_pB8] g0]]ZК5{5 8jX6N(%N `eb!@p-I(7P)‫Y7CBO'b+!`$~WQIDATd y*0001`@00 p;feTCD0N2]3XLHDv `Z=B `8,SPOx^LVOLLDQPK@q<5jy1B<33 2L& B lذg]P[[bࠬzpB<66 [es ੩F\.'Ugƕ+W;wnŊ-.\XjK"K=PP*} \9ٳEʤP 5Jٷ閖Y3Hط$.Yƀ`wwΝ;=RT]]1뇇GFF@ "}ZRs(t 9`$ @ `$pG8qb׮]W. h|h4:99Y^Ԗw^ ,"dE;x֭k׮=v]333P(d2P(1;;[^8a\gA5_T -b\ea7ooټyO?]^\Wυ xE5#w%X[b`9{!υ x܂gJFxll, ڷNg?bŊ/|oF~;υ xTEqFxjjѾ)˕5u鑑oqƍ'Os~QsqMJ{/W^yO}'?GUjb8n={6_{ફڳgO.r/ꙙr>|?o֞={.d29B< ._߷~{}}}}}o^ЦM.+b֭o ,(:dEwq0nD  0H@  0H@  0_"e/IENDB`gsl-2.6/doc/images/histogram2d.png0000644016036000116100000003711513373111455014043 00000000000000PNG  IHDRKbKGD IDATxy|TsgJBń] hkD(E0.+~\?Fʧ?Q@?h? 1nY\X"$$$#Yg?.\.3B&w2z59sgNwι+ɲ,@2b `t@@0:  `t@@0:  `t@tV533s„ >?W ƍ ^6 Gktgs`,˲|K644=zIwiu)w[%BEAXI=71K~W]w|s>]m2'B =}r!=!@c.[x˕/Ռihhx߫W뮻R+V---w_fffЙ7{NHH4iҾ}ԷzR?>!!!!!a6m>Vuذa=\~+g0Z J;|=ee)))wiO;vw]RR|AZ !>qlݻwҤI {?~sss w}j|#Gnݺ5C|~%<دδi/^\VVrjkkKJJ~_!]wo:u*pBnmʕ+Wqkc=ܳdɒ>4hл u+!ĝw޹f͚~˖-;_~Zghdee G9s7[}|<~/_~m[ό3^yk֬+C=w*!z1FkOjKKK\\_DmޏbUB]kݴiW\UkTjʲ}mɶm. 'AVoꩧ/7nx7*̙ ֎~lөp86m衿SۈY0"]kR7n޼y?C{#8rHkՄxWq~hU{.:z򬬬ZWWx6wZ#U+!DEEZ~ԩ 쓖G}tqqqr\R}kŊGnsߩfm,?2d_ÇO:f]|wyƍ}>_kB\'hiiѾl2ZۛmO[Vá}pXVmm[?wbCE{J(ipA_k׮FY[ZZBb53 [F1G{/##Amn;،E#ҵ'';wn:㫯_2vػᄏ9b 1NII~vn|Q8DU BU{:M-ig_;V޽{?~lUUUUUճ>+o2dG}t?smcm߾=55UY\]]믧}iл a}%:5'Yf͞=ĉ˖-կ~ۯ_W^yɓ7oVA}7g5kVk9~dYzÆ ݻAyߩ`D:EŒqW-fQ3fHOOlC y衇~GwygСF1DfOcc_ښV:tl0`>\۞cmذaرqqqqqqcǎ-..zn59|Vzn.|]%ߒsm~4~";4|{FuZ.JN'(K{.W"(3ySu磧^5Wyϒ`)=bJLOJ0' vlYGOGo۬sm!q!6lm27P0 !⬆qkuٳhe^Z{QYK)7xQʻoTkr>!"S. GJ_*;Vw|d0t=핻W񶖩AoM߁N!%YluWB ^:z r6O)pLkm*;]W;ݲj%C?M }{vyu^H7J+5hQWteUC꣌ͦpݵ@@70ś6(%Va`_ˑPWmw0t+^D: Yڼ閍!w^:ВhlJ&zuMjrw'A9 Z;#ko.[wzlliO^)XL҃>x3ek&5nh!sc$ YWreYR/"3,Naoܟ^ޗMB$rWy~}emZ̒}μzŰjL5vw_u0t_gf[ so-\7OK~riꍵl"y6֪e.:rŴ밾pʲPWyom,njfu%sU^.OQ%[Y ]pz9ܦ#reS6OFBkvlxYQ>WzdSom}Ynnqbz2*IlVos=q{zN\+*uC!2&em::EXГ(cney6zOא$IyZ &)I|@vVM+Ncbn` {Z[6Ľ7O3k-;rUI)箍Ҟ]"/}Zڋ3 LG@XYu皕KYB,/mBX̒2M}z:j[qyBg|##`[bi\e:MeC(%d+\"]LBbwFVڻS{FСTx,2GV:\r?",th UBI =W(V$$tVt8u[`.:|0t6@6饷.l1K tTQu@:jX0%EGot u:T\ul {_~ǮoZzsWG*Ql$iߚhFzmwP?ҷ铠еk[{ `1QJ;}XLo'v ZK E.^ $f:eֶ zJ 5zs!)RОەbh]L2  V- _Rt8 @T! `t@@0:  `t@@0:  `t@@0: AѣGg̘}ƍՒS$)QsSlٲ]vmذnÆ vZ|y{),, s0h":,--TKF]YYXyk֬|w}ÇC0 ٳG[RZZ:bĈ;6fmɘ1c;p~"4'O\TT-)**2eJ]tΝ;%;v0`@7o'|tRn۟x>lܹjE㎒noܸ;Xx ]"$hYYŋl"_reVVߤ/_7!?a̙ms—1@0 [@t# `t@@0:  `t@@0:  `t@@0:  `t@@0:  `t@@0:  `t@@0:  `t@@0:  `t|3f$'''''Ϙ1"DeϷjժ6ruu[; Ɖ'啗777Vof}}ꫯvgk(IeĊ+vܹvZdΜ9ƍ[pa`%%%=$ED%EKJJ %A+ ﺥ]t }5J[? &'%%]{۷ofIv=--M[^WWrUUo~;Sófͺ曷m--3"4;=SwuWFFFFFwO>V 0MD #F*Ljѕ_[-njj }aBEX999{і1(Lɓ%EEESL Zyڴio䭷;vl9؆QF͝;wB~͚5{IHHP*hG~~o~oQ[oׯkB)h@h17u/"+++++/ܲe~l6?Æ _xuֵ(F@0:  `t@@0:  `t@@0:  ` ُ?xuuu7voڴl;v6$YS^z{}͜9bq&I~^oqqU8p=߿8=`@h #f+((XlYrrr8n0 %E.C:yO<1p;v; Gb {>3?OhѢn_xMMMld00YcӦM+WoϟwߥkMMMmnnGbm׿6N랅0 Z5`@h t @0:  `t@@0:  `t@@0:  `t|3f$'''''Ϙ1=[UUU :Tp78qļ򼼼[ɲ|wMJנ~DW}j}%,33Rz~0cݬx߾}=\' ^G),,hw1BjIUUѣ++++2d˖-YYYj #`i3\Eɹm5-?Ӥ|9ڔCvlYV8ݲjA03"={hKJKKGC% !I{}W޵?z?8%SKio.}ZM_!DZQbHB)ϛb"HM4N*Y)t*W|L=Wɓ%EEESL ZYvG[y|]9zm埑+HM4.SNOZ3%l\s#>Dut*ezx޼yFZt?g}E1B;z֣tVy&\F8!3w-BK.& }-Vt˒$dt3ۗ !4JWMzq푭fû_4Ȳxwܛ.`]2Jxk Dh'%%mݺu[lIHHл]>el*$QI} 3~W r4wRjSNO6>V{Vȧl\+]T8>ߢhͿm}RJBdggoذwC,u-, m !Y+ !\nQVrP=e]nfdY|IgURĩQ8)ޠ+q@'Z N_| <+Τiv_2&BHHK2&'m㬆D2 [Uxu5(`DeMIDAT%,_^$X)-Q,9-EsOjQ9P^۬}-)ƛJVeQYo-ѻ3 r<19ݲ.u˫RIV:uBWO379|:MW\3eʢe%^Fՠ|%}+j_hէGD*F] eoX=s5(;^]\<İboZę3C,orzbbDUI_ݘu7H\% NM{A/}OCUI/ntfTkrl%^u(tˇ;_|64FUs/|f:ޓz@i8Z.ob5Cœj\ӛX,Ҕ+Ty,v|Vtm&;MM[ُ$ je=c:@8{_6j+\>VzpZzJq5}.3")!.lNM4^![ݏw_C# iINLI4o[u^B,%|)UjRI>BY4.I{fWn$breR wE# B7gNWioJeo8KYq#ݸ3&)nWɧA}(]9j!Ĕ+x @0Z_<+/a2_urW״rݑSs-8P ʘxQAˇܜ^WtohW7&aY2sAMFީo7n;}v8jGYo=]6} p'e#L&㑅|qo=.Fp#:59|_q49| m֖UreYJYU-(o8G$YB͒ 3nլv*WRDrc,FBIJ$$cMi}mCEV=,;̳zO+uk1KhhK[͆_[~wrڴ lzVd\@QH=Zj@_,y׮\tG*]<{vr\4vG򓤊nN|-}&Ii<0Pv_HJ%IS諭,l VAȲ_h[nk =$Ҧ߷\8B!?I#A#Bι, QRl|~UV!'ۦ45٧KȲʲPVciA(s]JJ1';H8.ḭx~uBnBU'qZeAubf :Z>زvkz!YչeE~LR͠>OUCFZ}OG+DRjjO!5)*Y—E@Rn!N}y '#9] vCeoT}ӑh4$IaP?ˡ.KZ돿nR= 2b~m{6lV䟌L-Y;}#jNyn`s! BʪiYzSk+.z:t߭(smo}Vƪ$)~3Ϭml02$%}fi2v}eAI)0-(w !DçƢ$~zzJeRj6$}p)n2J +if%IBum ek.jhPvMiVtVh,&I}hReWZßD}ez_KW7xWmԦp{r?H{ZGMק.`\dBԜyC)P+sK.Ӭ>Y/!zN6 @m]gg[>OO 79|mRo`À+< ݍMKo}bL5tIPjɇnCD#hV:il1KnJmj8]mM&x{fokQ+udYRN+#!q]L0zw*ՐmKI4>[ۊ5}'&\{y6S XKˇ%%լx{z Mesv96 oym<FIM4$IhƸqVrVѦb|%,IϥfyC⮸8^{\>,mIy͵I~R *HP4>i%VBL2ҁ6~ǵ7xv,% BѫJM4*N)+⬆XCGgY.x(!! VGjjAm\ekS {9}6bM"*0:  `t@@0:  `t@@0:  `t@@0: AѣGg̘}<$ED%EKJJ %A+/[LM_!Đ!CBW Lz7 }5J[l;92<;\ϒ`3!jNy>劋2zw:8^lL7^rUqSqEVeVգsl6%n;11tްz64go>m*~^ORKh1KB.,0-&iem 6j;_4ZwN[6_~uYKݿ3z]钭遙n_RDhu.O81sk=GN\k=#i/D[nQy=o:͍ᓅFqlrɧ~uLF1rڄ{APA8Z4#:ɺXaaᣏ> Ljѕmrرn駟oQzFu5Nw3-YB8Я'r?x)|E5ysrrr٣-)--1bDk?>iҤ˗?} &\U{k-}N"}-&ÆO !P"4'O\TT-)**2eJ7pß'vK'> OۥchBI6<+ʪ:0+5"4͛',]n'x>;wZA{nXdɍ7ިGK ҅C `ۿٯl I&x*\UMVߎ^III[n/-[$$?K{nM:׏?m5l\ 2I_ ڕn8hI) :|bzĂCǝ/lk3 3SM'p{^%3$/$O^s]?%m+uM㓴%'Ɩ, d][yhB@4of2IA7l;{5AF$D~do"B1lfl`n5I;sNBhل\u^PyB:ӬC .& egZFdY%k^a4I׍I4v1=J> 6f b `f?#p˭_۪3t|LAK #˛pdR聯)h@k}(;(ȍ4d!sfyʕx/Yjqz`m'zΑ$]nhfoO~[юRU)xBw<r0 p9\=e FKf :rt?.me: m"N\1o5H$\Qd^>Oղ>QQlˇ٦W51 מj60.}0CgfCBJ0s`jrۋ$I;޲Q#n\F5Qe6ǗJG=Za8sYo{n` ʴ9mրV:w`5NQh+NXF4wRrV<$_+{E0VA@4+;rAM=7tBYF߫);ݾ߶[J26gkj${'ܭ( `fIA`29=<s^xfF kgk2Jfz\9/}&i% AN^?6z}%<[e4 $ʪڕ*  ehO*E۟7=:rjVC[] })Uh#ѥZED$. "Yԇ~Ɩ$҂MG7YEXBSeYоIҬ|H6 eY*n0D[tk~CCGnfQ%5ѸdVÕ~馍z6Csg9_e=Xr=2M@K.hlxlyx&S](w'}1",@jrk 9}bP[N+LLA+TM3Vul%'vt5%USv:}&iҸdmұfexE[⶘%$ldB$96,BbFSqd0 Ô׼fHkNy>?2j&--&)Sv_2;;>>))k Taѡ{o֏?ᣏ>9s}--"6.K[rbyT{v}Qؚ:uo{1K~7%!j_?niiP|Sj`ԩڳH忕;F8qbڴi?sWݖx߾}K,ѻ!={ꩧ뮌'|nWlٲ]vmذnÆ vZ|%]=H>}%}ի=?5janZP ͛7:thڴisꫯ6oެwuv}ر277wРA·s 08h 08h 0uqYYYsyWO`~vs.7{/m^Xf_9k_u-4{vƌ=ɓ###322>W^yeӦM& !,..}_}׮]%%%111ӧO0dȐܖ {:Gs`MA4G`́q4.=& h 0& h 90& C=\ ,re˖yz 90& h 08C=)P3*XIHDDDDDDDq !xh 0& h 90DIBB@.8h 08h#us7>53q !=iZIIɓ'>7Ou'\ ÇϜ9sǎÇތ=a̘1K,yG233-ZtjB8,Bt>: ,rOO\q4D`́q4Gro}Ν_㳳K.=R#Y`ꤞQƒ<""j*a[o~=3!"""CuuuDDDeeeS^{mZZ˛ܒsY5xJ7oǮ+nJDDDDDDDsn_X]]/^:== -]خsY5nv-::L`QlUYDDDDDN\xO>gyԩSqrrrPPPuuu@@@Kk!u;) &MRRR&OYPg18h 90& H.vکS۷o߾;] vÊ ,rsb90& h 08k9rW_7q}kkk}}ONSgpB""2 HZZOOz$MӊwOϜ97:tqjΜ9O>dNNN^^ފ+.^hjРA6l4~` & >RPwj~IDDDD=B8dȐZ`}ʕ+ >|Ȑ!'Np,ZbҥKߝ Br0Oς:q4SثkvLDo h 90a ?AFDDZ٫fϞ}̙6`Izz@.8)m ,S08h#g̓)a[o~=3!"""""teXDDDDDDDDԭ&V`sUzepy)V`Q) 0`8z`[a zG`́q$2Q ,""r3U_#=="""""/u KWܔt/ۅ{B4=hd4 YLӭ0EDDf`l0<Ϋ2D&x ={`zz 92O Ã)mDs`MA4ƱG`: ,rOO\q4SqHLDo h 90=BՅSQ~|Ν&L0`;8j111mرcs z*++LE$&&.][hv0uX&aaahdlLDo h 90=Q} ӧ%KYf;v_pI&={-nٳg;v,99Gii2Ǐ7\to-4:gR""rnϾ-(Oυ{5mnui?Go~c<]n[o~zc/dɒ6}Ye˖ ͦ5kMKKk-8ܒ3u]r2͒}'ص]!&ȹ*?O)N&|xKo`ou 6q'""30 L߿ȴi֭[;8?sիW;YjUKq>޳?n `@%<=""""jAmذA4u|PXXXQQm۶s:˖-{W\k9s} 3gΓO>bŊ/:y NSg0En) 0`8z[ʔA6 90& CXbҥ~~~ aÆO?4111::zO=;8y毿zÆ ;v|ʕ+2dȉ''3zFo)"""*_wwwG{z.DDDDD^=1"""""3b@gw"""""bܤS `q4Wޓ2e h 08X&鞞hQ{5+s08h#lNDDm:P`ٟ\9mK XDDd&JсSncC&ނ)1En) 0`8J/ۅДA6 90& H3Y3zK9޲o("s!""""g~w{q?"""rƶ @DDDdNB 3gxΝ;'L?`wyªŋĴZ!帖G~'z"##/^lZc̠~ ADDDD.# 6رciiigϞ1crwy%K֬Y|;v/\pIΞ=ۮB!㪴{ڵ륗^=a„g ^zKfCXbŢESYy\Ǯ b`8ӳhg,΅&SRRYPg1`8]mjXXOLDo h 90=K[z` !h?v 7deez6))iƍR0#G0.p€2=/_۷14,,ё~4{ym2=ss:vm%pzFb ,""rҔc~>{ERNUF5M4 ͪgBCCZ=W[[q2fX;jHӫژ0SV%p̀M܉z̄F322Okx644ѣqqq;UK6bwakv%q0ߒM܉ lM== """"jM7>覛n?]zիWi֭[wB0 'vu]wEGGM8qڵ/X 44444t/_vJIIGs0euTe zG`́qY?o{Μ9S[[[[[{̙e˖ӟNŠm۶͝;o4hІ y.N`xk׮^rs=oϖO>}ܸq.]tҸqf̘QYY9P4ydOO\q4SV5,S08hc2p}̝;(p;wnaaz#G :tׯ߲eKRRR[>|Æ ~ibbbtt˟z)wI`ŊK.sbCoZO?/hѣGsl^y~ժU?'LNlNDD}dJE|""""A%趺.4._YLJJr\$W_=x0z:6q'""""2mq#F؟?~|юFuĉ.u\n92ݔA6 90& Hdz]XtWTT4iҤ7pq׷qʺVf@"2)YV@5^tzۯ| c"""""1Krsso7|Ӟ$ќ{1ўZRRbxqIIIjjjxށwtU=]tRj6}mR۾q=];; rk6Qu%̹sK3fp<sјcfgg2KV`vDX<=ҾPS TOjChzRVVV֜9s^~F+Ç?r㑣G6snsuU TWu%Y{(ci;6MhgKa zG`́q$2='fϞeMΛ7?t<Ο?ߵseEqE wO#SFWR Uо٤ڪ}MpE/mʯG]6~`n áq4ǞKu}zg7w=+ƍtһᄏٳeeeG~G{1o{wȑVf%Df==*'zz:nb]a˝+c`|^qz7^>k DDDDW7>ͳt=f CF\b پ}߿n۶,*=LIf] 5fSn)Sϟ{?Cu%b0i.N`愇 0/(-----/ QO$+>*Y\_mBPoooޝYMd{QOW_M81(((((hĉׯpȑ!C8+,,LHHs<8dȐcǎعs  ;!/^Z?ǵ>hDDDTT~;)eUUc=xbx]7p}wf9J=h ޑU"#3]С|=R[uhD0G`́q4{>?ŋ/\hѢG ٹs}ի+;vDFF1wy%K֬Y|;v؇-\pҤIgϞmύUiii{ݵkK/_z„ gϞ=xx =]X GOӴ _('E# i|~Yk~h?heZG-R>Ɲ3t'몿[܇ E'k`L?~'xO>ٰaq9s>=7q|ݺuoQ%x嗗,YҖ9>gϞYfٽ{E:Kʲsm"$I k,c銛,h^$zCQenxzj]EG0vTs6:$ .QK絭[[q ! X=?("""55j>˗WTTm۶~={}YLpBo;GQQQxdȑϟm 윖×?M`u&c"HlQOOh@EL͆Cf00qʵD\|'o&< """'77wގGbbbrrrr-}O<w}wٲe}OӀ/_NNNvи#>#?y:^Hiiink!Ij_r"$ShX&#G,\+ #"cCcڮJ5"&#q~d  K|Q[#s-eI3Ds`MA44bbbkXk<~/^p?ɓ'?oիaGkmLi#vfWBwÊ]BM<=rQ:$DHju+mӗu{Q?}܅B _^Y">E 2W`uG[ eMܻI3Ds`MA44ƍؗ_~9n8ԩS}Ç@||A{`{sڴi֭s̛,̃X&aƯõGm8rǽm,) cd~L^,׏ٙ27Fdڮ>( ŀjb keq iYpz`uG[+ UNV'#t M¬H{[͊q4Gx͛>sL[lq?⡇/zwy~dٲe3g 7o޽{_~e; 4hÆ zj% ,"r=,*igwٕbE|?+PV@e~WU)@Ey{/%#"X,vmvme}nBߗb]tUcKY@2KXdz2фq|ҤIڿބ > ,X{]wُ >|Æ ~ibbbtt˟z)5+V,]υ +e.T2'R$+DPHoodDd_~ e9n #S";2oX^_?h){X^pO9Y"0H?,/!F2l~sY;VzfˬZ-"""yχnnkl߾}Kj4l̘16lhK74<{3g7~j+MRRR<=j']׾UqgKm_c( iw1u ,~Qe~!27ڮQG]7'OB(2xTU^)xс IDATF]4ph 08X&'O}de}F)$8Z7380ֺ[mnmLej?ƃ||DHh,pyXv;X_BF 5,\*bd^K&woH۴ZE_ڞMkV+XL?sº __ )e~co& h 90D5OxN:N_n2 ,I[&ȡyS"&6mV=2+v+Goս~q[Y oyr-e5"4"e܏"t[}jrM;^ub aӏ  c6X\B=~0E>Lk'&bRs,>1tH$ ϞҏŅ:7"bدmR?vo3jk>d~,,@M,̇IVes~,*u/)T`Jp"(rPUy5Վ#eA[ٓbt+Ũ̹jnV.d/z)! sڮ5B\, ,""""/ @~k&Oϣ t]7XieQ=uR[̸@f Eeվ|֩V]w㼣2t:&e+<ĺ y"Y\(3! t,?YYeyTU ,!Đ#~">_zG|詇觎9k|=rzEc`܌%@۶Ad!(X9 X1d-A7rիxY7S5Bl@{s̈́q4G"c܄ȲRiT;?2VxAJ`}Ve= 2SDL1cghXmWOp薥}Wfg@KKԛ3nA#~~BgOB'q"0R6[% (C( e0R~Rpg]+b┤kwT ^E( QScd|ӼOW|=ʒ+B]])cm8(U5^r?%2;ViI['`mT{4o0& HdzOO3'QR,"dmWYV*=9kRp;NeSgi閟o 06}PU%A("rڷPY+?2lR̖ RP"7,Y\6һ;Wp:e6^YV* '觏Q2;e,Gr*Y@D(V~2U^8+N@Cv LV}b`2vl/U_0k/EM5ihQXDyBqgSO@"7`1u _ ,K@¬'BDDDѣGر **o|gF !M`ki;6K-#1X%FB3Rm߷@D^k[-@~.b$&gOAU}}R?~> ;,s8K??(z:#3enVX4Rk^S2@8MD (h~#B#$"EL͡ V}z$#ӴC@Vٖ|B ]c~Ͽ U튯G *F?w\=m< e -;S&V"6FҶNz`y7Uǟ0-7M :ۂhV 08zs-Zh#F0>}iƍԙĖ)Izz[3Y^{Iw=e;X|PQb;Z[wVB(  @ז*ȅjbʰ".^ye sS۳2(\3BI,⡪pJhU[c+/rJ;e{d3R*XjFKVT43#[O]Bi-_ޣQ UO N7#:֮z4ޠ2 ~gO"0Z?;1`y)MfgPEpEVrOX^Mm`@{s̈́q4G/+,\О1bĢE^yhOA ͎1ܹs„  xwTUU-^8&&>lҥ 9s_wTGץL`9SMk/-` ,YTڪ> sgAڎU~~Z?j:y WƵE~>.1}ԪJ}e4M( zsUUe0shELj^'Z9 XX' Zi̺ !~ ,__B* AH-ZuacPScj-s2Qʈq"2>55PW8jzٙ^FQzÌVq"/E@JY֦X^M{Ϗ7LG`́qB[n;=`[zJkiӧ%KYf;v찟]pIΞ=k/~ պu֒ .<+Wl[f1EԅdE;VB{w%mmwҨrJ6}mX<$VgORhcwBC E[mS`]~{H)"."c źʐaD\_*#ǶI@uF{5H;- EH2lt L:@+I[V%phd 6XF~GrM;Ex/Y\m۠l7^Wx2r Qda1[& W:߷82`X/XLY(4XS"$TDFF? @@H1egMOO<+==}РA͞4h˗]B˗/g &+_gGiٲes=׿ymڴUfL`u%{V βZ_K۾Q8 @kO'mkyYrȰ(&<u9><UΠZ/cz!ʘkZk4Sr]-%y W[aq?R'N 3ZK`@8ŶaXڑl0U"alXe^cBU`!>}N9F/@DE$#E(aԠUVh0j%ڿ]}T%lXYU)׷UqDhڜuh7C=$MDDDgϞ۟N2ȑ#~{Æ oy &MRRR<=岴x`d# )GGX!sm)Q Bԛ3$ep2z|K/2^h@I,[}3, Sg\r;Ϝ:M'X; @}q2uP\V~,+`#2B?l#Ш,̷@^eVQJFOxY 4MbQ ,=;RxxUʀ$r=THڜtz`yEb;-A4Ds`PBBBZZZ҅zN]|999*+""";;~6>>O>$???))iС=кuLsKw]M&O)x='Y ,mKϢVf^jGo˂<ʂ.i"F?Q?q+^?e7V ڶ.`,g KʲRYTiiֵ@Jeu G>Jo'r/Y K M>e,:_% PIf5M`駎h!y}zPh,-ѿkT>FW1ҦJm2:e#¨nkV6^T4$<=N h 90^hƌ}Ûn&qxx+Wg/\Ю =zh\\\g}:11/9uԾ}/__:~aQrLpDToܽϩJ/Yo]!u "8(ȪF¡ˑʕ+;c^'|xw9xwkkkдi֭[|LS~~~G~G7n駟rj ,2ʣBB;s{%OY, F-e܏#4d7|OQ)2:'=KM@KmjvBQ,>l{kF%k263ҵ-_˒+W2 в =XDH~4X|~gsWuR BѹX0_fg?@;,)iVA)'#mEX v,offX^C@DDDd*ɯڌ3^{̕+WGl [d?VVV/(hX1hР 6h䅖-[ /|۶m;wSLYjUFFjy嗧LⒷܒYo5K_#"7IMM>ىw]Xn_{( nhkIDŠ ,X! jѪ)8@u,QY\K;k Kڴ,*_8O?}2aOFc9du7l^M˶TLbwa[Bi;q !IJJ.Wl ,q 5PU;2Zck6(2hy~A?~Lvlniey#IS(aavq o}/eH*X|DhQY Xˬ 緷U`RnT6IǍ&&/U,l[j+Go`#31(;* Wmamm ab#&7LG`́q4cɓ==7VH)Dp||+яϝ֏5#dÖvuuuY<!ƞF%&qCލ>D12㒭~ܹW}H1X\(-l2#e^֫ҌgS qܓK8&\NJl3t(&_){s̈́q4G`9&\a 4 괛EDCD$]@fˌtغCY*VX,"YT@ߗl!>~go$NPFu[ĀA""Rɞ}n#\31=#BBQU EW6sX_(\؃٩V뙗E`y Y\/\ͪ>ie" }[#yDd ,""""j;&\5E]Q @D\2h~~2vBڑEd4jjh4R7hOp,X`,Bj`ki;g6N"2X&zE7ui;r+leRZϿmZ72Zu͞%r±8Rd6< ie BFQu%3ӵov! ,5觎7,̇Rf!z X!hc{N%Um]~1{`ys̈́q4G`9&M̽Y?uXg".z¦(DpH`5' TK8 ,= jkEToePPU!3A{ ܁ rzem"Mܻ1d8)hZ3kF:g>Yfv#!؞Xkhʬ|BI`ys̈́q4G`9&\@^: ^"6^IF6-'*Ǩngl~`2_ IDATJ ~X䄈*$ʈW$je^1Ld]pDP0Rf\M{ ."AZUvk S'![kNWQU??u,y >YfF&YX?h_)ڰ :dCMB*Bwx*ndmXa7wlB]uX`y&MJJJ<=.g]LO@R_c,^k+UA!"4 5ղbꤩkaq}'*zbY|~^9#f$m,[O6%6,?Bʸa'F*-DpemO'emZ۱Y;+zf 7LG`́q4c$==A=D+O݊enTkdQ̸_?ӧ=cte*BY {W,[,O$Jzbc{D|}y$8X@pXF,IH)b (APzK۔ȌKdu51`2bVζ 1QmfmF71ΜJObt$9f8h 0\.!9r" ,1q"#VTF__M6[Ѷo4)+Bfg"gu_A"4Lh{w'" _XV!g0&(6ޢoūK<0-JEl95\K(slG._/y9nK`yXDDDDEzR"i{v4:7*%SqgW`(Ymb/Vxmώ{ɃXf"b{vP|hw'uTEQgs<ǥ1v!U3BF 7TcDĆCc2EDDDE"7IIIѶ|A)gK`ַ[ff\5ѷ2:4 > 3mYqlHD*w1??ۺQiG"#PSݰ}Mź0*ʜ&{`ut]O@$ c\]Χ*fbl/ h 90& sL`L6q}ڳӂyhʺO^2qW# ϝX3Sڎ='u8eR?}տ:|cA큮ߍDL\_n#1)CGDl9mVd*.#QߢNd_Nz`L}z5Y'+Dh@_.TF̹Et%ˌ0Z?{oU?TI}ggo3ޱ!C%$/$!| &@nK$n};e:xcόg{z{z_ګs8UZRKjttz늕JR( BXQT^zW>\_;YT|˸{Qg͟[罞>]416DUS@QQ X{V^_*"o@4ٷo_{X=>˒.ЫuzAoO+><uXk~-ﰧ-`&"B ZF:*:8d[oh[@Di1>"o.!b1[+ f X /rZC"UG(L3;V5~EDf؁3_2bbL"E1r7]l<*yҁ"TCZ`YUN֑Ukrߓ!FaaW E}iiCȘ9j =o;;_~վ.t%E>*3\ݽ4!~<}T{g?$iiwŭ//QbǞ}Rٱ BP(R,&zNƥg qJ[}6hٰd%5I$⤡4NzlF֬Δvg`)@N}\e; ztnq w= )mS]b&\cXDPS4^s=~q~ K"%t»D,<Ώ.V ,15@U( BP,;AZvm XnoouuU1D,z{XPx'0Yn)h2s;kn@6nX0s^g}=JZ?: MBfٲ29"UL崀Ź'.%i 2,zɕ&fnZI,՗un={ސWe@:UDEaZO 6|{/;_H{#Gt&p8|ȑ7tD\ N:Ĺ?`Ogfq!ӭ|٩GxffjvmiKoq'=o~wҁhi>_v,B#\P+ tϥV]vv@_R}O>m}_E4'8 ^r W(|}?koۤQ{XxLMw1L8@r7w yA"n|o C_$B [~#Q ?a]Gw^~uŭ|yEӋέwwioy'Oos[mBLM"$ @0xX*zޅشBP( Ŋz"+Yju%rݲvmv1ocdz7UnF/:z4~x 2JC+=3aԖ}H[B8rv5t;n w% gz>1:]Ov;xQLV0 ϰCςRw)PRr/bB(F>T`0RnG碰b3T}*?Pu,[=(kpՓFonK?B F /xGhiO}9J/?ͻOC'Np_fB]sY!̮b9XSy/z$OmM[{vAZZQ[Gw{NX3:#`44 Xs Y^&J_XIֲ/bY)cCgDhTLM }t*b3T}*?Pu,u-'?6M3̧>~ #zٯ콒=t< =@7罞tn&q jj < ij #NWUrewZ8VKo,y>Fug޽ٽlOLJ&!{}ikG<Ə"bN$F/7UR/8f|/oZ0\rN?sھpn@&Ģb,♰|NT@"UG(L,opWV'>}{{쩫ۿWW/첊A$`'f?/O11f}K'{?6 ho! ֜B yҹ g"n; ;ҟBXZVsUgHtIs+s)!w_F/oKǍ̈}kU~l*‹uhW_/:p cr$r!K}%Ν[!sghW\ Mޯ7 BP(K+o+ ? -41D"zJS6nYC+ :s8""A,BX?,iݡ,L;}c1Ahܡ~Wn ${Q~CܻG$d:qk5u\J(1ЋF L|wAp(_)1= B @*vn⽧Hٶ S]M߻BP( |9KcDxC,s {Q$d~2z[wjoRQv8dt"{.bl46 Exg*/տH 'kϓi_U$ww&jj08gE,=@ ,~;8$`LLH"Eu#hHg/y qXt.h3as#sgB~*:7{'LT}*?Pu(KQ5XȽ= {iQW_J}@zdV5{/ӮUV`0M,C6nY.vR/6^BN۷*QpBlن+xA]^qM#^u'{oǏ s \{"2S"(b#bx8…=V[wk!nz  8il"Md^»ܶĕPE>@QQ%`);nyX ~C5Q?*NuwiE֬'uuD@تDboDX8BW /O^ddHnYν5W^d`>B2Qd|t!)[vұtnB!Q-  BP(I3O_;pg=>iAmvQ{jl3aη' > o XEYt ]\^!/$=`{Yu"H&qnDY8DfЫmH7֟gJfEl!\qQܪGƲ9:5ޯS?eXtF".Ξ#{.O&} E4R?W^RBX\$Fon]H}}˯IC#Vk;qeTPETfIXuխȹlEBDg跽MZ6mڴkLEqOy?UCPUq`-~W<өxq,W^( r^. ݱӧ[ԤAmݢtü({u7?@w}bjy}U %M0 X@[ X C'7hkU(^tilʸ2-{'LT}*?Pu(_p݈B*@52y#R_>_DU Kp|~-c,d64;aӢzߴoծòj" |=@:UDEa'xXEVJ!:(` Uz=owb(8ūe l l4[\HSv]|G#a[Cn7J=%BB &X]ѧR&t="Gm]ʆEs`M} IDAT~pavP( g('x[w'62a Xt.Y^xn0Q ,b]6C ,̂e/`5519.F_i)X.-`^'%ټUnkףsP*" Br Iy#ꕛ,BP(j! #@ |E`ƴ y|8xn'~QU'z±(l%h`~y/@lzO֮in r9D_e0ЮڗNY;t &F+g a&e+'2k1ZNt[MU q堊T}*0J~E:VUk![--5bm8tPwy/V^zSenR %JZRSc;"xU&tVdl4@."΃A7 ɚT䍵JĭOBn_@/+ǥYL{244`XKꝨ(UGT}*0JY%%[UBd[$-$I0L/3)SXx,[>'^7_kj7M-9i_=0mTJEdf%&hoGv= X @_ΕE"o44ٝErj]DVQ": BP(ţ,? 'Ukd69>QKWE9$X ST;V' B7nOГLaV|e;}AF%MpRۼ+c5ݾ[*D2:j A)il"κELN moA^ym]{N^9O_nh̶KY~օSj! *pvcSABP(@ X~ww Σ\ B0%On}k9nKĭ~dn2V)ǁL!LYVY'UG/r^+K=ʧw2%~d`wq/ !AK,FvΊ,uF}O: ۤuBD#"HHZڠi"< sb_~R=Je2dZ1@db+ʒz'Vp֓<=̾2)q%T}*0JZD0HNZZ-0 ~hhz  //=+&Ubap[JrpQŪ#8XRܖQ Xf.S=?ޘsIZ;ށ%rsܳbRIc˕cT=c}?#G௼9@W@C(%mBLsMnPS = OAYRj +| (q%T}*0JZS!ݺSЋ._e{MOɉ؃?eA߻"Tba8,ϒYL.ОM4f1UّG%旓BF:v|81G2.W\C^VSAv`k;{ϚZ~#Owy"^^xn.`'ywjx<H pI=첋)ksLdJP( "}biO@=t?y(0ӰG>^-.Kbh^cb,dIigE, Jeb!I9OlVd޽B xO17&cr$%`7e/Ryj%yvV P~@xv>}sdWH:]@` z,D"HCSkFX<o{4m^[Tn/BP(A99X;m46fXOzApZDd {La ,=Hf5+׽zB5 Z8BpUN̢q"iN[D2$E9%yіrW H-C]HsK!C"a;fr89Fd.;C6oAt{<2 5Qŏg`?]s&IViSD-8q~x+%NTPE>@QQ?|{?"3H%u3,i19a`LWuv  JuL{-e oZX8Sf8'N yfcNx_9f<%~dw`I(կdg`e9L/|vm+!3ݻx RBf`zhP~챇 BWF4{2ݽ͕Ȓz'VG?^~T⻿_+j"2ŗu\i"UG(?Ǐxq%C8Lq˟0ykt`K߱ZbuzodL+]N֭⬜ E\W%9HYU2!-ɝqG֌0G 'Y߰,=0kG2y_EAZ9XȯzZF tL[IS !Ǝ,2+cuSbjAzf""Rfbt YfM5H&Pek ,WEhw=]GEy/ŜClW( BHo} ?~.λr#ky$m,~E/FهN O8-1: M]th-,z4z@QQBL0 BN*)@?!&[sB6l"MڭoE @WQ1>FV/;ih"6hnҾ}x,E%0N`N aJ3p:E=ee`}e^~jxۍK257Y:<&bTxion3 9ewa1u:|vL!GˡM{Yi u GE"f?PS3a QV$LsLHcH&Dd՗qyD,j-Vr"ʜ+D}W@"* X~I:7έ^q$@ځxR^gZS&h=PFs~S*-F(ϫ"$aWŁUF)Ad aG:"C'Rn~ Jgn!#`Im!LQL(in|QqXN99zl >5c&+ ױ/fri5t Yp)f`U`)X9H'@ǁ7={,ߝ3ӫ>uO?O˯J-"inE "3bzY xZ˅3L,i!޷CŬNc(-+ 1Qo,|_Ǖ*?Pu¨ eFAikw",!&IKvդlƻ@A+_YQ16A*OM6y|pԸG؆f̴A &JpS,s82zK6g' `&N@JO4Pb3F):2Q)f!Thn`prXߏgRɖPMI*Njdwa[ k9\^ֶerE$tCR㢚S ƨ%F`e_92$"3rۤ_/!-mbhPIg?|ɸB2|_Ǖ*?Pu(2@=!iEޅ GہE6n@:֐[.4L@Q3dX{Nf ou\*(Pc{>("i_ xXN|Uځ3HK"DmAǁUB؃Ȍ{K XGS]e8p\AdF}W@"* Xm9ٸ^@9Ю^s~5Pߐq{Ɯa+dm DVfYJX,\$o*>7a)hܢ8 3V&2s2JjB7 [8S/EO0:tX3K Y-on YY|}ٸ/'v> NX./x~dy"t\rFm ,[TqܛZ$!V,ĝsOK;2*-aXAFkbBP( E%`-ݸG,$4~=C7$Bs@֮ǑW~)Jځd{ e9xf/'A$X^3'|ӑW&ƹ#`h츓Jx{%yL!]ǧ{>i+4W3Mp֬PfU\@e a^Klج~lٖ〦YPJ,^´kʺ?+ba.g:ݰL~v;AȼB|ɸBZ}_Ǖ*?Pu(k#FJvR_ڟU!44ʡLOƃ`Oyg9Ac5y~1ٷo_{Ws*«8OD#fŐc*'D,IG?jcl#%5uI+1sc}_ys' Jl09b[K5#Vmtl{͖{gv_uJkU1r XRz}I Be:TIk;_a9ұ@>οcw u!/=y@g}H+ ]D93D tnv==|XSD' 1`+UDTQR,nIo7R[@l 26#ccKB5s&d) v`K0@h 4+ayyV0heXRMss%Ȱpdz(p1 @͞ORJR^+gg"f(}0 [ai hHl$e9qX[ dG'=UjV2Ë[j!8DByibh@ v|\-jJ:Vs KDrs:h7> , JEd&+<^Q|eX BP(%`-u%`Ii  ΟBFjJsOB7o.ԍ)ۼ&h&fd +) 5$D"FBYiS$4F@ ^9 @JdHZdԝ:ܒdr3`J 3K2;=n38JxrBunzWc4_ aC7?=Zeq.tp,^hpLJz ^lJx2⢐ŃQz'9K/- bN(Z~^tY =AiĹ d;eVw|)1: Mq~T<-KrndFcU&f0 q`) BXԑSωAH (dVH*RKwv]d|x;L&:u?EWNrؠe ,%R0c8eRͨA@Bgdx$?{h]>* 0n"`0iq+?o#-;Ji!& 4CfUdr`ׁjOBS^){Q=c(wfHsvM|J9  2N*Áj:u>RXr4 in!u BNt br\QSKW\4hw{a{ӄ{&< Nm5_[m0[q$^|u鐕XG+UDTQF;}mgw,N/{S#l`}ƧRfmst }e1 [ i<<1Uq/9f܈uu4VO~. MD$N]$Pq~ d.Z !WԊT@8(*]#C OTX BP(@ X ?9o# ct˂ޣsFZޭx'T-,)n=xF鳱圍'󄿔 ؈d{E@1E !L4*,3)neIүTK()8~.95s}mVм-Ͼ|+lͰs_"G<+pZ؅r~(wCԁG~tFܾr̼DiO^G- k!/U7l wp]ߢSG3}h)`oH`O%H{[$M$\ٴ.s!5GFr^gs,Obg`=:TPETF X :"yќ$ڛ߆PMfҹ^zU+IYN>\IhGf*Tz q8UCrIX՜u(fQYm!,S&D:r"өBӉgj59628K!bEk1e %8? q_ASj(D6l}STm֩E T F S1]+{1v!lE)ҫ[1 ^ӠYߕYa14PeX{u\ "UG(16"'s ֌S)15 =@:V/~E_=DUp`-A\kҜ:t\R:`|3p)h[ &dgCGi7_a':́XG gJf$)ҁe 1^`nhEILhЂDGbh:fp'&E $]p:<_VR)A~Li4c) WqdqPl sry5JqK&yL5c?EɬijT Kj&RFfq>,˝B8WR!UnNF~긼uHc'ؓAU<;blD T= ! T* i[@B*Fe`) B p1'H#=I@jlgV ?H&}atq>ttC뜒C]{LuZ@Iz_HYL*^q15ܙg'{ĤodYL[WDzW.sTB$BŚ0iě4mAǝ#R"KkA"Wpi~rŹ"H,V[f0xѓX,hf ҖEiuIr@#kTR?)fyUYWRv`JBj~7^@v#`1؏z{i_E/^A b&&HȽ\q䇠r􉙰_{,SVH BP(A XŰ"Oe}!m~^{.8ܬ%int3+G =3pO*PGJXW,It{Ĥ7j,`+ua Gj$o Ź%Z+fVLtNr,7=9S~|b ~2V}W@"* _b!R]&b Rj^pkz:RUO+Y8?751S9)p(v22ێKVR{V;A-'c]5pCNloL3D*)Ϥ2]EN AǖÈHr[]͕2]X2{kk9D86Y,%r%-}buWe xɃýpԽԤEKw,>+^}\oBw]@/̻74W%`~mo #uv.dU5v5b}a_̄ٳO¬p!IwBP(rE,Hs 1;K:U5 md-ͥIݏx+KeRG`H$X@pe ! 3U>~sĢ{.I49WY!J@:UDEanSw.S[2yX&?vlW1/!,"M-br\LUr1Td& \Ge[4VPr}7|%.gĩ&yFp {THg&͘X"QS_q #j"ENtTq"aaƀB\S $<dǟE,y~Tk5Y{E 7 h-:01: ] @ƕyuddkGtvy(SFtHVaqh xx橻KޛqoUr93u,[6ޱYl!6K0\%@KnxMHx/\n1n,[xѾ4̙^ݧ2i4F>SyM`M X <⋊X>k*?FlhH:YGIGUT1A M]WYGBP)/?Jj_`'I`)_S1gݩA]oߙ7 1h} e+E)RHq {}{c}*[8po.bo>xp3[wQF]< @K.C/DW=|?6zmĆW&PrhH~  "d ,R0͹u^]RB[\޶&i L@ɯٯy౩CZv}x$3;AL(bIB܁fP"R}B܉LDo!B ,[#JuWYC9,9+DY58 +`:ڽ;[Rf%Y+MBh6ɷ!JR`H5*l/ qVeo%<R@uyKHe&`q=G/Vkr @$1_]U q?ӰZ".17Wx2h]yMZfsd[_IKG'm!\LSH"Eg)z߾f͚Zv 7/ؿ_x㍍cOsOAxǿJXP٩v> )sO~_r~ Sq3T,e/w{B7q )4w>5#5ިx*d\v`RPuc`GdB0Fg9.wR`>yǁ0X3ƚ:0dG Ǻ!X9a䀘 yH4\r \TpaoɭJzq4S6+|G>#ѝP6CNVL`kD`*|eb6  g~mtB 9ݭoAbHג FbL"WlWK4= bZdk5I`)ElGdޘ 2c4Ǟzq,.W~>T D1aֈW/G.6l7.M I\ ^Ya㹀ty\H'1X| ;fsK^|#ߏ|#O??>S]Fꪽp}ZH~PzT{v`Ab|KKlhغ-EjlԾݼ\RO< e`۶m{Hl]' !m \~ ./5C?T]׮9~ ,K 8=jౖ(PUjFFV XڣJX\‚l Q< sb; 7bV*\T\jhnbr)auvgFEKs EMe#) #b Dzs$. Nb!wu;wwqRd oV}6ǠfC+>|Huo// Œnc;߾S]XF 3 .0R`I0Wn+ֿ7f2> )/XF1NaRqm~ /!40JUfyz5GhxK-!&oIC4e@p3Ľ$XNlsCl-<U!Q\{p/Zn)CtѥoTzGҤ1R"ٛ=!¦ $ҭL:=WV7zӫox}_=z[>ɷة&ZU1@1atz)=Z*{p1e!#)ˤHBC8+:*ȏv+ BpׂG8  #>t6pAuXE,6U0=ٷsgB"E)RXD,)cǎ?;W^yOӥ COS<7!1x}r)ĊZV Reg[_yWίclABdd1WsKĔ7b3q;0}Oy J_ӭ6R $9Q`Y#)5)5MhLh%꪿>6tD`yD5q6H8Kue`AajGvPqIVr :VPEs$Yor9` R4-]jW%zQޑ_`n]ON"dhBHCsYr,1D ioyC-ѕoP`d#+E1m>#3LZ{uvqY#*pISEXzWLZaBIGdIF6\?wFgmN&>5K]}w ̰ Uub)Xs "T> 5u0k9Z)RH"R`I Rb +WNOO/Nf/mR}cIlZ"O^ wn_|964LW& w_Z0y9οOpŽ/|z=;f&8bSLX Zy2;PRZ^쳠-r'--}(n'QDZ wa"^èS>x!uͣ}nm9<r`a;v=":;]? [7pM"05I#ҩQUq*f'lrv\QO^87\/_ -;:0ŕW/;&Zy;=}fG=/{?VTΧoL_>v×ϼ>:=ҋv?}?)wbPov(By +3Ʌo_ =5t[[d<3/+S#3=Co.] kVNzsS銏\8׳;^5|wJxHf_`tG/le_ǗIbou>Mkf>~ Eg1Ya{ ۸~Fo5_} xu~^~vS>j%ğؿ'33=HH"E)=N .':۷oKr '}d :ZVzb/eNq̓tm:[Ba!vMiI6u䎔Pa 6'4wa;2e$T*6F _^5v܎؜J*AK2It,WӈF[$Sۃo뤦¥FhgJIE CXX|#0+ h%c[}kàS~EXL٫@DIziݾ" ڭ{#ҹC5[Xfoi;6!@'gqC:3N[^O'chu /K1 Kg[/ʙ4)RH"ي%%^z;zM7#9삋͈W$^3+!g'x-]vry~ln 7hꬷ*r'9a"_"R|)OQ&opmA E 31v* qrt`3 -h & on^G\S@\UU\!!dE7.bsbb!%KB8@iU%ږLnާz Dz)wU+30؆Yd4W < 6jOFBYFLdud|-A?9{ĀpMYFlJ&U <GsM{q[EVPD" $: l~gOnыL-hb2RBU!t>l {=?Ubn!M]az6ۀjH.҂. ٷh?P]~0gF^Z$gxDגm$2_ ~lXIԥ)^=#[/rm8%?3pBI`:D*E Z'Q,L&ؼ e@J1Xܩ!@`T b=Y*" c: 6sU`7(;ҳ}"'4Ɗ*(.T€RAI#"2hE4 0- "40`GX<4kgoNaƅ 1V`UNML3yλ b ZvWl9$#LeX-֞Dc6LvOdSCVt~#Z`k @BĴfCA6'Axl.Gf2)N[FEr3iM$B[0'|dCx xiy>TkG2~U/"N.EZ?y]r|WꜽI\Hq sc ,3+k``?y͛7?#@snI\ ݡ'GkN\qiH ,Y{ɓƔDڌMyU2Zx| }b緾1J=6#a1E")KS*2AjkXe> ZOD53Вؽ m FICuQl3K.tZO8lES%PO=wEDR`1W(B7cEG:<.bn,~܁w޿/NO-@OMs'5_W_/?ExF@r ý㥃2/]'2lqHH9KN *&06{%mt'hśQNˬ.7~Z;ke"IJ tZI"\Y޴WW0߹tPFVp̫c귐 C DoRLU_"vUJt[ 83)BhY-%4hgif5, bJyKC}횵;?|ӭTB' 6:sXH):d͕!4{0%9VLc ,ۈK:#4a{xEϙ6դ:Q` LMBC9&*`/(Τ秿ۄ`YzSe&,X4MQrS|#›_vq^#LgXcf$W .+Kţ6Eg` ZC^mkcz ^0׼ɊR H`iH,<9atw.̿aYP@OO`+[ZJE!m@=zz;¯D2=۠JӎsJ"E)R, BxBORlZX}V+ 0&u/DlaGx2 Y͙2 )?]_+JHx2|:%0!P=B A0-HkMfT@y+rS^%zn@3Y5B%ڵ;Pc \bHB+L0\e[]] O*Y+D V_6vu&e.9:mc+2`S)RZ0%K.NbǫT :QPahfjdO,P$ d.Q}<ܲⷝ0Rƹa$p3#&$՛4zzg8 Mhm 2'ZG`_ξ β' Vt NBH6j4̮ qR(Rr&eN=,] U|Zq(ȏC}Fg.'X':S"E)R8XLJ>29]]ok=Cg0PߘL}{iFq5 )Fʕ[?XYPv5cܝ3,ۮ1%p>\,Z}Qbz>,#sW{ eUČ$aC\ \PP&U 2}g;EٕE`tm&m%VeH K V̜OoEæ+&E+P0,G'gn^`H툌ZfkJD:hInbbTPFu)4"яrzKF(B[ED2= BDIF#r ٰWtP&X A,۩KTAmV*o%NCR2G{zhft;g[-Sفn+T*QIEÓNMyU)Lf¥90(7C܉ ^O<ג `^z ,-b=ͣ%z^+O%sͣ<)#ĝm!{kHʬ$#uL!+ VN8cdvKW!r]YrivXvwUTLR\U d/$ho{K:rpBiyܬAւκ/!)d+<q | :LaE'd*.7a`X ahM"n㉅^ 7(E"E)RXDF{ԡ,=~{k3pE ؑfuzxO88F'+Y} #8l7P0wrmc2˙=3ǗW)2UD=0^&.Ch&[ZCAPx\a}TR @Cye_3jDy񮍯`ӕQE,O^6[t($S^x= A_ӱ1E‡£Dv"ưB(!4q>meXD2&D:\͇$h5$"Q^h3Xn޶13.u1ӤPm>dA#f<ާy:q`] Y=z8- !<:Do>^ !ԓ'Ag BBw_|;x{ׇ{[mWX)RH"EE9A`wѨ#ge +֓O>9GҭkbU_/=uI]3+]B^c,c20+eUpλ>k( bQӪx Кr/ JƼ&-i xsqU )Z0uR6js%iVeW5_2ܙED}(6 j 7F bkĈEN ;Y|x!%,E&f!sX!H`l}e>^K $[Ɏ D{R($Ȼȩ6E^5NxA,9.q^#Oc;U׻E ~gU~-+ɡii&-XHСRKhIX:/Š'afy>P=EKN@b!<hqݍPsW_/di7︍(B=jc0Xk,]?)\=XX1Ţ#tIL17,[8!-zxDup^>R,A'?^we~t/<)gĐN/0ˋm;ݞ ]>SL&-"(^g>bjڝMǤEؒ&q&22(\'3!sܘRd%dLs4֘I]LLbU c%#و5>ʎ^-˵zai@͈[ "$ їZ]uGfٝX3.e `n~ke&呭KL "mcz,H"8~VvEBA88t]f_,i0M Q4VVHJh[G2 |~qea50 QfvP`? q; Au$ ,ݞ\0i&$H^ M(]kngko` `Z0;F$'UnʦDd@/5Ḣ]JPp{:3bu~<0D=~[?O=|o;uyrfJvFP{|]_z dP>΀SS,:I\Hq sc+؄z9K4,l7*>x=է@# ,ГѲJEKZሿ _*:k;X!);S` :dGt+4;a+ j`ʲb$8lC(8IoYaH4Y`E^]z~r eդ4tCXViBpeLv/"]CXX.Xhzb|LlOAR3(rVIXBRK (CCת˝+T<PA`0\A3Q{[]M=vQ|t 3iq ~ wu87"tCX5~L)-ې{DcSX3@JaL%mxT)&ecv*jV0Օ 4t:@5 qA$#cTl ^2yNֵ׉6G<gwoIz#?VcN惶lߌ)$. Nb , CUO< y"?kR`Z:0lK8Ľ 1XB*GoϪkLs%¨k(HKĤBKnu 7XVH3Bjv!Sص%/Za#~58׆6D`q@i:Ԙʠ{ãzXH᠓ )GD`F|F7uMDhy)$L+Dڂ QNHj c9ۆfPk% pX!,r-\mxX@5㩀Lɰ߼OnyϖƥoBڑH.Y[D ^ a`Lm<&`MneW f <7X.; :|&`zT;30n5j9<ȀqO($`?K:,qd`0K)Jmeq}7ؼ\edym7@kQVӝ5^}OmTbGvX)RH"EUib} 2&a]5@q+LjCܽ(*X,b ,^@֕7GKDe=HE11f:!׶jFQ^RΫdo \^6+kjg;i6趽,+rI`d `$3ԓvtV=P;1K@:BHR`e4S1ePBDt Y2k,䚐D=tq!6Q'Lڽgq1%mj2NJ.&_F8`-(,V`m +a# 018Xzd{)"mMcoxȖ{*wiY!HȗC%)Xn}y*55IeBѾLkz2,N362 v ;VL5t5ӡTa@D'C[OϷ^0oou/v3ԕ+2ͥ:OZ= ,[a#LV'sX818*d(7{ii0iFNCo⦥:3:GXLavP]$ӭ}AdsPJk؄ѿ};nW<۱6=G`>.VE& =9Ѩ7S ,I6C8Pkoty\H'1X ,_ .R{wE_ܛ ݣ'@)=} -KT`ڶb{`3I@K#l=yRʾ',:oIưf` fR 5>0+f* o֎➰$uw3Y.U ')9رЭؔ*M2!YG79&KI[+3F;7Muln-M?`/(r=e[ɕ6Ul S@OHEc<\j\:q(dw0Y_(l2<,HRE!qrƬ@`$>?sI\G`~+G-ƈ>n*/DqrVljTb pvczD~kjvˁV)J3RH"Een!L [AZV;͝WBO.,K,9EA6 ! &Vu+7pZߞ) P`Y_x|(8a4r X`V6޶&b0}Js+hLqs<,?@ ^z|PX\yBXvX\% Uq Y5 GgN#S J,Yt-[cS'R)Q**i m +saT%t 9dRD!57jECnɬ)3ĉ,u8D u"qřIzuٯ8,1!an?IzM ,2.sh˜ (>+4(rcPLǺKmkNjԲGg\,$?{r;? ,,E;QdsϿU&띿)f~Ջي]0+FY"KOe+V! Hϳ{ůyW7"}"L3RH"EeN`Z+ M籕YaZ\xg`X*,wYq)mM6 XKn-F|SfOD4fe7$b{%ф 1$?{xt*Y>\M۶mKmr%l&0g##D~ ,X.1/_M⋰ E Bز uSs>R,>қq sc9XZڋs :Օ\[MW3[,jHwK%^XJ򈍊F?ъ+Ȗ+f*ɾ{a  T`Yqݫ ,akq3´b=VQ,"PL) ,n&[AvXFt"&,DH5P 6HX ,kJiŰV`NOgOX}I` |fi-KY1}Q `3"*2I:7kX@LV22;8,wHj {iBl}8x.Kҵ!6?[WM`uS?h>}Ž-$k"aӫXg5sqݍ_t|l6P~oZkN$ ,~0 @-~!B]g3*E),k ("Ϻ8~b8 IDATS7ӈ Nڇvw6wRb X4^5DgW`,PyX&Z0}p$Rf23&Bh2_3֜rHk+UCkKAҭĀ8+ IQ%fG?DqK$u⇳De!\d@e(IK[XЫ bA:\.({3%xzJG+n -#ݩe\ﻚG3ys_sI֡ sFT=qlHdGFrp n!R `w[`Ym& Y_r W[m*O1DVvh!o5 r~۱؋DMjfȺϋ<\ ?Z(o_p%J)Vtߎ}࿞]D*j1\T{CE"i"U'䵪JS,kP"\+R`wpi e3n :RȐB[I0,PpXL ~VH\\ж!Q`bI,ӫ\jκ%~ڳo;| !d Hih=ɖ"cF\̵MiGOs_H?֙{U넸C do'_0.Xt"uG,h"RY©r,+ 6y@I'@T` KEwI`o– 1jZ 4 E/eUKb7WoiC]Xa+A#mZ~ 6U]^WXTx:z8iI{q?F ,0eL|!H?~ߺZy?TyLOc+m 4 9B d=̈́Vķck7:)aڊiuMU`CZA˻s`} ,}2Sm' k._4W/#znS;^tӸEBܗ!>֥ڙOiC+b.cOղ[ۥoGg{/{7 Ie9}b!+Y_ZW1[|TZ?r{g4Y1.g3]JwCRB4~s "nZlܣpW ٪1E;$&]B:|weH5 WU0¼CmTPE@YلIUc mvYH$ʼԸHnj#ۑ/ɛ#yPE`!(dkL%4Qޭͤ.XX>R:{YrF&%%D%.gaiVWFc)%eǪ"&J:iJƪ< K=+`GxIWX\z| wHƠGal!  k9ojf̕ʳ򥊗(c;! wQtKh j|"6?r럻zTԂXV:DM{D3`j#B-)wm7BH Aefg?*v$\sOZ}Ӧ@=WWVݼ~wC`27C >nGۊU /}Ng xk_PbX<2Ə}%6.2*gEr-:8@ `=[:Q`;kjPE6I 73 / ԶtQ0s$Ww:<=酙Ϊ8x~pIңbDT-4qb!LeV!-^ ' $%-G&GFwbKf GT+yMef|(&igMJ/7KQns-.fV@t#0>B!sz.#Ϋxb!v)4%Ǖ=.ay-%]Zӭ'A\U h tI:!2G`٦)³.J #*2(-b ,I'"y';c{{K_:|CGN%& ZUiљteWk%ir ^\ С՜#)}HŔ\E),FLJQ:cfɆR#,p(̝L+-WʼI`9q\f?F|"'bvZ`6lnKHG`-x>,Ո™ ,'Iu[džk*jId16xQ($b ,JLu趧4Ԕ3Mȣ2#d 7-E7!Ńs08;6׮`9 !#?w` cٙ?/qHu .Gv%l?hq^bS_7ĭ S_$UB 33m.]ؐۆ2 s{smZ^>?V?8D`g@ a,B7{*z!zLE&qXHB*YUcϵxmLUҗP;R , EBaD,*G!놫 j²`| 3bY1. !CTE@NlH@!@Ô.!]/u؟+)1q `+TYP۱ss/}5_#O>,sGmVT.Y|m3Xu) !K E҄$"MX)!JD}Mo%lNܲ0 '>>i4ꤤj"mn;9Ge/S[cɅa#f-0tTfv\~ _ &*gK]; W`Nخff\v%[35pe(ظx)U Wc35}Z68/_ b3e1,!6~ObI1i4Ⱖ[|99!B܂jCб !a' RpT`rt؛r!N)UK&Up#iE radVm#J5ׂŰ9ݝ ^S/w:6^w>=uy`OWe7 m~bc;Ѥ; v_O?gnv K'neu +WN4@a ^V/߅r:{ll#kH͠\f"T0 0gc[b>@5NN 6^kÇӋBq&s=>oxjc֌c)i_m~ُsME*ۧHK% (,LoU?3m|#)HZDd޿d(=hn&f- K{ _xKϤ GXONL*%%QOx+IkLox+k[7F#,$4ӵQZB`PDŲ#!'c盳X+zВ tY![AEg,3&Tw7\Z_?\-n5̡k {z"tb!d#e5LU^EI|f8% ,K&5eNqJ3yM$6>,0>\X7yoc`3tW N۵13f* Ew6y=/:cᲸuAq-uġfS0o ;q ?ءG_{o&E?3s!W;U137(4/F`Xb͹G\]l+E` ءے[DAB*r1|<M*֊rD}*B}'Ќ_+?X텻yqM.N^rQ!PLS6`Ԉخlщ,VqoqTyOFzKcOH- qnVF5TG;Cҭ>J7.|d OѪR ,p),Ih!*GUKwSOV9 TIbҬ! (hXѕ{Yzq!FM=XAZ+x١BzX𺝝@ IDATy~/8e-O`D*)9gJE`QtaD`x( hFša[B؊IU`Jt̴uJ1SKX=X'7:UTLŞsX% 3KxqY;He-ĝSG=/=TT0;"ԜU!6xs`O{kx|%w~[7[8ܬr~N÷;cs\8V">/swd̆Ǫ#fa^Aa ؚWlb'8s2??r4A dXĭ] ZTS_{n__ vLSVuцI*rGvAhj WLjE`*h1rm/fnj @QkTf&VHtQ0}۔yK]ͦU*NU&Ca ~jZ{;\5a]>*\ڏ6*R`%[Ӓp9-ZPS9{!}XJP>%)=`GA&MUdbMxd+8-TZvP?tj+v, R:'Y_<mQiE!IMi/"䙑*V#7'{sBg(nR㬅05-GɦH[Ə{$vNRٶ`Ϙj B+WQ,4 `1٧K@o(b-ke1 qb#'[ !9 J<S}\ف.o@e._03Sy,$6Hn;@/M`ϟ}ҭ2D`~zy;Nc-tm,`nD@EP.I!UK֥N ,oUfbjD Kbe ,g`d)3tH.JT!\e :%Ӄz +sb!L&lS^0T~4A 2"BnLI/ t9Iعqnj* tyn$Mb͸3:*G(x^Ŵ`Zv9.›L5 S"}Y0NucOvǒ=+Csnb>CE6#C+;;l~KfvB-W7L_\F$}goyVy,!wx٫|eY33~g&Ѩ16U={e]1s:cuG~?|uJ XjW\E~@[p!V}.<0^@EqmKrjs׺UVhZޗ@۳f.i F0\Tc!t f-tbWsi7D:,`9Cip+~N f2@!ETBXor\QK) g ogG3B(9Q *ٵ(m>~SV[r R9+x6-(zQt=:RVX_y},?~?R" ] ,ʒ`߽)Ap\;Q:ej_7*Q`%$0ժS FkmZYLB] , &ۋ(9ec`@da~,.`qUGdj6 4 ̴~Ozې? ?r\]pEA0 a'@]"cJBX[/UKE+[ ^$~KH$ Y T9U`y w!S, 2{e0UCخikP`TlfTZ<6ҵqiaDI%V!K,Jƒn_YV)Dp w=ks9@ BH#F ΀ yg߽wezcR ,z0Z?F8 O}pW kIe%X5:j!:f` ,du|ư}s^ƈ+}%e.=oM>HX E62DhF4hԗ:b[X gITSmH~}}0JeS[4<} 8'րflquUbZ d/ksliD }))aCg+6!t Z+h:NonŮXK+,\2lPb^̠BXv&Zi#bm;ZT^G<+H\R`%6z'oD kd`'QrIa+xeL-E"f!hDQB` #SVy> 6EHT{1L*SN"?Tt9??`*K ‚*aQJy\t3cg"R`̻$=խ$JhA{aA靳'vSh[E!]J@ZSk\3/M`IrR&=MYV4yj1i \K*'oI5g c-> +!$G`TXob,%0 qba.ʽBI37(v/|/|p'۵8&#gu`&oӵ퐁~!͕K&W̹f:}jsOC)vz] ,N4'IwT7ZOHQX^`Qg̏>߲lyv ׂ|FD`QEBCTK(X X0.½*H6a"JڦLs#6kD`iTuQD*T3YwHXC";M-de"&".'M_Ko)蟛҈àIcGlǮV5`r`3n1e.ơ'W'n5#8 @㫎|:vaNNW>sܫ7ښ? 2۽\b.V堞2as\1;Xw a+VSVXdf6f!RzK8vcPLXG$@Xs, b {U6y*ow-dҚ|1U[vc^ N`Z@(߻-n+ia( YBV ɋݣWC:{-FxP0e!ܘJ@РPIcS}JQKҜw9tOK{ P`]"eBxУ&4HXҊ&Jcq`fCq!W >FB:!jv )Z2rFLkv S` |CVZZcAI6 M>x;v;<~7 ژl [n[F%u.F=,U ۫4= O~U? Zf*۵=bskg?_-KU_; Cϑ 6ݖn36 ]sf[`$Te`Q1/ad'sq74ڼ k+#LӐ-vy a%p=٬ Y[lDzK#p14saҒn^⫕0N19fP~pj o%烃۸N伭ϘIdԨqk8vVqCe9ulocU"R$ P}~X< Fg-M+;>I&;j['a|.CG'/-YdXD{5nI\M7O*aQ 2p:nRbL%󔅐z( S:1;X&T<P2%}6g 7O5DNb(/~tTG2Fi*)ܑ:4I2}@z.!uX{/n[ϒ+(5Щ,C ]%:ĆW!2ĺ@sO>/_UmLs,M/67ysմ~%؞B9*) }/۱S}S`>r&+X(f+[*΅_؅=7u ϝC5?@sǧ.̴&eE5Mue-=/>7_*,KTȋ|(,w,̛y6mL`%(f\^`ƒo(ѼCJ (񥙳@[% Ћjs:!If$e7u[wJk&tiXC(Kd\eY$ LdԻ[3m,G`dhD Uege㹑i\:\&ZU!C^;+zO9l#rMX N_7 fR$*Ƅ;fN3[Sn{a.)UK4ٸ*7.Y?VXԏi !yDz g-O˗YG*!NmXoE֤mYydP!x2Ev; IDATB4#VF=h2561i&MB` Ink!nŸ3n2 D@+ff~?97wm\Kb1&XIp vۦgՑe 3L_gGO(ҧ1=u?'r6Qo$4,dɡ Xߎ^u{N .{W!LpykՌ3P .mrfU{X5CAZcL hhj V\Y3u=iJmA4%TUyXVu5-uvt,Zq({_%+Adf ni!Trڜ)=Hi|R]&BZZ@D=N5oTPz},{w4CGD}ƌ{V`:K^n9R RBs5F541 FهI-Tz]@֬}@4#O+Q8V2wUHM !R5 , AҧdV/Kw}i5+G` oF"3v ''y<@1=|՗ *Ϣ#C`DE@x"E`}~w|Uz'y+P!L"xebz#$UlZVksp?(& $WTα~H %/R`lV ^PItQ]#) M1brjJpՊXk[dٸ޲ֿTn$-p( &5i8i2,hоxLz+th_~g;M3S'X[g~} ܕDmp؎8Dމz! l|[c{uع'^vƆ5t if@5&ZeU]i,1cMfq;K +'Y;0>)qb"XǼaLjj1jCxܱW=iBU([fcU`u=(:jq)FoBj@-nؚ}M)WK{&2d,Ip1C= ,Mg[{^@drqjF=L"PW=Bhl;cIĞ kd*Z/R `bCUllIVo,[%ru 7"_)Mw!WFN?!A R`%]Vr8+<,gkspcin wZ=?x~0x2 ,Ci!H&m!kۋq& c0&4XÅRxUp$dV{ ۚN`>r}A>ld ,AC]e yeQl}To9eh]j~[chu[Lc%vU)X n8zN[Mx>)MÅcX!uF#85/0Xc+w3_6 B ;>= RZ:K.tKbZ69p@;y=X&|Ų [ 7AX[K"؜ksB \VҰvYu'br~gDژ|_,|Tc Ƃ\B+;`k^' ̴K%fڇ'Oٽo- 1 ^,_AM 3Z`.&t ¶{? !u.FQw~i-BTC|*) Mw'3E"zXD:SLG 3:_T 1|Mꃂ]P Z:F&K0L `Leְ9 d ,*^49V"K`ycQtH툢0ͩRa2I(;{к}DSd PЭܓزeOVw VEjj@#~I#C:0E-ͧ7F:g.Ub(,MЏNusχ>'lyEݠ+AnYQzmp%nw hꋬw"gBӯwqscHc *A0Vk]1 :fv|kFY/8MlDvʇZ žLτkŅ{L$oz\z Ŷãɍ4l@ڦ ݼ(<M۾..C N-oر 8j]Z0Kg`%,]^Uv;~TZ5\_x!W~b{?{o'Q_<\G]\#$|1+ 0^c1F?XC`@ tK#su}]yDYYgWtuUu=UyDUVfDx} iExO6(rekv"7+pShR]5峚m#{,@ tu!aq!\Ɛu58CKg$#Y]fdf$DQ k1Oz^Dd'XDC~hsz`FK)SuX*1u$* ,,/{OV~V]t:.VDW,!N'/i $V7dЂ(7 !Wʀ[2%eAU8nJ /3HAjtK'z k}eUQ3$ތ1$pI%Y˟"$5S24 TLExR5%#rWHwXS~׶+d~y/tkơCZr^?vir6QzYoҍ/jfA#Q! |qA7ĝԊ{G+ 7П -)ŘI@A9nP 1TW!Ugy } HN)WmC* Ȱ)lZ.ib 0/+;kkN_#;é,A'9pi!߸?G,CDjla_*c=D:JUגX\ϊg6M&]EkZκ*Q Q||Bӿv @B?r) P "S2*rV ͤUe@DVʰ-0ŔuD;v4 ZԬմ)DI\[#@%n5)S`4-9)aO%(Kp,SH`lq V/Ľ!9_fbڳ+uT@K>-^婱hY^ PBS (j~RJMTOo#@!0of/" t*j@*\,+r).+|rnn!`g,s+{;7#?|p2Y\;L>|[:,("^VY4HxV{^sFՁ)c/2{Zi# @*" 4 L9g 2ܖW TV@]7CN:S3 SwMUwS^;4RJ`5x5h*kұw.Ȱ0FW<f&&!UuQ;v6W}Y^>ݞG!SIr܇R}Y|L.ɵ6x"E(2F(iZfOU! _r$L&)z=`c$.GҚgd k"j8ӻBxGDK20C^M)MfvNåH?@r!:?-۰$wmqO6/9%#G(:t).NL9B,#='j˯ErcD.zE IDAT)ACAތ):/)esG`}?T#m#6=y'{hR~%=ap}U%j4ݻ7ߌBw~z yăϕm w'nz:G _~wyG;S'?}6_8{~ſzFź>mȫJ"{DaG\ Wej>پy8Y'Y =7{~ʻ=6d"{>wھiēc{GN}\sFo4xeY޽LFݡ=3kkęG|wU=oXwhd߶ kv=lsTjTl)7[9 O~vdek;ˡ3~e/9:Pj{`"Ѭ'y`lSF_ B䁱k{Ǔ;?{#U>x-sϽWb/[~ɇѿ<ŋG\XtG۰?8gd."{N_\S;|w x{h?-jsߒ?+>t`wG_]ޝ β`ٻd_YΧ{ཻcu{ݍ5rwW/qw>tI?گl!_y.n˚;hA7_i_ӗDoڸxf{C{궔yڌ6MLK5/n)RYj!$.TӈOcTfG}rl  KP{yH9-/R m*T4Rtְlc1JHմ xTS3ͤqa\mSp²s;_:_SGDy'x hfB^Bj)ce`q2.{T(rAJ,şxO z _HT '&TDX\C(@c Z"9Y,'XLy1AR-fCeU\ 3' "`)tiʦ'*7x@F݄%j /F9_>ŕpFDiE3 ""xVBV5X7.H+䮏F7lHBLLfQ`eR?<@yHS?ƓZ9q4獍KWy]t.wEt-k#[/ DSAE:: Lq"\nIٗ2XQЯ[-TJ.ɬ&ڋ d5k۹Hy0{g $˯/mt#]jh:  ,ݭn߀餺7gYUPD5=JD({bzZ'Ӌ _ VӰA2,x*I@\/~B\0bsg4IP:0 L^9 N5((df0E(|lO睡LQ*#$š ?zK#W(WERPk^E$gM o2UU!t'/ڳ:(Twޱ)6Uϟ?:U"L-.4r_7z{۽_i97'j K LjFTP VEPwU)(ۖI ^fqs5{cAU^$48HSKG5}YD (hY[nUa4 tfRkG thnI(gp peiP ,okSwoa]4JV;\{p[o=vءCnᆍl<3+oV|mߎ?Z3B"Ҧ*R$a K#͝z4W@A^?|͎h2WDAUxqUUP30 LgZ@~V!`\W%_dz*X>FV1 AZ2 ͪYۄ:p@[L,}D~Hul+8.:GO:r.$wI`@fkQiP6Aq--RQ%&,K= &}'D* M'RthA&[{UY7LJP"9tl%? Νv-S`M@Ɯzݍ =Ǐ2WG¶$g ;;3Er10kJLN.jh8ez,x 3ƱdjZ?7hjtl8E큫X qlQu`*o~%A ©t/j9 Lv澎b%8#רJK-U`gRЛ ۻj( ɗ_RVinX*j4"TeP-?BfLc0RTv>v6k о S0V3[fqG%(U+Q5׫LPA9B0ŵ8It6/* H-Z% MUUOH\/#ҖX % `(GG`ɜ٦+MO9ɟ{^~5Bat6EDMITmh JV)@0(B߶mب~XN]{.{ͅ썁9=\|ɌFUS`1E%d$=,;ZɵlE(ęYԒP, *h%" #ݗG83 qxNŧI` h(TKjkxn-d@|GؚL{J @*+$Ja2ɵ^vGPꎔrDe L2-( cS+ y+b#RTU YB`]Q-QAf9*"hni9#(F1j O-, +DB( FY(.'9pX#XdI.d 66C`9$rכ7h_ D&-6Y$樂oϝH%ٶC' ;/kuC6[7DQ d_ $e~c??gWd]2 alVzϦR}~ r\L'/,Xb#P$$:tH ,'>mܐw/ڦ]GWzV/f!E-儩AMKhs&UP`IA;` K*B)B=_QXiW34t}`z'Xaj<`P.?]ID97PvC` X }\ǭ&]ĮfY7Sݢ#)EhD6 ]j zZdP^Rm-bjR1,H$qYغ\2`uo|+ՓiU@EB?eÖԒ]5W- ><3Z4 @Ԡ;cj& GμyZ5IJ3¹h2 *#&HE{Xlq q$_|W; m*TU2 U,E@F=?WkwbZ4`HV=UY`vKKhAtpWPq=?̣B Q!T-4/UޑP)'k6 APG^q|:6236n>-'6ǝHFӽӗ2\u'N&6uXߋM5j:fΚUtKEVA7̈Q~ʫT^}r0nIYrHT)w ӫ^q5G7#5 b,c `aK[15,g Y^EES+-͏NjqrOŤD%p $Q : .mKNE핧Е W:UG[%]W+痆v VZo PTAЅbRK \Q_MfP@uUZ6[*腸o֧!m0T4J(U`1K>*)(*ݜ&d! V4;WP\HϕX.wfֶAWQ+d ="Er ?b)jD* M#呅-!/_Y1 q0nDsœ?Vz](IW͈2E>'.NBe+^q =A+b~t.Rkck}Z? aV_\)lj65_p (XR%} tֺwF F0j3P-JCZVq aWTxF<@>|{oԎ{ﭕ_fW?*tEZj|[8vMPՂ.X -׊96%9IhXgG6a,V.R'?'׹m^ǎ z>޳տ-TIZ \(pD?d "TȚGhi@^B5kHO0z+ayQV.? 0L*{@NXr" egs(!< a Yq秎 /4k#/׾mhlQ`r\KljUҒጫ,R=…eVHS#L( j9&uUoQ{+H՘ګV=P_?XD6j *ܯE2V9/}+zu ==wtgۺ*=ױyV/> Bo !hD%Sl1)4M"DX iяW_>a5fI^M"I|U`'d5*{Vq=Y{'9a C-4b [T EY 7ǔr aV;e%ZN`064J`n*#v5Ot(%mҞ l :rk.:fE3v=pe";y4B>Xx&ͧaOԪs}:4 K ,ϵgWG9iAEħ G@P"j*67 hټ IDATpN]ՂYAH[FB'h>$-~, oEOni'ą+N$GD:%c/x4g'_U]t8&`8Ž9#B`ՄiL&+AI m WD}|?rpz5I'@sJ6 5407z2칧?~0\^Y=3|)KTS`%-g@oSpb> Bܩ`I9[pU"/KLzԨVw@XT]oapU[ G%{A{5X B(zV о Cpca3߇|9:"n{b"=&E'o/Ed^OoOe [[t\Qޏ%k"nZ"*`J-s κW [R'*l%TRP-+2e'T FVn*TWx`Ӏ^s{&BHV1[wOymdt;(3S+@8O9dS`N3'?u or9yV@']w"U\*\@FWk=l JE~ytZ^<"ܰ,U8 ^~Uм(l`{Կd8{TS%õec_>B%ZҶN~g:f B]-7 R=A9V#C..ݽ%5НIB@:tNB>!~x^`5FŸE[`տMJX}Gl c/=+ҧNQwEBsZvhu8+[6fjB.tPECe(-!(^sVGy %tT(쓧O~wQ*G`nС[P. :ЫO$gU(itfZ52[:lw(ߥ}w;߈`pJ Hۗ\4 s1]| .oٓP|#O /T\^3mBM۟}^eב;+}dmb7 :YUW9b"mLJn!ªu<$u2<  o?(A_g?ުm>~˯nuSZ-J`7rO||q&PPf1 j\kXI8H< )#6rbjP [-\uֱYRFOyd!e0PT`T-*XT+i{W!bU kJ JgXh )V!$ֿ̓0SHuks%Eln9B!N$'XG?i6îՆhu$p 7+zj[WP=,`"R$k)BnWqUsX:ꪆQ3`P:), M;2)sٞk&-#p 2us%<"qVQe%ÆMy'~5wKC_g(*쀑Ȕ07J)20N#b~V$ P $R`2 C ,ₘ*"@_J37)&ތΡ&6:qDXZD!ObqIKx3o.C`հK"%=Td3\$ybȖj`Ag\%T nJyBoܱ!k+KDՁxpg!T4' JQhi6G k`8XBؾrBXUEBD~iʶJ -.-4q>C>%2gD!*H uupK&)DH'睫hK݅9ׄtwh^?SZq Ბ~Bn wSo|~ Pjd`FI--  x,4D97z`͇E}SBsMBe`|2ݒpa|$0c3Ca,@0Q ӡW"ΎŭհςBs|Ŏ#:+$%vBǙN*髿e\KcUT`I a3VM!ּDo$XQӣ58`njA=̔8wBbnc17 }πr&@YP+)q2EM_ &pƔӅ[p 'Qw(U`qhOM8mx)uѬ^!BjqOqtO,Tx +n1x + `6k!epGwр)2SͩBG@J 8U;DXy[X[.$W$8(Ӣ0KrId#~Phϵ]QPH@fEk!l *ÆHQ8 )YZ% @#*-P!;cP+( &&\ imTuSu !o eԑ YxRҿJ48/geDHii(  PYYdB  ֠bnF9䲠Dc Dc"K$OC!/fe#h+sg [ǃv:kxDXWX/"by!HV *OdlE&-RIYV   ꄪ)(+XsٳGO,.^E>"2+y҅f-%3eׂX@e)Aծ}^28/s l!&ωg5?n$Y !+!"u:NJG8B"1H \<^o?# L4"p∸8O^WE'}. w1!E0M/)e;(tZ&,ƕkS/\G8+3=7HcU?&qv'X&1<ȁ):@R-W%|d%SXxKMwHˬ.Y>o!LXX0pAW_PɃC H-x Eo&x)'V`u(\Vul|X"f *"ކښ!]OoFB  ̥Fvl9(2rs>6vEz5*k!̦RV_[vnFD+,R]VG`2#W|Pau3ߟv`"8yUz/|?@}U:|ΜST*tt#.22*,3 $+d9?UX %*(T+- `NϨ!!F'mѫ""IǙG) !p.!aoo?TU$Er |}]{MGs;i'Wyn8fތEk:Ъж9H.CF (IeuzǜWX}m1tdhD WiQZI }v_ NNrY0j+)EE6du84`T۳(?4~gz̏X;H:/L`Ri35,(*,ɹ:`+h鳏Ω˹ROLEdb]י+LUjvŽ%VX+^fXkƷK{hvQeAyԖpϒ OJ]G9@NY66\2p-8Z nBrI+A$0VX8Kw^=+ӽ*\tVתZhEwW)FixpBpX%!dx%HkkrY 9TP՘KV!6Y[-h@.U`h@evJvAB/]eW],17#.N _]^PCWd V.[>O JI>싟H%c=b72yM@ٵ9{)ϝStUB>cX_tul ,~,c7)J-@

  • f^997j)ZBӣG|=XX*1[_|'04 QዮLKhq-a6Bng~PYV =\GaJWWG}@C}C%\Mfpk˪nyXn&er•>e~rJ'!,Q)} "(? [24N-PKoHDR2+ 0r4ZD<D4h\ A0 ҡ-;l Ms3iSڗOQyWY!KoA&UEX[u?{bVR7Ы#t-$Y{(@r)%g;3-qSc}oF1ffGkCV!4 X3 ai,7tLA1qo8w|U4Zodh^y?y}[?cO:Ə}}|:ZBskTjx{$Sl7*S`)Y% Gl5` "ŁoN8(5< 3dn*WI}&ΓxWGw-_Rl+-ɵJ-h!Օ@p{!7}uɔ5F"ce/vDMPD);D_V')*!EjTB@q ,4 EicZ#p q &)z#HwTjh@Tb!^I& פu=_`1@}Ґ(`W ?Z,wִb"X}QVY% ,4qοxS1;ž 17c?P^z˪kA pas(#ã(wBQ\}/L@[A CR4)JDhGZqG9jgvҌ#CJ2C"%RIMHFw}wu7YY"oH[e';2̋x/~-=tRޜͫ< e<@%׬wPri x/ҏ3/"e3  jYVK# s_3=@epA{eesl[5 , 7}ouk_6:*Ch;ֶ>b2:U`)(!qE0<un4#wK@s/@d܊gC IDATԬ2īK;$P&I6pWo R)eB'Ҝ̎f2Hd:?oK :f(a[^yDn/ݛHt2NJ5SLM *kEy QhR|'X1LjG\Z= (S˞v\DX|AULl3~[fK,=X43<(w#V~=s?ٟ|i;wԔ0g}Cd=^@L"Cު/n60M?{}*|'g/_|fCܻws6\c!ljJcO^S<%_c:8Bt.K1e jeΆn"pN/񇔞gn"ʫ< rT4\*eX,0VXY1H@j UEmp@W]-ad<VЪF ,I$L p<3Ro;R`B4\A;v =_.CPu֒q5 m} 8G)wAiܤ1Vm专qb;x r>ΥgӘՁ***LK2J3G*Uq3t ) !B158˷ߗ{4:ܥ@!؇ߥ; mm]HPuoGm]RsH&8AJś+A{,N< g>R(g\)Xw9?&h7{dwf`ir\>u$=^*ՠ*45!e5CDJ1UB|DQ*6nb]7Je+)4~SfUT3+.U`M`w`$'P*T,VC` v,D49>s[bA<%ƍ٦}oanViGߨ=N?Ӵyՠ{5Yn-5p,z4-kh^U0TU@U٣%KW0Gf@@bL =L0E="c+jiɋ?GџY2:Q`1ѣG[PINY_;qWiwV nhCG'u f*R}(h!pvj; %3' ўՀ=U ,#0?VW>KA bsx?q3R;pXf m+↩|SX'XOmn%yla `&T! ;ov"-n혫P%ia(͗(Vl[%Q?S`/Jl2s%`j*+U:W`7hArMSKW`MO@X5Qy. ,hY}7QaTC]I  P7EX݆7b(%h?|B|s[c!Tz ,(3 4,lZUJqh~M9pk:6?˝N9 6 &ԊΟG6lno=~˝9bC#}5Jt*,wpij4)(I _@ s)캙̡pԜm%-^#ºbfJV5Xew\ta3 uF`l_L9e=P-4jkߒ!u BW~Xx/Óe!3'Ts~=u;[2f ZY83S%+ U;ٕP*Cy`.5EM~Λ^<{& ĽM>8㟗R`& '&~ـ /\ hPq{QR:-~KO^^ ۭ),ͯ׼ tj{Gb(s~ \uD(6Ȧͤ _|z[? ZQp?DW._p!}Js۶s[FwgIC]G4Vixr i<&`#Qӥ43ɒ)/3'k+m3OA@J60]VXUَݕ&{h -v@|L_ki1zخ=49F9̓}oYƮ^Fm?.\W$fldbo2?ZS;ݟx2 aYS`-E`d_N]< *96N<_@0(RcLs5dvǡO\Ss4_`Z&(7DM jg)5ݑPMesguXK"UJ qɅmB1,m50#ɓ@)rhbl7+a,nmD-B|b9MZPq B].*9Z] rYV)6!7\11Do[~ZpXˌuҖٓӶ=28~"kXd+tQnZ+ Qv|ߘP_q.ӗq3CrkAq_ AU dIFV NۍA( [3'uoN75]ug1 fc~l!XMK%D{ۢɏvF /ҏׇu)BꜵD4nXNմpa@w(R3٘bF Sy+^ 0 $(?]Uȅ;89s:{MH܌0,=41`CRQALum4 0NS6R= ? @{[X,oSLGn'_tnzGUdreI;\XK▧j 9UEm[iU(G`yފ2rW p#;/t/^גky9 Fvš %C֑G_Vo^$Հ.RGixtrքf!LAok6cJ^"[Q-ɩRZΨZ$W,<$F"dWtJ\{oBBZpȌ42N ShZS`c^K u25 [U! vQ5C*E)w+s̭AEI`[#Е`.la JWiRa08%n;RzX/&BEJX-3ԱDDVmNKkZ4 Z~Kꔋ}W}yI !<zF/`;W(s DVMlPl-TQ6\=I$`K q r Da 6]8f#wCM&- ЍYM3S`l-Jw!%ۺUEZp<}ƯdJ->]GV>(=xץǢ,o{aXE38{Met'z*NQKjMTaeǮ- rd7T1-8)'f\F h2Qi)#IWG CT=FztF蠒7+ x nYTXD&FoUrGA{c4>TSn h+m۴-obʴHqEW`,L|p*"cf/gJ'5.Q&+nPm9:S)Py5bՅSETP.'/*ϒg!J TG oU>Y1u#^-pfi,cNcuVdhnVsmfTrwcG!EcWh! tٗ (.~Q4 qpz,{/$ϟ%:~ߛ:d9 F,cD)yX^0CRB dIUCQX*Հ"8<5>'pPGp} ^Y T\Vs6B`ۢB68vXT}wTOo]Z:Sߑ?rrPVv}ǻT;m.D%9y`)0EAnN3Ŧ6:EơGAN_,}Xݑ@mڥ.3{=R5'A(wO*͝{" n:hެ5ykA{G:KEIKAq;36rhJ`U* 6zqetKš1 oIKCX*Q+T! /JȒX_z';\ܩ>R#+ NK4Wzރl՝x;N_@$`(X5f7@xA|o<_V?\B.Aχ)VJwETsl $r q\nv-b!B^3!ϴrW߾fXo%ӛN/BaF_"uK,&=QB`N7t<▫rZ)*(0i}A뚁%|MoV cW͂oE|1y艹ir <Xo? mw+cѣG?b#}oq=T,89iè { 7#^-ܴA,֒[I[Q=8W[KX^z !w* 9, [K"- (jRhj~Og1j!&z K0(M:BbP*@Nw?>GY- *U[X2P(sR6h[duP`ȾLqz"d7MqkJh !V+)ڮRBD0`}!}C?'>g,\N6F2<%c,B+wkySSLXw_)WA褫"SD\CM; zu҃uOt*Êi IDATĸcJBDH F\͇lYBXlLMǢ*UV`CܻDug[jy2ݮ wH(l!U:.OP()r`*lG@Ee-lh99hZ 0,bhd y7C2ck\ 0藺6AIrϹan{ni0#IȺ7F$95hr,/MpeNPYW͠ejoY0ץ꼋^(;^\J4wȅΥωoL&/15WW Ҵ\8Kqq<-S@Rο++NϚ^_pK.^ K* *,cɭ]Ѧ ,Z\m"20cڌCT`5U@&p_'2U@Q8h@$TBXeHh[.:mY b!l3~yX*Mh߳wܫfԞ ۾K(o O~I`mp?x`&ߠ9,t'wyye<,k(t=׾DUF /^3hL{ރֻhw #FW`myُ`:IOMjǤ{ ' (m5w$eu%s ҍh+@*UL'S.E`N6&w)(wEniN ͼUX@h'$T HPaQy䰐Y/x9Q͚$*ƚ5寒efok{ .cf z N?kx~?nU &4DI\9І{XdLQ* G97.r2sK]_9[6F2{w\]%X^^d؜J hvl_}[McMuhc۩ǠKCQ&c]sUU҄ c?Q=UG4\ڨEt'D,{LZ-(XJu B`2nF~tC}cC[(M$+M᪃ű5Q+ N341faPtQTDW bd]G_s˔M#Ў_;,yoi}z3G 5+oh5S]0/)R3t+{ Zm!*z& , x˻_t}=zeq㬢JxVw[2\ j*wSU1b3u.ݺ4k^r*(ha Sk^L~':dpJpj ;Wlw~2ҠuKfO`=7,I,QV؂ Jp k n gc_UY8=/3O:/.*qY*͂ƍz/@.SI,x!XL_sO=&s,o޾ZMX^bQ9~+U&« FzO(|w;ˁp72ZX+_; ]:oNXEVk:J3jxO]:kI657)XEI%p;wҺPXe6(a[F=- +DGp?w:@Ty>GVsN,ы462sVY)=[s;7/G/gmgz,٣ZB$ꔡ[(PRݏ I[%C]5ʄfzQeT^ $txS&{ETNGfn { -^RI[$u䘬 ;ٹF,QbRr91-*Mwa58?xY$;-0*ݗ_@:2{Z\ YNi q\7=AX~"&2}Ya(̓ӿmuK~2}{` 8 g){$8,Zu_{j8懸2E:#lQ0@Z3Gtӥp D񠥮艪,2+(UWw)7~a@ۂSK`5Yn@`[+JZ@Gu(ƊC=8g R6>fUzMFfµ@nH{l4dJ+8BKt<ٗ47ރlA4!*nAQަ.%`I\@/gty1. l큷7Czn޸c mcW!0L*89SĀ ;! LҫU^ ) 3J}?aT}=HB $PLL % ҥ@։diY1V>Ɗ -@M)?9{61! 8] @oG5 7&3Wcx\΋c/e 1uOO~kuG3E*-Fo!l^8dXL ?/>z+CW+2q]$+;Lݴ:(XjYsY" (+AӓۏVh$ ,ضtp08 B @AWX`!FY3^l5,)lgk[X,kO9{6FC`qΥCՐEQ59! /s a<U-1~!n.RS0TCizloX/T ET`9RkDkUTS޳,N@E/IQ0V9i짂l̞$+ =ķĕnBTC-\(2jXQh[^٭8 @Zr'joe7AT g0.Q0zT`)gۡ7Q9cHniHmU̩,"[е+B<9Y vSPEê4^`fEFZF,Z!2&)T DxVqnn:IWdB.r >D`BX+Ljm j&hg ] /?VV\RɞJ<灖"ܲT1[XRuٚ9Xeelq"#6<5 _|i߻obI0*^ٿu!"QhU=WuuDcskھFIi-#XPp}J=X 4 D.w3B45./_,D|gl|o?a}IZǒD*aV\g5/l ^ XjT2eICTVA.f V`VQ% bȲ^fGȳF*gLy'[lb1 UNn{\>X3JF@4M+rY~Ah#>p. Zzs]{BZ}߇Xt׋_S4>5]\yB` f$ Tx)@ya@f/ (ϦV=0~ rF YBHF]G;ÍWN HǎXZkX*ݷ.,&ˮ Q!j=w/&=yhg4%=j&g~Ԃ4MX8&.U+\ bB9C*ρqs++'yږ7 ++F`̈C:[( Q~!;G Wm9܊fRRs#s,մz,B ,XEa) H%5[eM2,!#glkR(7#v6gZ0IӅܖh-#- r*Uo/d}"b.Q{ֳmu@,oꡉ1ZȲmKII@P^>?3aN3Qe!dCjs?D N_#D3 bCP_!/Ϝcm;`v<K ]8 @{`wR&YI`#Wn-n"[PO lZ6T'AI%RP{ 56m8@̅fJli&͐Szܐ^RTa~AkOr;JB)v{?߉Jr csLcǎw6 h2v<fﻅFQ5Ks.#͟APJZr)GYP.|~ĕGȮcbFҤFP{{YbOxbKSJ '2/)P- vRXR?=6bT_oS{nT5PfT#+n(SI%%BgOS}F_b{*M0ΓKX,4]㾼jDw{ ^g`U˷6@{MT=k!Z ! Պg!.AL)}Vf9I9'5CIBE [Ҟ rS+̖ 5Z^B|ig@XF!(k!! ; /cHW%N7+{73V$k ױ{XyP|%%čŗHOr 0 [,GX4g#_z^m3-3Kx!( +g^%]l)qEɹLJ1kD`m$VK ȉ"R 咈,BhuG<7;lO#0 @ o!QTWQ`1Iˆm62)Tøf8zz7a#N=¾P:ʓ T"œY߭E@11U>4: FVZ\2~} 3!&-CrU!Uggmp ymb p(&t*I.+, \ xO-S2{,_I<(/h֐4qXx%k i0],yzP N%/q_C5yrICufl%X,^̪8"s 24a J!*eK+Ox@I1'| 2s-4 J΢ґ):60 5 eGL}-ҲR`X p145NπU&+{_??BHUYx)95)_ɶ)=Mcplv|&t=a[ o?|)+D`YS 05kN9^tx߭r z{ | &ǩ0n C`G"&D WPWM" oafJ֬ I7~"Bi˹g mrDY-M`\'_PTi{݅J/\\ a};ݚ=S46pg[N!L1 BqꇸR)a[x 9te4BNV!exFjW1%C J,.5qfʼ I `Lvrs`0ʉ:BXr*#Y΢cI0?]4W`d@GvVk7=03v1;_#=Nyg#D8hjr۠ ,Qd֋iH_-D`,bA{ʯױTe3ԉUۇ|g wAX,Ӱ-kK@l?x=?x=ԉH6RpHqPɱM@$N\;`6r<_td(}Bi^D/\iut R u!_}>Qas)N v8@%7\E\ٞKBky C; GzA7ųV>w0"X yI\yD'3'ֻ9A7} `de@REB_x7z-cT! WPa\<.^,<"(2Ō@ 8y1=p9;/3Mm">xyj3^G<կoR7B FXm og]Be`F̝KXt(HRw1# Ɨw?U/e؎ Ǣp-1X\hަm}HSlo BZ?{_u_{ INے%xYm7,m$}IM4ikI&iڤY4f;x[,K־QEJwbf3H ϧO ߜ{UAQmU` s})-N,2V/!]n@ABk& ,M̖Td22+fd0԰`pn1>Eu#YnMĬW3 X4)g>)T96eN h4:P7%Z. ܁_K zX$b H#cF.8tSu{_^4s~ Y *zw~8 ,I;}[-Q31`9첻TXp$  E,F-SV0F U!񳑃_?\i*9TBׄ +i:h)0=-P+lC hai%UYR~iO2\rIoڰr3)i;ѽK c#ԛi%auZ56{5롪t%Ю5Hm+M_4&VPMt!,cnI! 2lPȒt)&`4˭IX7XW ϭKUiXT+HU.W)tZ VN]֟ ޢ] ALh䒮fВwMnsTtXWE@$|d :Il9kI 2lQ6 ˸kX'z 'Ix)v(dBcǎ[G7("EjV3ڨ`SJ-m{a U(߈k̘faDB9.u)j| =6mK9BhR$e\ZR\_Gtǎ9/RLCg(,췎~}@X^W*"$u/]Vй^H0Ovh4emJ dzI:HKKfK_SkR-k|r w'\J3.TMN/- +Km@rܓ 1: ]'wWWt6Wh&4pwi!Bшd4+|yPd)?2>l :5 d\T+_ʵ^{F"H$r^}_Wg)!R'gNWmB5!H/z;p= 612~pU[oϼɗldi6oSBxaLzzzMsvg CP&YŃ<~+Ǐ8?ܑ j 'HM%RM~ ;[Ջ>lwaiSSǑavp%=5Hz/&h3RmFJYG 1ˉveuEzڔ[i{YaDD==B`l1Sǟ$(KD` cZ4~G߫;1Wuuj1sPf*g.Uhb+ 2 a ?d<X'\vPdBiЛ/1XBI3 VR <쎬[`6-eKUhН3X3Ñ1ڛ"33b@a =Voz?'3ɤE,7Ž/ _HC]nA洢8J8b}+Gl"j''CT+1%q/tt-KrϸrXe[B}D`”lT@z T5'R5i>8\)#Wb,*sO{pm0tX + N:aV "飄Ba$TmŁ:U]w^jt8+ E`p `cټHFFbu#;%q>(Wuĸ)|ÙƘjQk(LjVPMkP׿[(^t݉Ue*iǑ71Xe% PVoV SJ D]5hqc0 m!$v?PͰ ,l2අPcʪ7B)r2p"DJkD1- B q>\hZT<_;_Ȧ9UL`ɀv}*0 V޵Xb9,HEY @ j|@Pyn* oܗ>0 qd &T`¤#oJZ2^Ŗ8QY;rT `X3qwL1WWa~⾂ Θ8^dI}Lw?'&C{QJJ-IYsJ?NBC챇Zж3KrϸQ`1$5VTP"lP@ NC>NhtRlUTg esqER8nAf3K>v٬>.w F}i ྺ`͙<"}"kg9g)86HMY[0M.Kj{{P>Pz.”hpL.箿d̴ֹ[f`X6Gz@+ m!*y4M_9]#+r=6-X`;%glᎨj;o[g _e['pd3mNaoZOOlV( јBi}IT(VքdH@X l^kiF5E>E&λB-xjGA` d ˻SYV𩞞G@\P~y7: IDAT@(W߯]YNOQ 1n+񘜯-'n\ le=?[q߃Lݪڱx <<ZFCoSH 0!_ Ƭ}pȳ="Ǐ (ɻ/>eB9K$s}C D*m4gBOO?1O}-0}% Wc:@)[C#Q'A2Z V2kC,Bb 'f40bi-nW:' d15kmu;;gihJ;PoK7~pM>u'o^l ։>-_}rW' ==qٟo|Loߢ}b'7@4?{5юX^O|3^?{W"TEx6Ծ+=j ʶk aDͽԋ>l[v٧{? @i&v6~,^z@T+uCHi'IlŎ)";*2Do66vTկL9e-vW";nWDIpmˆj bCϰ3?Wra ,nx+b)T6_Ȏ~:5o;-V iKX)mI Avч}#̘4d5ǩe`U m?晖HߗM7R ߸kk9KЃ>H ?'"L5?N@5Lk?܆wAߗ̚W4u~pPM~Uͫg Փ=/@M?| L7/G^h/L-'BN?Gݒ|F_l\ ow7}?"omFv-uݫ̾_l\ ﰋ|EW+uוN#w>5~Y:TooBӴ?ҭ;(|XX&5fɤу+g_E6k~>ZG*xאLhg*u4é>֠~+=37)7jGE޼ zɥ}[>I:ܻWwak ɪB(_h).vZ#C?DU*'~y~EWJ_۷—{~׿rkB|'oqKUu;+w=e_=ߏz>sCLbd]!7C;Uu%rr߾}[liPHЄ]`؁>  ByA_՜lohG;`uopOT=1~,CD=b[TGU{eTr>k >cшWe@ _#iO#ݣ{`ՉϮlՍ#(ՠ.&2 K,)MWz DfH$,O/R@1O*ԖKu>Jk*t- q'NB !^ !Yn(nષT]]@Md3lyL Rd}f3UT<XQ# N+@J>1,d&T,r(#9qɤ06sij%$Hw\_o{wjrkH{'4@.Bѷ^}H&f_jIcr\XI9 r+D& k.95$bQ~m~~dRwec6yGS,n!<=zvL]K(F-N$jF n Y_ bB!d [FJ`~w;PܰuI ,OP[Bq$Db=7QBd&=XBܥNyj<Tnuh 省eo0hg ^@*TZ9$.,|aD%18T`)I,B`hXC?w#ɦu!t2NLもNQPfꂚh`%4+8X׉* Kc f@P4="/xhb 818wA@%ԁ3}OgvONNds i=NCW}T}˻H-$u!IS 4c /XXx!Μw =Sş}B𾓳.[8{16~`BmwsI}9?ҥ 5A~$Ҿ i)8pVy"Yn@9,w {!O" qzQא6(_0j Մ znmr-eA8џMIJOzjag}3ħ?;w}+} v3bgҵJ.!) Z1']ɂM^Yi nʝ*N1}^܅`u{˚BkrXTXG/cgw2Y&2iw wD, |9?1G‰A\Q`;Ę8sfig&GzAnZ'#>~ 12MW dw{*bg2$(%$Y#V‚ZE[p9Xq>ۏd uvBKK LtBa3+yC`YOĻs*4 LUWWڵ_|jjJp:CbN :v)O*2Z@X.%Dk$W}%:kBQKsP`pbV#8 ˒`R:P^!㮍IG-;/F;[63< ?&a}@.n>OqX?:9y˟3-etB̲ 0iܥ}/}S _ޒa\wrkHBH ~쐘g{wHj!N=8gJ[7Yvv#1hH<fIC qX16B@8sM"0 11&dX?@RD0X+|{yؙ ƑvKfOPB!уŗCܷPn}*G B[fw9NdNb0igq#U'0zRR NA;L*J4tY/{&XxUpP;ZM'O=gkҘ7)X3.9.4g# e T?O4sN>aL-cRef]x%z<ģ$v9˄XVnBH:ޔ,r8%"?nf,Yת:©LnyN%m ;`겸C`MN4#ӣ]Xd05ϧZe\UcĔ8뷴rA]cTy]N?a[2Gut&#uaL?4z|.qѵO11$͹2"g?Dmt/R:فB~^!bQHQ`_ZO B@ Ȫ2pHI+s[w%9J>^aj!Br#T)\ -VZA@W>HXT(, *e[+ʯ%ه4.#5Jl11yXN4#DLL.aWX!.DeoOzs앻16\c i䓇QXm uRuL& Z:?uXuXv0eY!>W qp6Pwm=F)('&TSU(WK@-Λ[ݶ2@qɀv8>ێMx)X U Ƥ柚>ep9`0nU<ێsq\+%i\r!s2F^WMمn=swӋ2K*ӏ1_ D ]VD'?Aڡ}ލA~8tr5c铨b=(7* JE<~_0_N tX`keNz^ P)RwX?/罣[,Kv嵳(P*fSLu-*S`Mrv!XEX,C&Y˶J S0*)P,& H(KmM2V ,O( b2.< "O%ZG殀!L53Io!㎿gk݀S C@BG:QDTX"Dv< BRZDjw옦GR-Œ3(*ւ'RT:+{n0r)#XtT#=`i-!F,|\fdҿ9U2e3yQfٗ^eIo)3\FQЅeλjT)U B@X8(W3d`K;$ZU}pWpgV̯w>JW<+h$gr&5j$&_++,Ffо#G*e,ʪl5\]a 8Gc8ej1H#ݸY{閜 Ή>$(啷k^B躍D114@ "hƞ{BW,C׾ sm H&aY?RI_>ˏ?UQX 4+ռq})Gz͍ݫ:[57PX|;kݦ2V3%b"kx n;R{JJTP st!d*1kI.2'@0INUz."O|4fW;54g!1ٙ[XrpPl S3| C9KW9qv1DX|=w 70BDBpڰÖ?R }_k$zȖI=Ln`i{} ւ DSVQ]%(|be!B~/^p =n@*5Y[*IJZTE*tJ'#rXv` 6'7b B.Dfs ]̮+,>#Z 7l7~̙u62`'RƝyH;QAX\jV '݄bBh"x95L,wPD6eRˤv~%7'o]1Q%?F]Y@#":a=^*;$d{2n#߿<.F@nnF?@:0ݸ<{(a>ai`;iUЈTtt]~xNUCc #wKo*R UE!=8s .I hiZ=O_3+o6;ox0Mu.G(7JѶPk,Ŋp^p0KzZoM#E(il^ Gri(ԅ HDt@`-ԪX⡜3ǧ # ‹iZصDf %`g`xzʕz=U  SM1 qQ#|  4W,B6ef]Kq-%͕e IDATKe,M#Hz@t7 2x#|b?!ͳaU"HP|˜( o&̨H*B#~[5 5uݛWo節/l<2!a8z Tb~O]9Wev jj>x PnCnWr.m>'̲,Pp[nk6[۩PhS/5UfK+IO#)H9}늸W0Y'ԅHAuKtN։x NpX=Bv/@l H%烔~ YO? Ñ&@]  q_BX9dN7C D 2s={QbtX @L: a I5-B+!pwB X^HOͲ3e (~-YX]:moYsI}K?pjb\dt3gx:O#;ͅY/78e4(3((PG+Iܐc`!%1?Eq=|b\nٿ\VqZim^, v<7 v2,>Ǭ#*  r;<_lS|%R,դ8JP%H [z_%t6BR `kՂJViМp vv ~V%b ݨ 2=_~iFӛpd_rN6NxH.YIA91ux̺r%ep.]AE 4&=p,>CT8ce{ 5qrGQrrӭMW6AڛDŽ5쇫V{g!\(7|'o@7nwt)#T mG zBq 19_(̓'.7\wGs{21$;(eI{'{']Y>pf B1:@F/ , znZ=cb)f e. ,'|T/ɨiC(W!JI>|g~U]\-$2`A,DM2A@e~ 1:TB`I>!<1Y!OkNnW)w"}泲ŒeʯXbSDf^N0txH`}`pfLpz"8+T8;@ɁRr!vRha1ǎJd?}VmG˅^)'ϤQй ɪCev5UN`5~ -Jի NYnj++Μ' ҖX\0dDA1Re&ej?lt}Q8FəXYnQl1&uily4z³Vu:U]ʪ_&#kt&IqYN8InUJN#FDim'3?n(;fO=iJ Cӡi0M4}~QLy [7ЫWOcqk)ü(?uu.TL{b^ƑnT"⻞9}g .>K`}y7(DWpD< ,C wejUě`,330nµN:BZM%i܇+rz8]W|Qz8SVq:ܟ@ @D\UJ"T,)M5FIEm&m!ssPJX"9@N"4ɜ`$TF RӅ2XvXΜiʼn084b0P^?qWP%q-7Іf_A ֢ ȎYGJeQWnI`XZNΟBʴ ٿJȆ(Z׳1#֩PMP\r֑}QH1@ڒyn4;0nV@~SbZݷ!&A#@/KVu!MbxP!$X#"$a}1`-1%Fa[B7o#ͳޣַ #L J w.qnz29W~1;WCO7nf ;v{QK^Sl2ܙ XVbʇۅPPe8ײTd`‡ (K%yqL!^U_/P#wY)bC/)ШVvP.["g` RepB^{ 8O7ةʢ M1@e_0cnc wn_"0E ?XfT1kxDu(VvR@ B񁥽e = [I݉R|t?Soﺲm :uF.9W%BW%P*"Prʾd# nPX-q~V#=YsjmZĩi@^s9Չln&3pi}XHK;4i_E/߿eBd&w{hqo)Z\HSoO]կ` Rӥl9gE9 Xrycx2#0c'1ɉ `d\JD ] +!d-!k $ŵkx 1qn؅.S+\{t.XP$McGbRSGs~ޏ-3̆?O{7~]:O^ӽ0Nmk:}:Hď|*!HN =yE^,r"d@3\=fE ,P2rؙ@X,+.Œ?k c\1_,D,3W{\;"YrJ۫or9=;5#j5% msXyy*C`9"ZB:i g40-uѡ3"c9!$ B)@rXP$liP$1 #3#-RV2/>')qTB}RH[ij!"{_0 RA`nHtF1b=j1)E?_4#W2kCË(o` ihJmDw>m~s)wZ~0q3~#zA)] 8N` ,~쐐3 %r[.E=̡" gUxBl ͭpe`AXEE=׭%s2J !WtTz&g_i^s`ߘ$]p,2Uf/j!UdSSt/<9V)QH}ވeF`igͬ+`7{:JjHB(3B(D<p֨NZpSSNг'ϸIO/\LlNhtQۑ@}Iz%R||y]r1wX W. dB>H0H Uʥ2A5q\A`e H(ԢEhb ˇ*`9і qrŜ4 # 4$^?>) 9U9BHs@%QHʩW0'N5K ) !ne[feY (̒ۄS[ \~ [2? ȐE}|,RIb{^+馑?\99=l,9V`%1 \ %$D<&Οo"YN3<Hg׉snYnW gҹsE"Ԗt+7?FnMwwk+Xf.By\]r)E/[?|:bSi^R7 nN&FfJ0a V`5DS`A%ƿ'~Uic־Y!-VߒCs:﹖^<; f]۱JқnBhyKӬ50,ya/Y TK7m( IeBiNR\)$$z1=! Xe( aŒ ۭآKȁP(BXorazۧ_+^{z?O\U%3j=)XV=?F7^B7* `//w;?Df؈'И!㌄Tr cG/HYc; #X`7̛XZrťwlr kV'N'ȩ2k]BWy'%kK0UL͙y7[#G{Vb1W)7]k@cכ*PlрqbBM{VC/)65Q M"X`"9[>[bkbn90 bY\; {Y$ݔ 'KRjX~SI(!&K*L{ؽr!`-Y5 {33l x)&hbrN`)wGgC*sfͫM)$|@ešvhL協OPn 2U-I;-Rvˀ  ^@+4Jf]:q=UL# (SumY;4O%?BK&h!퇕6}4v~mwj1New/׿I/C`!¤N֭)Ȑ:wA<|Я/C+ < &*X\br A55!Rر n53%pnFN#]H$łV3S ]֊V*%SagX["ˉzǟ?iMת'߉ mv͍Oz߸ܫ4*UWa?] ,JVL_,Yక}ܓ8OϞ"|9ҰnRs[ cr|!YBXR`ICyRP|ZRTi ,0PBTCCbn1|y E+){o;@T~(AZ2Wc! ŗD8nv(߉)WSBCƔ&{oo{K+=YT*U!&P 5G}Ƒh#V[l)e{EL,J=\Xծ @A9d ,C$KEM`i- v]$(YWg]vRXEC#:I̵'>;0mdpwr7[Z1OG@ς990Z9^gT6@)u4Y:h wŴ/{v7tUj| O6i5rN )w%REvZB>)svkٱs*YFV_FaܯQ,o~ < JTv-0رA$?+ޟ EM& D;R XŜӠ .[ANr@Kf@e֢E,^VK;5=aHnEFS/U nF ]C9bZU$ C,iK, A19},;o0? nN㭨G`)w+7Su_{o`ݚ^<_=hA9G>E>w>dɽ%`FS`i)Pq9w뾆oaZu^ 2E([PX: JKxuy7~{%FuO/n 22j7|[A\F{V?*fᗇ#7*4;/^VoyK a2B ,-N ʕ&F`K;G92P.Z4XhBHK#(oS#B%> ]tu]ef&<ʝ(wE"iU>xK4(]aRG߿W>ZL<*9tX|)ub/Ac i`瞏4uq#fJn 渇f+؟ujf Jo~;B~ IDAT*`AyC Ru$)K<}Ɨ? ϪL~X;෿: )7$؄/#0>QKW^[ | ,oi>7aU[ ,bQ7'J#]Fj(i*E"ǧ#Lx]UhC@\ؕ%oҶG4k>%u$ pI@'$M+ˆaBt7,=| ZzU6R7}yo;G`U܈ozoG`-f2k=z gr.{xͬ22SK3)Ǽ_Y{fb1~#mx-d*LH{>wwI=5# F/=Ȁ'_xB j!l&g!!6UcQN=ף^Z&xfRP8 /gq~YPn %vܷ˳7f!UF`J>o7NJE33"<K> j"X@`)&81R)&BJ8|T(bFivKs(H(w"lo9"CZ@F0A'2l8 xETX {5[M︋:T4@ ~ kR/v??˲#G'ރ_wt _2\bWjv ]^X×!d,vl(Nj>R:DXS=hNpC>NƓXjvFe)257PN矑Cg49 .TCv1%ߩ" y5? Ӥ)yADcqEY\!@=%x+ϝ3gJV`mޗ0џ:5u?$.thVCpKyU$,')\aּ[BJT| avOG H 0XUU*}d&L7w{F ,I ,+5.8l33 '2^7HTt,>lwBXj! P&aP߫nx ʏC:0)gȜWݧ['X: \g9S`w˯ (Af,>@{*=8k]H5 Vnn¡jbˣy7: Pr13|@}p?V1zOKGhzN;\Nq|׻զ3(=PR* A^Vu7R-X'e&j-y-s"ƒxeGR:u`AQq_/lhRs@ ` g-TZ\OyH0e(py%Up!CAX4*?ngǨWRՋj7K$ΝwS 51KL q;ZKC4f~귭#DCCC`<_v@b:mT(R#ǮfW |I52,|D>zy5> tԬu@`kU` L@$NsS/% ! ܱ_FvKV J?7p^UZ"B\WL2쎍E?p*P`I׼6R͠-c;q 2#l^N`Iތ[O!JZgSmnsȲ4+7 ڗ*4X+n̹0\ū;kyµ)uةeXu n2; ce ,?+(sO[bYAS`ٞ>J;n@ɽk~uѰZݓ ,ogb}Xj<H(zE~ #{7_~zX4 :U~}/@:bJů姚L-sPs/fkTy){N #/hZ_^$U7ZW\-_|^zY>|9:x@vW@oOo!g+OPwC\"(mqXRx:_LbX-e q#䉛HRzoK g7%4➑A執aUѼ]&Sɫ?+pu[eە@>6 1rMe8vՊϕrtJb-\V.e9< d;.SK*b:Sk$F3$' lpX?y\6Q~M:Ϯ/Q8:Bj[IN=lO?j^͉շ^6砧ŀn0QI[>#'d~NOڇUd8jKnX%%d`fT΢z, it>XM4 g0~Hfΰkì0%ic+gA }U|_tW` ~J?'uZ]J<0fẺ4нKjjz7zȐ|{jr\|~kP^@4F݁m]A O>-N@#laWQ'_zPoP"_55= m\1Lvkhˌ`iPW/N)HU*PcA}i՞!,ũKLmBm2pkR cYCܕ_ .+_N8uиD`3j(v~hJZ1_ss,2;+90bNXtpM)O%%I"oJ%A12@f5V@`qiD&=u]#- tlhaX[AұB(p"Q|d` G}W=u`-s6 :Q(bBc;dvx%v1uo롤{Kr~B*@JWOHqj7Yn-&V#|v} 뼊\GVʝ ({5,8S$/ӯ(8/9M|mr%1=UTbh[Z.Jd$抪Xe0[JXjRQn:-̎-- \ ZD @L?p tWTv@o|UA`i{n8q#9ϕw`3rs0@ \> Hp6 뉩2[ȭkgGӿwnqnӶxA@;h[M0 j p]'կ>&F+VF>9et;4ω|8bq~Q+>i_u/4HL'Aa]%a+@6\XIޔL=py=ʞ#>. ܱ\F>(VخuWZ?w}ϰ bA8ĽUAw-VyP'XY5_)dSX!&ZpIJ0 φxvwF_ͦgA\E_E$? _RY%n0$AO/+P0&oJ7q0W<˱AxKǥx[ۚ)d^5Y~XgF,4&Y*sVN=콰2=XΤ}{ =U1U(n ZJX[z..4h r>`&*g/`$ {QT F]BZ/X/yP1z+lb ^+sk3XKwdHK vvJ!. ,3TQ9̐+AKI#Zs& !3od_08( :yeHN uƇ!,&r;pf!13*IŭH99ֽjb BPgwP<,on3UDjn]|\& V%-7Xjz:Khy wVj&G Ŀ[ +TK<Jb@`]P< @=~ϬhCj<,M[n+eWڳ¡Yhx#B mX!i0 >|]7N]+*˷ VuiSc ls ?z g:wkožK<j'l\8'?@17SMq9ʀj;<'+qg" &l? ~/xW$ә2 K{u5]Tje`yZI=bͧ D޻ @|S43U= 3I~?u>uG`uc@o|v쪒2+![ц vWT}p^{UlM3&j)\f^2P` S[Qo ɅӀ :eeHf^qa0ٙ?wF_0.'Gdg "(-KbDKRpP63 r@͑ uNђV/ T@(76kX8lDoxUqBKl7toLIӏǫ?* Pyʕ`5UEwzuJ Wj4oECZhu-QY"T'TmK- "3wwRY] kM*<@/ -w5.ZC2r-}u/쎔Xq?R*ڭG!IG9(/dPM^BJ)s#,J6Z9g; ^B&W3?DO?B:vk؎TZEv;v5[>Rw/, 4Ү2':|  Z~vEpJ.Xxb ;z%;xrYѥω\E]=4GƻՄZHO4!55=ƼnE`miF#l!Rhn禖_t&a\1PBGPE~_MN + (8\7"JGNDnc 1c-Lo jiuci-5ٶ;vOzyOET(Zڨ.9F]LٹQm+ ~ K~k"~-%GiQg7P夦ƃk#\QqgLS,M`ngWI IDAT/RĨG`3DOPgcOӤN'JDXYGDJgG8]nƞ[W;RW0CR05=] 2\F. HY-.'Q`Sv|y_Zv62) ϫ-DV+ jOEhsߜH5*g M֫ eµJ}7(*Z:&M/(Qjy' [ q xI`G)} XUcX* rfW$&V:$Q1c=7^w38iUW4zV X`&X kjG^ GZ_oIK+4Esi hA bʆV` FZRKn@b\|R%tDbO`iY[",`Qwݲde) R#"^zXA§9K/rp _ wĨx u%vDJNq5|bW+]'‚e ]zH~1_q 8m|utHMM*B_ 4+/tcŢJ08v2l Y׷UAp3OxmaTP;!I+Lq*抅b|d-R9.bhCyU0ze, 9.+8?&|k.q̒ ޙgG0]H1q ,\MPԴx@`iɹpXZishX[  #Sm6қloq] 4Y<_NqڵkW$}3ֳCXqlbytEg)> ZAb/}V&$Ek qcB^;9;j-p`5Be 9Drw߲1wb Y 2G7@+8pN8MQWwu<8WqO@)bCRՍj:Sv2W>m|'׸ohxgNkkXp8uUE *?=-Cpv Z qS;EmTz "c}uݚ"\4%K!-X0]:_D ~c\^(Hp۠-ܞz^zҴ'Zִa4+C꼯ꫢ&*U~ W~ViskT *GAK uZ[/o߄FUB8n5TzT5tѽq9󄞮({+!3 0zZB2{VDX"j+6F|oۿ5"PBr-g~XDG֒ ,7pVn$`^`8w=Ww$ #sM0`( ,pQ$ P(8EU%B@wE{3sk'eEǣEYDWM0q {D`2aZZxE};jMے O @e;GSqu|15; b=@١7=-|[.7fPSK+x;PI` OoKj mt|,`u޸"l͖ qקa  q[Z ۿd( ,RKQfZU[;^L) '~sYC?S<'K<@E== wΏhkpdD$ e`r޹J1T ̏h ,,W˸v4 {Gz.]OXr_u|p1cOkYɪkdz l aM4X^c:Yt려[eωؽzRŗ@UO &):^:~NT[e6B;oZ "P|*BSODUзm7 +$ɥY\t' *;ܦ̵s$dBLKV@`1+F|> R`2+˔V~J]rVkQd!lեꄖ'+jaR7,K8 DC;v֡h^FD v{dGbݐ@;v&!:#ϔR=րb[p`G1y W0CtJ @^8VhOBX)42KB%-\wYZfE .{UT^aKzc 3֡Sue8 nW)`[:nbQOQYGxBW a UX>X̖l`[1X+jbM_(Iɽ,USj`'k6!h6E S(GiwaU r!wx  4IK2[)S8-^N֕BV7ȱ"7^ `Zz 3nl|fa G`nT ;_!ծH+b®B IwyDN $u9N GUЇP)4_|,+;49D8[#/M u߲|X[kT|x]DkUN55!{X7+b_TӓPx^SC9Rujl`HQwPCC$yo5Y"(L`Z>z6!+ٸł<{J9ٻmJ u ,'V!'`QXBK1 bNdP)+׆D>qXq2 q loQ޵iVyCdֵ>)+E9sSyL`y"QɄXҒnjZ$-MBX [򣀢XoȨ|H-Լ*L͂ 277<qˁGjtws1>pqگxF Vv9 ׳1"d͠eyUS1UsLӍQ`8BN@7_̾_l,zo+H Bzԝڣ*+ȏ7D@1 ,=)W`=AeVC (^I*L`n,}2S'[xԽO $ Ǝc1oXa&b"O>}`:+Do~;=P%:ʝzصo6rٸ\^ Xekv2ɗǟ Me ,a @EB,3Z [Fs[0]K_E\ Epv?W "/Cyb)W`)&5v´ZCB%rdʝdS`}qՙ赢O׈C(b) /Ki"+۶r2e0e4>E afh#2 `rsn!ʲ#[@+ +㖆EVF"J{uf*]ޯAtCOїO`I8?3񇟘قWeZu: M`!o|+4a_F7MIuw²]r9>7Y,:EC)8|i(d$(UFhڳV6p[ ..<}DMlHk9ȺiUҶn2ST9<` 3(WO -Kf`a3,FEg$|@%-U`LբZqg2 ɮY7D`! K )]6]tyVK2@ʌ䥍 + $}@_(Bx j2$Je:Q;Xyk x+QQ6X+G`G sa+gb#=N ֣&rY0+-k۽X O=^&51caZZIm:ۡG*K!OԶm=q·F'|%KS@A `6Hƈ<^z,yoW[\xxܽO1vo5aƘXd!,mB$ zd̶r"K! :0'(ÞͥQ%L~ ZŪ]#%"E(Z)Z,vlнZt-U'v}=cK& b km@-L z-:b(jB ]Q%*_'Ȕjb<[FqPC\҃H==zCc55uғ bʞAiU:T=HJ~Fl}ĝɶv{]` L $Deo5*?ǩMh@']ٮ_^*&[E$״SEV$#430;[O-'tf;ZI8[X+꒨vm7T:•z͏f6k2R$H'z9aŴ:{yPmp} qH)Ix.)\ֆNFdh*j0yәɑ/SAg~E<,)X+h!L^OU/JϬڌ CqwM6Zd2fwM1I5O51vuǡxZ.]BjX4"VSuB ,Ti׽h !eݰL[ a+Xxqy/,=,GXQJ\ a ,f+Sr?wiUeG{m D/ĝIݚP`1B$+d%w?2~~:_QyUu*ds7q`v@Wf ,iS͌,6_<٘}-ͻ6LDdgx76]I8[ ߖ\ٚj[ZG9g n3}'(X~a}x^wR2BX,,0N WiCi`oi#3w׆ :u74:<";TW^ 6h[6cXKFQ2i @H`Nyү X!cL'bQ.v žwaŲ]h+rnمcU/.EGdZDFt#j83DZY5hJ_yj]yX-2PِOkk|$JB96N 2zKkjbR!M4ĖL M`1B |n]v/ƤAm *o!Vd0L߾7jUu[)G(\cEז\EHeKdql1#d!93 d: $' `=V1"X jAVR] $$a'P`5-d".)ʼn?yu%(%O,_y]rl( J;g~?kuo t;\<"ȇ)!hj+n/^"-ȗ NM|6g&LX , ]&/jϧYٿδ1[oAϿ'g ݙVi,As73:wr9-Ve?yS'ĝ)?d]1e0@*l` VS>Eqa?R+u@&fZX5ު_5D@;H4(h["(R)1m5m@D%zURN xmUn!p/uj 9UpjX ~ k#~5]줁`n(yjßmDXuº p,; ezee8cv /5 TByƢͧ!@4h!)P'h'{imgN.EV#Cְ0 5-V_&ՂX:d_׽I|[Ko4eWXz5? )FͦW-T(]n%+ ;nV?pBD_7O'*-|!͢7T- XvQDE͸IJ¿2Ÿ?g@d4 g9'ߋ+g?{o'UWj} L7! a0 $(S ?PQ ğA5At@ &ssNs:5uWwWwW=O>uNv>gz9)< NdDw]h q.g2j1LqůolGg9WMxѯ.~r*z [˄&-Ȑ؛d\Fٲܓ,ss/ܷGPS`k74qh94W)3.G%c珂PqrѮ4HΫkI6DXu7YE x/7YVBeݽ&+ 0\]zO6FVûm4\yCrbSC e=e4`/e' u87XqU81Sua?F0nl:ioN(%E#p+ddT|\?KFFM?쳰~?b/u|ds}_qna&YVٔ IDATԗ t{#!$X-Ui/X;5ӲQBI~1"stw ?꩕pI}kHq 6} N\/ ah2!ZEzUPIimL/.CM65PL`%s6 ,`1? ᦱ"*M`)[ʝ%QK–!RKMjĉkv>COe`HDZrw.@PwґIaJ@#M Ifzb藨 ,*d!2 dh;d%s_Yڝgjuj z.61QR>&C-[ *0]X "Z|f<R&t?消90֊vD!vIZcs$,|)=#w|pz|mdx*7ߧ/:s eh7(-/f/z }i}ѵӈmۛ؟ o˶kOt-UO='"rZQd`B2LDf"RG`5ǢLaY`Qлj SYީރWni'㉩dU;gHZ6eﴇ 0 `"'f߀tCU"0 ֶ`X=U0@:}HV5b9MMD-o1qĹ=?kFm^] vm~D,Dp곮r )Xe&\"GcK6*Yեb {4uﰓBW `2*$,z#k',@.'Qs܅.5HE{]D;L!2jJA,E6i/YgXD}; 1SvYvS,I>BR7X6xvKFlTB\@|$KdO:"k^_HO@r;1*sRʟ!j¾aޚ [2?3-_k 56 n~FL]Z>Nq-0TxKD=AbVfX8y$`H)9m{v+"k:lW[B'z]챦3^u^wj ]I&^vZCHZsȉ,I`Qi`Q6e2i&[ ^tIк3W u7(1u'@N?(:tc2E]7߼]ب t8zvIn'Y9+҇pyX vm[%XYfjuQsVd̈"e{7Fgd&He{ȱ"@GfU1(LeYI el=Gψq-G}{%fT!8U鈒 EdXV\u*ȏK1F4#[5t X26k ,]>u O|tXWU]H|qGgp?s+/޴ єH$es`53%,GXM*&\iPJWX.҈nҬB-:+o{{n'3UK OFTnZ`C^; a{E`kѕĢvU9 .\9~@G[X3"E (?*'+a Յ gBطa`G< 6jFFeVV$ &#r{kn6ܺUD\Jǝ {piVe0«8JJ]={F헚#?&|6е)b%XXsO|o>X!j )4$۟#Ǿ?׃.ځY/4(u@O+$(!V 3 u2oחZA3@Efk)4 j! l 0 ҕULj  kĮ4*˸ rsED țQ-gK*0$$*D^i a<腕(GT,jg!95mIBņ7?L[ s㯟|?pz؀BXRj5_1uOUTkl{|0,ej"W$dZ%o9:rF=@}%7sߝ׌ŧ/8nBƽ"G4Xig-_tsק.a+Y ܕ]͉ܫ"-Z<X̫2Rc@;@M:r=qtE=uݻ׻ 7c >@/"*3k;XXKi+(P3#k]EF),+9`d `T,|0^QUL`իbKdiD2 b`Oq4*$ 2ᘟ(j ʼS^:XVys[X1m2)1& 2YE恎@/_T`-;ý4j]6>Gjr Jd-GљE;0|SDR#R`q`{nN2.B9 -ͧ#W TP* JpUjhnw-e:|P Lf+p{~lяb YP`!kV'CmD%W kVoM9oDȩʼns^E~: @ oU@ۺ.bpppR]"Y HDZ?cv.n?J f` CR4b*͊6H* z@Wf6j Eȉ0az.*lRwGjߠ&][~/]z;| i9Hp!R`` # iz%-;oq,ɰyRmXZQdR1zyFݸ`?t*uX@XlSM'(49i_"QлK[V%^fR \R4sn'| D|%UA1َ*K0(,~騝 ePi rpX @ɯ ~g߫3pP4<R6--3eW>t߫Z LKpJBiW/h! ";*/Bj+Gسҥ| z羋;K-Brq#(oS޴shQUR,  ,;^n'//K6 Dѩ\Eht*a)pxK)Mlur(O5f% ukUxJ>cފx- *oqgd;tP˧т*vԱ۵|ţYoph ۃ8ܳ}P9pՑZG-hٶ.CP.[lwlu;# L}߼8T -&E#eM`Ig"֒E;줅7%t tٽ7 ]h )X`E+"^p)})D}` `/Ej *Eڱ'Q*2\tt qUdITrqBpZX_e:tbps1O=$ !Ҧ {ߝ[WE$?3h;N% &73۝{)-V`nSOc:xE҈ ޣܳUo'>@WZ#^mPӺAAIΖɻqO^F~mm CU7dϕ? ߗ\xWH27S ѿ w|ӟ6?Y?w#UݰiSC߻j716s]~ g+ȽXio?8֪zb޾m3Z꬛}gJp%?rUwzy-o=na|dһڜCtIbNz.9ctt"|KqU$3 @UÆ2`[n˄{3`#fUW01@ OU0zHU&AhڮA!?ZY}lI"iHDZHGAx0o8w9qb_hq F,+k( _reh N cmYVgXUIph+}\$7ҕp `8Hk:08u&"kNH1@Ufu/,o.9; r:q>8kOv9+ K]Hn+cppȼQ<+qsEG:Up>8.,Y8@$DRFlJPf! I 煋(P+< e`e}rvbo_7zѲ[[*y@/WV \M7ݴg%ƂKrC bo59!}q3佪rv? Xp)Y<]BBv2@O+2S6 )R%-fc/ˀ9l[ٮ;If+x9K#".ivU ,b !Qs$ʼ-h^I'Xqdz~?"?9P`@Eb>JH:h8,Q jVX%3dlD0$\%3[XS˛N/6C'Y_(#@FJ(B] 1]t/"d2i} \] i]kS"QED~ǃ &lK6@SZ\ȑ vO%Yt%~!VZp)028)AXSoԧ>uܹ =zw]z{S`^?ZS@+#*S'f:K&{334 U:DV|'}ݪ@{Vw𙱕t;BOU!L"Ee,6 /)4Ժ?U~QR) 5K`u͑pFKSy믿~&~rɿiy_.XgYT֧AU?+$cb#q'HL@Iٰ͑V2.ŒS t8cutKoCka( ]W`de9@<iiPxm]pfصx#XFEe:Z*XFMM4\՗L@Xq *;>7 @p2.m۵I*\'y "j)I`yMT8qyf' zC#IXӮ#\d]c) U:HB2H+qvS:'-()OWw(ƓoLli=8r @UpB) X<]>'57p,[JÊ&N V+'K+ljI[Sv}_U)3dNMq+rrWj/1UB@Z{Ʉf~cnY@ "˴tfuY:x_D ]wHy(ba}-k31k,XOEL1"WyE慛r|檄ˢT9̜i!RŒ/1)le#FhqZGB(8Ǿy͝QNE ժGĩ1nGϾsh2?| +"&_tǨ+=\VWtb te X%G\|֫.? à H rȷZ)7ܕP@")Nd28* q5"G C0-bD0hfˌ6&D$m[^IrRXY҅:we|֕79Bf`mOJOsojQsJ[q6awq><'߉㟆)cf }9=M6*BwqV @='ϑn:zB/CKq)*!ܬZ6 ,'t'w˩[tU 7L¬*&dڙ2绚-YBRPI%0Hp |&pX>}Z>0 ,"LAS{5T`T'Tpf!&zCT*zX\qBXj1 $b0Xn ,]Tew{KHЋ,ӓU5?9!xL1"M.9V llqS]LP MV20F{,T`iS!`pv(g5pBsc*f @Bc+/_qܳ]Ol\K}rJCRm~҇ @-PZ5$gQSЁs=5a f(oRU'Ba@ꄜ~Rz^^Gh!AlQ PXأi *E)@r;5qvja ^,pM[w}5jI68,(,4I29("MOK2qS <BHU} ! ĩ kXCrh{',\ɿ:UiV=!2̼!M~BˆbTJɗ7ʲP[m+V%Z .TRX]*ᗄ ˠ*:owyf?~<;Sm_rHc KZDSj*C{DLu ez"'m`fjZW `lPT#s3Yt=TdYX۷{Þ[_yzwd[2CU' X3t.~/XjItX+0W]6Е-퍩"`֯PT~:BK #Hƕz?Q-MRPn'{g6SϷHu: ' H; ՗*kXQLQ A38rWF$UIa i$v]QӭsuGD`X9o+d/m1׀dgFx"h eСtk,h^l[=e!LDZ?cBD2| l6vz|\}S`=fY q᪃Ǝ9Eg7[꒵]SZAՓ>ZUGD`I -{!i9^c#2;@rf ePU,O?)2<I"\z3>/_8X:b*1ڴ?ƘX)􇹘F x3z3m^HȘ_F%A9 3 JKj*=iZXM&Oy@=` ,}I w?% A[ք G) !5#\H`Y2׈md @13, ̔0ذV4ݥ^b@-sZI@WTY%9$U:J3_vbZvlʛ@Giy<.›ؖ`^ǑKi/0X)RHV=0ƥ?_'vnD Jw~*hPlQ{Ö<'lPUOʤ }nP LC+m_? @$xaT\C^ 2ɞm1M08""pί~/|D'K:}ev*80jFE2 Mk>Z(Ų3䆢c'm~+I2jl5?UKKsW LjHkC=D >m ü<лn>#ڒОq_q}^0_R}Mpg"C r0Qˮ3GHv6wJB K`UN $Xttv]ݯlWF%ƾ_b^BA(9`|OR*':|}ccсpґ댽H6~󊷰] Y@/!~&)pI"Euaדlkpm+W-FSA.>HAcXSFhR6\!Xd!+.  ,.@\.H0Xdg**!8ـyqڗ!mϖ'ftiw]C/<\{ո7Q-]A=ޗytֆ qTVRAC4ۢi%!f%QJ/)wIM%m: Pχ#;O|4S|#^H2iD("-֐*`UB[Tsy-[/i KKt`r*t)2q;CVBS 68I;_Hnbҁ=TŞL\0a4m~|dXySq].a_ <k$XXi%i>U`u 2*u v̸Wߘdy̫xkC a&al'$I@\aY< B*[X}4h)A{JDZ?c V $3@a!\Aw ,*,&iA`i 35 lN6!6Wy8Fʰd@/rpYYwI3ѫRUxUli;/|OrvoN|}MuǨ5BSWƪhv;Σ O3HQ^vg3!V>KCjO[|ʫLYZg 5UǷK$S'|)4-ExݼZ誨ßy˱} EL&_&e8 !E , `H.UlV;=lBՒj@Dzʛ>!}rN!KUN!]M",n b;^A!U:"~EyS= bPdw$EW J"EE`dAV!͈c2JF2io`V`iqV%Xm$6*ZMkczPMxS\>@I$.Gi IDAT٬:1eNڜgX~@ mvDђ"jE` ,Xe{UZ^0bP4têacXcNu.9R`0쒟 ǿ<ч~l=_d8R b*FH"b  M=V&X{b`z#=vuXt HH&WF1T&+_S`%VP(2F" ,mɉvGJWIMLDZ'i͈V˵C1+oPV]=+a≹te\lgliFJu鉧~+Ai듟>dn;o6X!aTT1!7[ jG>g~\W`חRۜĥ `= @c.N{5VïX { ֐zKR]"$t WM8:ԓy5ɡg8`\Q\qIYa0Vc'ű deiR ˂*Y: /Yp П@օl~PSs: #L7=\GV&:BWw\.lTTV:t 9tµZk/LeMyDciFA !`h'qg $8oXiBh&̈J(&PB+bFպ e`e=pAHFER"ҎW-v*F\lZn~S_M6b1T`o[}w/!Xm;P&$ƱCFWQ&Z}Wp7{w97F noگ[ַT`(@ J8L-/\{>I`}fұ)HVϥ!g^V9垃p5H"j 0X0XCͯBYU'qkVB|݅"qHYP 4e6Wq2{Oe( QZ<@߾+:m&#EcB3( h+_Bg`7L C "B9'oÌX{D!_ON4fb\<8ZřHxJ&O\c;;|Kx˖WʷIG,l*۳Ú#Ji-$͘@ww)׹۵ßOI_ [XK*Hcc i}{ʆOE0153ХVGQQX0OؗAOQ)O4]E^Gj _pif dTF0Ul(Z8KjVPOʛ@觘SV`:Ւ2&eD2Ee2Ϧ:5D^sfDfsxש@ n;7.NܼNo$*PeO)ŲXPWYu @A"G.feھS3Z} _/)z%E))ws&-V6-ru Tk/1+Ys_n,ˈ |t"+5P,T)Z :0%B}xD/w#], *kLN0U퐐Zz8&ֆ9Gӂ b!(m-I)I%N`Q.&LdW&V!8 M2oE&]q[+W9>to.ۀ[jg(R_(QVy֘ʼn WGN=Opas{ kXi@ݏ`_dn3<+hQT`!NçNq=G5|˻K7W`1+ ֲRR*#p味jeD{){v9'v,%2( 0Icr.~SqDÝlҝQ8bjC6־N~-53/-mŢL2G , $|Bֲ'0NӾحVײaCw݁wN\s5W[q ؛ZX0Ls#z&{1EJ3[S`,r5V`227*q*) NUޕ *&}[+r I.*Jn˗1zz| 4.=Mlːt7't(-G#b)ߌ6ݑUZq\S嗙ms+c3XtЏ=iU d]mYiY_6H\Xm&ѷɏf`QTe]v%&p# hIar\ @"r̽ك&fε懚J r8/]w:ie5UNv:,B( —Ͼzohy?G"KzxKifGrsl h< u${XNʎdߒi#'6CVe9GYG3)(Ff~쪄z1-Y_DKmA:ra=>&TNKEx^0oMrVn!3j)3\0_Ea)(R`9x`ʫ`YT֛X.l^ƢSD} ,;G{t8&T33_??k>-6XLtjRl\L{SyjV5甁\YX42G`3Kq>mA)\XTѠۨ~XґȒg͜iM]ʏ 3|dER}þ;+6Ux@g\e)bݷKqm ;+4SH#I6vrOS`,&uX_K9<=%ր\UX9#"]Z;~yyb;p[݄tUN݁wN\^"1t/}N4g׻_HR_jPHTu>ع*Ic:P0L]MҘlviH7bm[/ؑ]1KYF ,E 8J`xFO`\U "$\0ůX.K*OTDS80E*L _W I vwx޼(irX41[BA9c\ǜPxߊ8atT9U}w&l`Xvb9n/3_OFv0o.7EVg`:v^1Eor9uky^$L/Fvm&n'8w0_"ԕ߶nUom;o}[ouncUw5Q@ُe'7Bh:X?,]N4kX0gLg}qzgMgiAV 3#ifDOo"z߻+_xhЁΟ:Iuoݝ3?;o4vq-f.,U,e z9?&Ȃk)A-so!t*yQ\X%[Q"G%%p%JDZBZssM2.|^*6kw;WYX~Lq߀Q`k}/];LU[D)8 pSWH`KŸ):4p`FշDw 38hyBM'Ki_K*!XsXl+5gi\xjg)̈́'*X?y7d[z5Sl#Rڏڡhi?P q'E|9;0LY9˶^jҹǦN35gWPzF;ˠʳ{e߻ZUǦN&g3mfGElc7T]je鄿Yg ,pMAYLI=@*@:b zb {eXuk0 R 'U.XCG0i,z)h49XXJ{6akcyMUm@%2%ܪ R\[iTs`7H+ r ٙk^?`1=svݽ'OOEvq{e`m |U,jwkYw[݄[w~(;q``&]ZMR`tɤ xUԕT>.?;:5=> ¨J+('n%ewF5DLz*YWtX"jòK,N^eSڱ4ٓY4/'рj<D䑈kF>2ÊBRlD:R-YmcX !y#Y;dA#!m?wvG:ϭw;TЍ*]A/J+I9\oX%Hr 18]'@c,`~^Yɕ#.d`{Rh ݲ:,ի ,\,fuƢfփm r"x:^T˓Oc~| H!!tN@xj?sUf*h)h/f` uYֺpǧƺU0—LP~S ,_ӷ%pw&;P.@ى+jm?‚7½uI4WW?e] &U]]WM*?"I[}/zj'3{Yxh:mlIG(hBY֔_$,IF:[rjڙp5Q_ﶩ]5_ERF@`4D0Gz:4ʄ/:FGF{h)̐g O`KAf֏':eX ̥ٱC1$Z//^Cqn$ n3ۂ@`d_T}C$ 3!ēxgB3Sx"x^؂`OtZŢc )Nd &EMh #he}`sfx(r@XvL{s(8 r& nʓ@*|0 yW^~-vj^/`Zl΄^z´ΰ=f|=ðp$ wt/y<$^iy7SS;n~(qĕ#H2>loZzOǪGhdq=^x7a%OPbX|x_y^*@ O pu;3?{VϽ69r^@g3ƶ!Iqf)lzY S`UE@;BvTNp, D"XtO Ng ,s6K{x *"*pȃ@O X=>@`0H0CGYKIlf$"{rӭǫ{^Ȫ,"BHXi X.5?VM#bE]ќ,41.!T͍,HdR()#cd aUNi ҠKhFnMK+'hL[XBeU"tz׮“a_TsuQ/kgiz `@73u ,E(|ȑ cr%*_%{"a-nUs2YK#V=̧_eӻPkE*u#| ` :oey ӹH|'hO Om$v\_(QD7,1 &]djFޓm*V| ޻?A_k}o֘u\V@wu}gՂ]/\eй>EO V$ͨkqK06B^8Tg H4},%]м&;2_5ixe,IaVo]k(dr+:mW"'k`$l!ãǽ WKao3o(&@bR@"ǟ;_^5n޳\a(XmV%6~WL_yZZRfCAs Z[B`%Q Ԋ4 ,-p9'D7 .n̽7QyI# f ^@ls~!^HskAa6iy#Mp9@ƅƒʝGnzmO> JTxI] dZ^*KG,-2>g5铋/>|Zm9qb'),#/PUa0 o |6\a(?p**-Υ){بN Z\02qO7q, -'5܃0໬+1/vN_{ҏN԰0s+zU`; 9F.~ ui>q7DhWd-#q܀t?l,# +HvOd! qXY$N .d;3DwO5xo|sY~!!蛠o>+b %5(pXcX. z6Qn \Ŗr\ǝ]x%I0F<.%g cKg?~WΡ;uۤHؐlIY`?ĞCTзw-Y=9j/Z;$EhBM|l)BH߹W?z_ F& gB9Bu:)0.,Z0.fYi5:QEPPDS ;i "8j衻''ҽ6j,x ,^XS'?;9^G`A~{X }|+*Ui{t/wy D(<jMܿL>~B]?m0FKS>WLVФa`^' !JK;îbַ&;P.@ى+Տpo;]l3_vmH憗mWu"G/>nO}o^q Yc^_7:I,*է7.I4WPwih'!*|jN]D(hGv9?w[_u`Ipgp0 \'Tle,B =XVi zn0\йm!H2,1{I=-^2-<& y)E+/NM a h2P u*,e w56"j^5W]2%@FP?WXBv'z0qO,$i5Rb<6r.  sx?:t[JU64V q7MW%⎌蟐(jYa1Ջ*} \2Z/ЕV ^1y蘜ӥX:EB'eS0Ve/8^yVD!_s.&=wj"bY_fBϣ=WQ1ɂ^|D5VB.|" hO `&NiEaZ?PcqA]9%W*^؂<%J(Q Vj҆IWZlsgӻYg0Y+WѻeH~]fS/O~ֆNU!"TW'Eiipb*!eVRC,WĽ"nN3X6&Wlރi|VyBCeBJ1&RJ[bOI囑 ,Kx%6\FmAo @H7zExi-&iR@Q8mg]??՝,">a'3Kr:X%e:IVGf Ѡ Z%ke$ZRVW`e,c&YDRyK\ce97[q$ *i tFGMX۳_7rnM1LR)sY~_J[/4\b1rkqOG+]Ed(X.|_Á D; {M g,ZjT[i'3^XbVFթ`8kpBܝ;ҩn{辣|v.V='a'ǽ~`e8@oh̯Awz?GnZ,TX/AlIE%J(Q w0WZhsu퐒 L0LlV穗Ѝg 9ys _HKlAnS䆛#c遡O7y؍T:T"ǰf-pAxڼ 3AMT0 + q B(a&dZd,% G+] e-5]D@ժ`!k% {`/t{x 8?\ N'T} sC(uH1E̅2c2d6) -8ڦX΁f GԓY*6 *fڿf4w) w!QTS~>})w%qd sC-0t?ZA / "fsX crlkzj5X-w0 P>U{ Ut oF9Ԅ7߄h.bՂp47*p){EU]Q[@6 Xmh4&k!Vv1V~q" }[f6 9dOɚ,?|ʹ֎ۥ2ew݁wN\~7^6<4@`Y WHpNd, zjW˭g糯`z릢"B()@&:M?~n_{7"S̻$q s=_6"b I8 !3^&@ ƀ82] Ņ%2^oQLC7Wﯣ`AI KtgfP ~@Xb)4҄IL ACUGID#2b#2=*QDL>؟]EOY쯁*$ud5U^~g6I? ͩ_눵t"ёH j8P1Ń9KEYm?=\@a'-X,?NV a), ]\ao)15]tRм^GU>U6<>u/`Lɭm3A/= ʧ~Y_^&ڼ,,5( ]_q-e? Pv⪠,2q. A5rH[ :,c&kZk~jwZM@XnҸfXaw@tU)N$U`BNl0 =EB IZ `I@Kw` _v[!{D oc?c3'4L;--ܖ6+MgJE\\8:۩YKp. E95b!xAdў64Wd"k֏jNS`5=m=\=%\9O#*7}:C6`!UzЍg{`zȮz,S/^C+/<1tn<&n:QL\eK a%J(q3kwst//w^?RX*DH]Boa ӽWn?gEK`/MS uyy IDAT:l6L3%gcܐ~/3Du ŘPCB~ZIX.8x #`=C L2/mEiGbaak8H`Y0~ϵo?sZܢeQIˈuXNvEE\r0C$2P9mN[Vu=׉!3e;ӻrcLޖ(:ח;ͣf3JYtrM7c^=OxFa+Ҿgġ泯1w򻳧~0`b ~>FBq(i%J(Qb B-Qvl$ P=O2?+A]1,į-r0f†IN.LX4b҇PmӁA^ Y0nJa"pjn{z^0VIѫ{};aCs@Kp+X\53_gyPHNhG1kRy^|P;Mՙa5 Wzb\;k1H`ژՠ-뚾[0?뵔k j᎐#1dNFQ:_ d,V3z`kpQM"C#H\Ia+Zj?!iܥ'iDeђb qM-zX~p<84zff 3~*!9ۤe]="p: @q#Kxzxa:n2{ƢkڊW޾Ƭ%PU ouJl~(qĵ#_}1>ͼ4ʕV*V9*L('EU` l̓DLHώ{4rW^p5KW/mYRKe3c `7c)cxʫ 0NVфUa=]|7ũOf)/5мT pΆEXI- :#Vbaj+6|^8ff}V%2XAA b2k%M+0>\d$#ÆCܑ+PXzy̹֒}(ї-]'[Z׳1T @cS:/ jGJdg!B(\ݤ3__ >9}嚑<9jS EW$˜F,zd5nheuT<\7 @WXJQЦ  %K[uSc|gc, B1^`**2,By+l"wxtu ynwڢwʯ)n"|LuckmO+Xz^$ wS+/< $,ӻO; w eS׮%&c_/E8j)x[݄[w~(;qdWW?Eu!XSҦ 1R77>kw{U,KHx IMuT* D:7m[HʤWlfSe\UtjIKXi L'Phz36%2`l@E% k#TyR-u1^ |ⴄM2Y l XAf{2hR\s6m {Eð k5Ja+V\C8( >64ִtЅG\ JVX}QC~ 9& /g!܍ >ؙOfPEqN%RrkjN%&>ߤ0!51coh}hU40dL Vi T5c*Xb .Hk!U@ Xb (q0O*Lp jma F"*fk/QV,*Z 9Y[C`?wlB z <'~ K75YE ߴ`߾(+V9{Ť˳)y?dՎqx5ƽ6GUqeU%J(q+!Bq7L]Zo?op+b>8UF)LZ.XwFF:\?.5.32AZ ,n$Z겑hAV/ȋ ˷ܟi^aEd&wmX;Cp N5[~;LpD< ǁB+w ˿$%L#k^cҦ"-NvD-#!do~/9Xf:X keR:u>0ߴ_@ e!I1oPM+'^OS)=0˒d @ ,tפ\XU6\J2|yZVZT@ hf]X (ԛvx|]eV>^}Wg]vEX`*"q>w;.QAf,]Ä;0Z]qhy/{^6Խ-i)Y0>jqlb@n2veRn*QD%n },L9F]}hBsX4O rUמjw ߁i?ϾS|?II6tlI9P>~ssK,~7fo~e''N>eSTK<&&} @!# IU{+)wVXsw*"F @#Bxz*4(?2P9UUԪT_͚v(%G|*j k >z-nА|15ffdF?+e`H?ŵG"ǁ?jIWVZ:-7蛞ʵe]e#|[#sw);_lO\5LS`I7w[#"y^2bf PVĤ> j0"SHFg(b̨%0D`B I Y׵')t.Ln]  Eְ%cG;9.õ?z[[k:hrU(<> &b+1Nӽh o}-nNS< ,>-̛ B|b| KS`i?R BMeަE)!/hf=X3-aD1-&"=8LԏaDK(pkA$hƂ+F3q/)&O y6^q3;w*aF FYޱfp[p-20&[a\wKDZYYKwV޴uk_-Y6,30  ?}20{̘7,fEm}1Cu:[sww1 ar\1%Q}>2} 0R!3wVE.`R` eS=qGg?:uTH5G>-VF\4 !qōs?6YB!aI=uLx8YPSA@-; *)?LsG23gJ!SDvH  "\9rZS"ZTxU NYL2IQ+|\ YpRXNgmB K}u} ~?H_` &(j}S|Jp(!+vJyS`wL7nΉc@C 2dcH9wtݸ8̘Jd`Q4q=J_w*+^Q DaxyĚ.Zx5:]+xpB$'KyQ%> /SVg7\d "jTY w nJ*# (`Mg J3E+W`3DBeE#`X#:HFh:T`&{ =BǍ%ϳ* L3K1I`EW_YiE}K2Ch pU!#%yd`uX"Ɔ42ny߲a-p7 /X).<X6"E)R#D%u4_RtDp/zΩ+GLr:/]-/{c_m~x;BH?yqF @#k};6+lSsχ Θ )Ev,)D1˲q13vox;'B - @(Y1KMKq`b-3{VfFx "K,核WXf åR'ΝϷ:52 Jm(秏Et5#ss)(≄,I=$KfNed,3PZPQdU=R!X<Җ;" 8a3GBB؈8<y7$ZbKt@W} !f!8и!1R) 2 Nٳ!i z9e]^ g-հО8 XaۊNeZXg#&Z[Y?APŗ\ĬJ+ x~k}D/*R>LuBU@:t Z~=oį\5xpg JXr!s|ëyޝjD`qf{cjd iXlrK7a!DЉg8QhwVI*#|0xϲ) j4i5/C"^ $I5V }5Zx]klȄ3M1=9SLk3۾?y|H3rVQ8nW-xnXs˙.Gp!7G KCN@ ݿ8?tJߨX5WP@ bT\2"*1+jR4!ʰ8u |k=J*!& ,-llQ6C)%oĬi-/`EB[F ,J;n8~<]fR'u9l#4VX $/U~}~<9X(_).+XG\n%t8A\"Ц2 ;\Ϝ1shw&8h٥SZ{s|z,3S~-`j, cM?Hd@_α\Or@@,hPܣY#޽wT`BT`  KK ^ mI)SAmܥL8XT ٠@* nwI U2se m*h8ZBB)܆]2h@IoZ AڅNzx8*[/dJhPZ#q\XDU9ڰ&'du~n&0y *R`:S [ٽb@zSgj7 v_DD>"EXZ_*t|szLs7ks.:LYw)8y^-͜/^UZYLbMnZy'6^jh ~X݅P2fJ^~lW`Y10QĔȖ*9E1ʴЀdsӶrV ~TO`ȅ"XvSQ2$`jYe9 c=v} 'ATx. fiYXy޽o}ӟ>򑏔r|[og>}X׈ֲ)RH" \-Ϻ~Z̸!! |&挬K^FlzmQJه o>/4 ,hw@,TMo V{^ȋG`i#Փfg-NY箃X 8";]AZî^؎%C32;ϣyrBj ,ŋMG*$li.*w#@Y Ec5ɫTdSUNMrHe4-p:ASBH. gymh^^9 \|w ƪEL fJ\7I ݜ7ϵo +gYP\(?hqRgV8^++@ḅ9qbIF6,oCi@IQ șn8UD.a!$.UCW8ekAzД7Bf[;1 rTeBc n2A`9AA&FX'9yW+ H^2ϬbqWOBy=9T/}{/{/^>?uRq 8Hq ?=5)C#-ϖbm'}AdI1z1@/_๭ce|PJH^8xW+8R7D`ѬG9;޿1LBqξ+4C&hVT?oː6R`y [h x y6WIiLݤX~f!.jq*psuMU7X^M֐P< EgL Z1ǜgd~t̞sW;\r&I7Xԑ{~oyK2" ")ׂJ"[@TOVgH;. bV"" ~`םqY"Re"#6y B[&2C"\s&# S(LpgsN Xw2; 9BaDSU q߿?qcr-@9>nXj1bv٥h!쳗O5㎵BU@:t bV@EUСw-n G/,/Gn. fYĂf2n/+85bPA7BXfvIv^ X[f22eY@$|vk2W2K4Mkߧ^ 9]рM]%!")U!K:وp(fIm{VW܊Lrc BsMoM 3ڝor*6W]qӦeHXk[L,|O !T${5.\(~XSHvԥ;]\:>(:4~jvvǯ=uG!U0Xz05IX?ݘB|~:*K/--=7~{f^ubLwRe*F`E1 @N)@TrcαL/=qXNd'kq֑:t1Q[8I!Q1ʶ2* ^Nh!9#Kn=g}gYiHPqM6(thL6Ou͚D`u(TySv햶 ;9T68#R-VF52ʕAmj}X&{ޜѦ-N-og@V%^u9cn=LCM?xy/D;Æ\-Erpe3eZsssH|Z7gy/fVnQjo" cϞHl"8cjwe>|7 @y@2@<} 8U^|ﴵ@X~ #<.z /Ϙ4U/4us~"ńq7[oNJuɽY,d3I7؂!.ˎ/s/H3K|d`1oak~]~ܡ\n[:J4 0Z Z\iՂ&u1?~'~#/mYB pO.#(=SrٰۿF$ЋVq^bnXv}—I6߿_Jm\}]M , T"O"'َġhO+监=WB8otC,Ve{ڜ8pe`-,kH]hs H&9gc`:.~1"tQ>+>yw1{*4?m-̝At=zZ.}O? @-g/_kŦ."Q;BVqg0ƍzꩍ7%NN\"rgy>o,%_/ؿjx8Hq 8//=x,z5?4rXn}oU^A~F<Ŝݘ-&a /g-_vE0d]+MrG~ܲom/N/&!&{U>߰.pSm%xyz-˞Yxͅ7 ?>8+,=3rg#OSKFfv~l&nʛ_vO)?uƿՆNw0sͽ҃|b(}^,? Yox\̕w晽CE=_Nm,vgP?]㓿zOv󦷢mLm񣕏sĦ_̙>)[.?Pg_pӺ7S?オtBvahI/J~7_'v[g=7ۨWo,^H[mwUo3 }ًeL͡_:w?D}V< 0{;O ?'sWNK2&?w.ޓ]37➷KqrաSW~׿ cPɝ6];2Ӈ?g>oKj}[ů nXBOw藂,~؜_/:`Y!7z,pq McX{}'Kzꩫ^M%(D).8qx!B;@3kH{ )@̆^aUX{js.1^ Z^Ƶ;GaS(-Ib4r=5*85?`Qߖ] )ťxGuDP2T|5VpMuOˑe+1V8xG:;6YtfqI,"1&q)O}c!ɋ-7 T Jn ~r?l'oCI`i7RH"EAEl_ŲYv N~޷\2c5$'m^%8+GX~}Ps"YiV{չ!]>2|6ڄ6LNAhKL>(2&ϩ`Hz*44k.+!` Re`%"6Y QzEgxѡp"0YBS8TD`Œ6*cA;^Ƶ3tMltQX"jX2Ê{\iXM!US!meۅN+trye#Jj(6^Ɇ X׎L#%?7`ra)yT!#8+PAxb o Թ3.Sz;z9#[GJe0gsbѬ/BH ,(o(YiF?V ,+*s.%;,F mk6#B-$EZDTθGs&Cn-`m[iEEȥU~rEAlJX'E\fv(fC ;5TX; #["*AGaOyPk'vDK5BjvĠ*WnLx;Y˜&MA#v1ke΀#*TJƵ` ͎,sxu{6 PU+k,џu?)ĝ,;꟦: . _ch&9]H Hq0  A,KȜUޛs2|=X3OPN#׋MoGndq~VO~ΐs.B:}uw1wB'p s_-A`d[~? $;,#&TKt#(Rx4.2*ii*$b:bd5BK 8Yt@I-h&o=B[P-3nYD2Z!l94Wd9$[xXEYܹSfu<ҝe+D 9/x B$+ӡ,?Iե+L]X`+A/Oٷѐk1- T%; (WX·+gElUYsy9[X˒@^lQ9v * HMo ah)B] )ZX 91ۼY p; !D75DrП~RQ ;B !Z,s 7?]+L(ʦ w5S4X?UsO;C!)UEcAt6j!v 츅u26]mM&it*:/ ɲo~/!Of?Oyi' jEYQD`9t߫n 5E,*E)R#[_}cCfc34;/R /]l' IDATC{U N~%\ֻoࣷ$;&nLd_8X6`MX!?!2).&Xz ,&Vh6* ,473oY*$$"j\,@`9a`s9Hcd-0 ,l( byNe_89'tmʚv3%4U9tr%|; )A{s2:BZZ2h92\P!IanW`O´6_$ն㌽8?ilzlei?N!1ѩKeZ c>펐##9Yj/9w@Y,M`-YҀ3k~J9#kw5QCn *+%)m"E)R\l wV?XP-VW 1ӕ~J/+GVNe7e̘^| `I1eevR/'zy,5}<%X&kEYHeo]DBIف7SCDA."' VgՋS˄pqr><_#BӼq7o&G@q11NU>`՗Jb#P홊<#3Ķp|eSJRhc%]Szs5-0X|a) #ӟ|O+c:Y:IH wSU5 `Gnܬv1YaLD{QTV.a]+Jo+Z"'`   +l*̓ bi{f֚vcqwuRq 8H!6IC8E+ݪamenLq5DF^#VjTs08:DvҔXIA9,ʒӕ1͜1GNӌB/~ U_B"a]Vwk^"HnTXA,BV_ޡ2DQPz^:™ y!ː32٭ ,nN>ʼnX&ۛqTivQhTrJh$;AA(oD ɹɀJ+^{Q[5z@] ,ZcOGqU@DQ(/رnu0{g.<77 ʡmb$r-Nx9cGvNe`V6 |L2&!: A`߰wTSXWBOPg95?Aէ0p}!%fHL"E)RX~rz: 1/]]9=nw1gTWODѰz -g92zDaw\$5 D)zTv:2AjŃ9@^*++zX#.;,Ӛ ITZDQ(z,R I3X h!Z,q$ymȴ|dZ3JKZrЙ>[h(+*xiaZ[U-g仝Mt =&:$Y9z1恨\+d"sdtiZb 0O䒽ZH{ͺYnS9,Z_XF_TEf/`0*RH"E~|5O^Y2O~Z>`m G[b=cS*?@U1D%[DӶ.BMV~ ]@?GXv#O"hp}(K/S%h*G'a$*` }v a׹LjVP* !!h2n0JI`eZECEŐE Ǥ2qR`1t08!6VD`ifзpέpYwv4vd;=LlS% 6O(˄0: lN4\}s[왹U  ,-ʈ,X[P &\6OG:)CW1 uF`wWlz#%|O8+H +BU@:t c?֧g/_Fk>D`Siw9p-3>jj3F,hN0kiXr#~s8F]99Oq"A @FX Zkm\-d $(Ngvr_؈f΢ N^u ,b!"0`8bȶr.%=4OxQhA4AΠ-Q0ńW #5X$7O!d."ds')wTVRqGl$sYmk6=o-WvLT#6D0u^#Hue*Z ,=]u.FNc8^X;7 a֐vg}fYE&BŶ_8!BJ`!u+`rrrb` @:X=p35D"(#K^Q.,}m(5F]J\]?M?Yn; fhbq0O˵ jQМ_T ID;3D/1O3h")&sxб2n BU5f7X V"V>/݌R"X<ހ,l9j!4ID#̸U w{"!jA1V8D;m! H` !'IEqN}dKW V$MD>p"=G +५Ú*2Dz`nLq)ѴU*t8A\WmŚ| 2,/{nՍhAvL?Ggm14g-O+Ǡm2^6809#,ANqJ8fN99ODJJX.ZŒV)ރ+#_me5,`m?Vxdp3$q1Z(X-xn J |m-z7G ;U/젭xazH/nO 2pوP̖JgB5^0$A?Wy;"ں\"2D#Sl2 FTeq RXYiqVv@A"oΗ0Hƙ@C@DQBDdjL!4yvJB,x'N"XqFBhc KK쮜)Q֩X"L2@.ڮqNiXiVAUd\ly S|wk5% +0uRq 8HqU߹}>7Glb];RSRS#7f+Np>~;+#ׇ ;腗^0Sh4J `!TA0(#~!1ɀu6L,% @UC~q@F ;x[e3IBD-&22%kH ҟ*#V(|=vThl(@@|> Yh!!&ΌwɌ7lݖlv{&cDZY₎d^6 ,O$y)LEе@" )KAX;yKz Tw0.qk݅t8A\-1v\ԫ-gTU4abkY:8>v?ַƧ,3άu\ڛ_kXa'x ^ bQqlAVX$YT(4G !(JzHX*k 15Xq-Oo1! j\yJ /X2}DĻ=TL3>Ց$cZM? _OOWNaW)RH"EbP+'Xf];_# `w- /)ҵыS̃ϸx,)89O8v5կ#gR 2R&$S $QX&owi'_g5DN7؈DOmp|م4t@)1NG THr\T0W/py [oÞ="LA88V`qZ"5^<=Rc01ֿ[7)nlR6")XBhR a_A/y挱 *RV!N"E)."նߟ`ME`.Y+Sj%\<(BLRDyL@j57&+lW\[^c6+ℸɟXɞ@ 2V\pė=Yʫ"悡;%DdF"wX4e5$wMe5~'r^)1 FJXecv p4 ,/}Hj0:!0*o[ ?7ΪMl*"Ve="R\z'z~FJKHt8A\ľsK6,bڳvtY[_U|uVzف.Xw㘍\fYPt"]r.QtrpصefMg'(ъ`Z IMIL4(KbņV".& c#O-%i/??cNLBV31qwB'өf Jo?t+bA"؜]-X6bQ%ʙx5grW2E U`Zw )` @:BJD @WOKl{y6{9$txT]jYX^<*Mo Nop_.}n)| yD Kx!_ݻ"w\1%`((<܈KX^Η5Zbup}xzt!4GD`xH-G5Ӗ+ U':bnp_A+N`9=3.wd`Qe+b22a a4h^t)gu} 2/G8WNah)RHe7^!`N"y,>vj Za ´ZbV@p_+UdI(O?*;!yY_^j|%D b /'IT`uCQv܈2)i3,kw>@SIĢ8j8SG,y ٘ bym,2$R<鿷–E$cSxfoyp2:8t7P] 8R\2 àV!L"E) zW0ݤ-<0*l׵rX ڝo 6t>pX^t%^,V}7,h5<\z&H[W{WIIۣ_rEu}wc>|D W2>h\~h7¡A랚]5QȹvheX7c8e3]X+d"/o9f{do4n%y%ld!4 hP @Z72<Xu/sZ뎤XR0?ֺ )V8q*h>4ZW F1XP{sfJ00]5aXZ7΅jF:l g.tg"qɝok3vNv k N3]At mr{gY⽗@FJc"1㍛//Z;;'|"z 1gZK 4Wh͹70Y֞q.aM s1BwKV`JdgCV!K}GUZ80Xӿ+ő#G^)E#@:tWkM İa5qw{xЋGQ`i,;XqC.`@-x%)gn}XnhuXD4˞BRI1'Tϕ)+8)GI$I VD~u4]6ٰl's1rT`4mKFX@ +C[ "E#r@B\sMZa` @:r Đ R;+3ڛWGP~bb ,U׺g& +aMh2m֥ q? ;9hX޹AAoK12F'ejsr؇ޮsg(k(AP$h bb.KeӡfI1aqBXF6jX˹kUZYnUtDT2E'.<}@&B7'=;{!R"%͟# E)Rrd`ByX`: g09<J\dX`s֬"a+J%WBh8;rh5bIV-?#|] `%N fX&6~YYv^`_ _VX6+Z/upzk3]='r׏V7ź@zxS"E)Rsgͣ#3h3/Y$[EEѢ$KX--ui pv IDAT{ڒG=ns=nOȞq[V{bʢdӢHk+QĽZBa_@/2rdEF|ȋH ?|z& eo8*#78=wq+HQ.uRSg~%X lSB*S=4p@+_ȩ`;BZ6vX^ZCήBlY:dUV۫:pPKWs1_ć;~~Vv&yG}JENXlLznHl9´2Ƕ6o 0 wOYd=w@l全rIv ԜN-cfZjxӍ@k5BK~T"E1$!Trt{.μsͲYR{H@˧; DWzV ']NVqR䅰_[ `znNF9Kx"Y9ZBr se _9MGށ0 0LMY݂Ss=wny)y k |p|rPJ_Sj{ȫ66o!﮶ G7@lYo3tf%{un=t }itVj*)`IIFz}_UJyO4胰nuD>[e_Z:W;yۯZ"}ԩFoq;:.344k_ay)!ˮ[E(glw@GִϾY thK Ugϓ,5!95=C?~W,b~`B,su0_xl[٭o{Jk$ T2oӈ\/[R؍r?ljGRպ*j.FcՁ՘&>]ԪEpxFp)c_Mo%B({P>qZjc8###\Gwut\DGhߝYDہjBrFDc/ ZѺXQ5HEtV/shrPϾ3}9Z :O04s-~BOKUM/AW6nW.,Xᒛ$/rƮ{wQ\h[uV5c>y :ttP-^8lS /oꁔJ o H YCiQ8jJ-0ut\GEt<,-`5f@tŅ@ XJY㏂,a`VJ-]BŸc5<@+y(<bfYS!X X=Tl!pWgokD";=Tn²7,BѯX5Qo̽V2@uc^Sk@ BܳPit^vuv:ޞ8 @.T(9@zEa,W3$e Vago 0 *4v Ōo:gpZE6ç{pҁ8jU=ޚ>=k'E:lɓYӯ\>PU)+2̑~.I?z<>(l aKk%X۾+N2vi7lLEP Z]B6m)9-U'Ӆl;lt\wy߫ X3 0L}hhDxVo;D"|݀2e;ĝll;LZ {.@ ZSbRNWm:|k2,lJV(5t BÛ,5oW>Td֫I_YKBܻ͒~Ū q/BX;hes 0ˠת7-)R#! €Y(,J/*ů}B9i 8鐭N<-0ut\GEtF=١EX ^[eNt:j'ECh?,]2i Cv܈܇={X}F"--!˧Pb"s3jW 9VC(WIQu0XG3Z8c,C<;lMAvQ Ee54~#d.v5-_T3O;,VX 0 S#K ="\.\xBp΁,:XȮ[)5'|0|uOXmR(>n}٘G2j)UMf׋ gkv^PZs{R_ΜCd_oɶ?7~zj&Pi/yk0Xҁwߏv چܷi: y+mh'B=@DgaJ(5g<)z>Avߡ_TWb`j@0Fޓ}oVb,`>.nDC0 0; BS*^0| V=l-a61 Bҙ)T"0@-?7_^i0B@l<J\+c]?oչ`=Gu$hl:ݣmk9|j8n=p-{ʜcݑ_. յVCR6qܳdq9`zmƞ@@zbc%V莣V*{3ȮPjV.kKl [?8~?TŸSlTSZaFv3HkPbBnruBRC>\p];pь6A$Ʈ{=7+YM Z"#_Zz3RsȮjIxZ=0 Ç-C0zn^$)BCD`>o 0z^bWHv`>-ݺm z`jp]".bc UKfSKt:|%;n4_??KHw oy#Hv%& 5"hUJT\+`Mo >"_J/}浃u Ҍ |Vc>6xTs1W?7^vhKx< \ a?s=1f)N]Exϲ>Y:OBz)>_Hvw,)=)ޢ1Npw-ݺFJ] FGKȴ\Gwut\DGmȏ].ba@PFRsկٹGDd\RrX7ɶCd桟Ȏ՟c)f."ۅ7@ɇ=S|r4ہ @_/BF0CP|~#T,bcg`w5?9Ɔ<{|{˷Zx8 " T8Xk*D̃0:j2hly'| ݷаl;3kdx5%vޟĺ}w7C?cSQMܷy[Sf+Qh((  NHyJ/PzfU" iqࣛۥfdwIה'N4z pp]wKc6EK$HEqZ'n+Jl#P<Uwpo3+ggM}+aiB?;i)}YѲ%'KEϨ9AcϔwXWf7Np/ cexRsdz4u`UxYh%k{dx9 |]DI HQl,0հBزNmB8m'5~R /Β/NJLzݺ:U<9i-N6.캩MM~1֢(s; ©?&?@p"7cQ>m=b=EEO!XNV˯v\7<n;@D\v f3 ůmu:2Wh46L܈9Rb*zBΛA'e【i|12q^z~a@c&Wfdd[`.q?v gU"V.Nj4̰Qߵ:5h: _Ev`UBQ|7]=0ÐRV'PO#7 ;j{99kZ߲D*(6]:B-_ʈ>=AܯD`W|12qG> 7Niooo: ":Ewf4/IJ\^i+u89)wB)vTMRs:&"< TB|  ax Ǫ;xYovTSG*`ڇ.( *J ϩHP|"y~zl5bd|/; ^*[aaZO|j\r)|p)5Kk[NW{C"4E50epȁ@>` t2˥\[G, -_ "-WK'ZGe[d\ChB, 7ɭC{`(lh ^DOc ->0ۥGBaa#<!X 5 `c‹[~^EVȜC5Z FH/ Dp7jc*K X˜#;zGwaȎ K-pnSBZ ؅B9 +{/AvDyWVmfkO0huk.300ܹO#nArXއӜZ@E&ዑ)-y?Oq_o|R9qVĉ\Gwut\3g.b3`?pũ^v)5'|ݛnɎ{ e/*zRFU k JX)޷q+)گmä!=[[/FwPMl ,-`аjbXjEJΨ7G&{Q/FCԧyBzP=uT4hp{h4J =W8O%)-J έCjP3vl:BT^|jj+++ +xg' 0 0; J/RlTVy*{wu˔0w*r^(Jy^ḽS4Fgz־i$/0|.PS.EF"P慇( 6r}y_}u1Zϸ=gnn^6AŸmUa%{@zZ~-{Շwd/}>re͛3/>$[~kSdvpv62Fc_{|}ޔcʷLut\GEt\Ax;WKˢj{W| `'R^au6ޮ!Q5XNK^.sk^m;_:`ZBce%#P5 zA bd*_w=4RpӬpp]u^!,S#)\񁔜z nvs1XjZ,n?E_^d-5A&C#ĖX (zQeIFS7%`ZzbWh v9f@ŗAjS+SzՎ |12婫7_d&t|ӟzaaaВA@u36kKWMWq#k*pf I-@vU5 Be(1~>urnYk,j: XB)~M)D!z^,}@6t̐v oTpaU;GDsgR8/`w G sϹsNZ_lN\o~ G0 p]p[cV-Xd=~NVT6:Yƚ@5N-l.K]*-F+h岊Twi䷠ҔUet a+ Xl  @l Ovf3@`Ng`54-u2h8p]p[1Fk ,T%`o!` !d\j= @ӕۉfH=Sv1WX[D Xٸ5=Fu1~@SJc 9d:}CF3zlVme`9Bl#lS8vX8p]p[1v2q`, >7~u1=TO% X8Ů@:24 i-Ӵr 1o.P r,k;RV7/;TȎ#:_eIv 8F}ښff&b6z 0 0&3*XY٘SG J/nʱ~k{ym v5(9?䫙=XrSy;XdM} ( 6xG-5MлRy Fjn4X9(6 (3Xnp !0 0 lL !P8CTaf΀_ ?ho -_Qs? X3?6_~JNŬSƄSj&Fab-wX1t*@{Bf`Y׾P{?yԠa*VS0 :ɓ'.NaX)JLZmT[D Z#`M=yPX6HeVJ(Z8MI#v:qĉFoq;:. "'NSXj%S3|W]ś߇^3?fW]:Sn3PKd/ %E`<"4l {NE_.غ^VV.lV!cc}"Џ7oj !adW\l 9檀C!Q 5hM~[-U aaf~HT)JQl;TϭC`twϽ.xD+˳!uC8ů o't^+oQ,  :\ڣX2vYԜ!bʢ{`e@n.}PX'%&Kw 5H2u,aa DWS3 Z>DKQlL '5WfVV cʶCM7]?7uVEVuo+G_<2/s 5B6 Z~ З> Xq`AK渫g=7WQB) XL8uT8p]p݁]G;kDBX "]X򗳗@ױ~]|q50~Hv׌wzm3^sܬ /b$`xwb 9X*v 0ǎ&]-E˿V.BKp/t`+BPEDŽKdk!l"25,N4z pp]:u`'rF'( ,B Dwa _7^f 㔘( )Zxq84`4`C=3Xva#TZŨՊ!'(@ͿXX8a>9 ]wbgm/FQ'3@Y׊8|]0|YΜmĐy0 ?ᛔT4dֵǴrt~ t0+jqLFXK'nH`͖ګ%CA]8w Edj X 0 0 -tWNa_ٸ6^FN}N,54#nAiP-*c2`yW-/6&˚x 쏠Һz'fQe`~ϑO^,3&lY=z(9cM-_DJK2/`يeExpΩ^,YZz϶+~4:qFoq;:. "]G'nJg_KkQ?EPFl0)|GYJ/XsςzmNĤ &q`G0 TT.Fk Ȓ0[Dp3NCiWGŢBE4vR}'e];dMZv>X)d!czns~SU@YGd[C[3Us,@qZ|7e)!="8Ik"2u,N8q[`. _GcA/XZYtQ kBneFm(=f@ܩMLvhQB X[Q=柇3eaa זbc䷱6kuvv`BґG)(|& VEΛ{Ӕ*nU~SymUacAc:I9#i{KcUQ^1cכ/"SXbaa"|=n o oMFsCĚ!qr ZzVbcqDll ^c}bME':\^s}k 3h|r"&x{D,o;ʔ3+z]7E@@2K@Zx6/j<~eu1ߺĄ6]F v#Bo>f#f70 0 0n@v޼51ErF FDx-Zl'HDhrU|;cO̤D@A΢f^Ȓ77@Au-qB쒝Gh R0(9Mqi@ h!$_ o+vf _"r柧 ki咚Ri6!ۯW/Pewtڬ+sO.Q?jYHQeJ^>[_mZqWi?‹DpvH| AJ*iD^JkٞvgW RzB5o Z8@tk{uɶCPi=p=dU nf(=o!dX 0 0 S?-"8l=v2_=@D9H7 ߺVGcjy54/0XwkP^jrKgA쾣O;.ueylkU4*yhv`-RrW B.PrS02r`k+Ȟ׫WtRؚPd>ޝf_,@>Zx/Bbh)Lkut\GEt\DwPFl6 4~U+V"<ן1Z @D XfBY~^zhZRP~,Bn/%'͢WȖd0ri-N,5[ uT)9 @{amjUD!dOnS'FGG+4=\Gwut\DEt-ZGeyP2oSѳ#t^',OdvzqݝNVoY셈iYL.];9"?B柃=w&Z @v@-fK1k ,2Zx 'ZL}`ǎUwd;:. "QG3dޥo y ZZXvކY,"%2g?ckX*M)CٗǾʵu`j<ԃ k %(63(;n:r}R>.r }=*bPMCRsp`F =+wTf0 0 0L97zrW[Gvay? ML!K?`%eM:1L+=aaav,S[Âi'\vd/-<3klDdY(\\KEk)5mJ=5ܽ6n.t6 IDATTX "̒u!y!=JCp !#Ikq}: TBX9uמXxՑU2&2Kl{ >c7٩Nj: ".;u202Q=^RsRrjUXI-|]"EPqh24KCvmnG0,!)=:pP^=G9Hf lcq9`ӵZbT (vExa(9Cex밦K6ϲ{{}(Ql4ϑ_|\Vsϩ0CFв0(1r?Z V@BoM煯Kߠg ٿzUbTѳ V69Z[<${K*z٘-t@+,9fޕBɳQ0 0 0VXj ځʪ*6fE s=GzRYʞcJNCHJNgRЖ+}|9=bwmwKF,s`Jb}wC3Su+i;g0}XQjVMH3׭)BC^JL! &w]FWya62 0 0  PlVjl_\tT{TAO)5ϱ])1+%B{D=[@GP}ӱK&5@vvpQ-&ZNL!Ԫ?THJLYc_F~j{#v【mׯ) Hm0aQj^Nh=S{dwS'N<-0ut\GEt\DwuԴ̧yDP/X$,{tT X:_B's~3/qG%0N3:.`qx՚  >5{1C\`9)4QD P3Ec(9CiA#jGOK\ 0v5&DN|S9VE)1RfEAp19W'C =q(k; Kݽ(Ge*,Np?;: ".;u,h!lM p=d!x;U$<.=#;o^wU~#`ݓ]~͚xBvQh²&Cd?Sj ṘS|hL~9R#e*~SxPFаR2vc"0hq#^Ud2a0 0 0[[ P$i! nxo̝y Sj.;9%, _z %1Cj+9GW j[3y$Gu99Iϖ{zb]Z0'` 3 S aa yK@*DS B@v.B+/@fIa?Q3?Ȝ/j9W28W&eq{_[cOYᔜ' vE4澟2,_Geuzj1ԉh4-0ut\GEt\Dw(rG+w- 7[ǁ%|]"4+V.W+@)$(̽/uP{`}C@^eJՑRgZmOiRvlT,N6z pp]:Ui;~{=ɕKnpQ EDyIHY\lA\m#x#V, @t.7 t $@BB&!1 =g}'{OO֗_~Ƭ{GkN*4*yRhIPN鲃S)qm/$g(|;<ƈm6͈oS) .Ѭ;sAwE]wg ߨqVbV`Y< ݕ1AӺ+R,<)J)ߩfm3oopsh#.U)e ``0֜ș@>`9$} \=}6 *hYS#\.yRFn*YwF)IªFԅ-/%Yo$2<*# ,uz eD2DxGw`I5/œ̿RǓW)nqW*c?V0kʔSJgZw]ㅙ]Nf.4b¼f\&i:"}Ը!Crz9w3uvNE#ӟߞpG1kbn߶gM2Z7xS:_D0v#K"P8l&9!,EkjO46xkuĈK3k̚f,hG4GV}&%ec蠔x돼2ě{ V~~ĉҒ~o(**0aBbbbbb >lZN/6 tQ[i=ѓS)eV}KY**wskyqոV)ef$N,WM#aÆ8qbǎ[dINNΊ+g233 333])=meD2DxGw`I)`pFlJwj*nq~fÈkdZ??c=UgD&e<^\\|w>c+TJJJN:+gh ***_ |]QQ\+pW \+pf\:M "|J]{> \A+\rPBѣGGx⬬͛7rHo7o* pV)u{p`jwoU.iu{s̚~9F0..QF-\J)5z#cƌw p-EG(  Λ`ExDOJ_7f}Rʈb,ÈleffΝ;wҤI<{̙~M6m̙Je˖\r޽Zjb܁̫}Rꁑ)7r|h5嫍bw k{o O>mMHHزeۻtҥK;vl޼)Н'ĚUf+S2'&V\c][(1<=ųâ:ޡ|2'?$6߁\NG@_tQ"e܁e0̌mkVoPʴ>ۯ#c0)**rz eD2DxGw,'XQ#G5bά=mjR_F a`:@G(eEȸQŷUJߞT:۷kF @so,aĥ)T͉2Da9d1b az^l@G( ?zzF\[YsҬUJQ 4#3Ltz M3 = D+ERy}A3hy}IɈ9E't݁6ˆOSJ5|߿O<9mڴUdJOOwz eD2DxGBŠDDp6#<7~|kn^l͗E5AYbǧsz-W;y/{qa{XN/ B `bbb:v8y/2 R&X l/<8f̘7|̙3۷o8pa5=^K ( D!;( " dܸq˗/:th񼼼CwiΜ9999ͻ 6B0rrrTTT <" Bx0d C q| \گpɟG!C_W+ oTݿf_ `i]ddd8pW~u." w9WɹF5}=\vvv+t޽rvRMJvKѣwuŋwwB͟!GKKKGp+^)֮]{mٻSeD2DxGkr&Q : @Dg]sΝ4i%fggϜ9sȐ!Gy-ZiӦ&V# |16#<+P86߁{{キ^OΟ?͚5}mٲСCK j,-++ -ZmV.]T6ѿIh6.'9/:@G(ePoŠDDp &EEEN/6 tQ:[니2Q""8X Q: @D(CwqX'XQ : @DgX"mci{W܁Wc0zN/6 tQ: @D(akhaN@/Cfg% ;jzX.X^AAK ( DQ: @D a`:@G(eDh B11Bx^Q: @D( tN  \„e tQ: @D({K˱",,IEEK ( DQ: @D aRTT乿eaIDAT`:@G(eD9: B11Bx^Q: @D( tN  \¤%tQ"@G( "c0IOOwz eD2Q"@GM\M``!L^K ( DQ: @DRr a2Q: @D( tN  \¤%tQ"@G( "c0)**rz eD2Q"@GM\M``!L^K ( DQ: @DRr8؀2Q" @D(eDDp6ƶm۶bŊ͛7m۶w3gΜ0a EEE=Ї~1bŋ;w*KD2Q" @D(eDA;fϞݿ7VUU}s}'qlUUUVVVfffaaaaaafffvvvuuk$!p}o5I4 #66"j~ҥ7tSrrrRRRffҥKo>[oEmڴ2eJIIIY"VUY5`UUUeeeeffffffggWWW;.44eʔv}駍OHb6l؉'֯_ر%KXZ={v7nXUUϝ;'|ǭDԎi<O<x15k־}yիW^Z0Yhяc,u1gΜW^yeѢE>|EVZ5g,yI&M>諯>|qjjjDte66?ɓL<^pj=hR?W#=~|>{޽K:jk"j瞛2e_tE".l2z˝o>HHH8tPC%$$X騅o}ʕG^z饥KZ{Y5` >|ӦMG6mڔzФG$k={666%5UXXj&^vݫWJZ騋 ,"bҤI7nY:(//[nID]5`kzMG-hĉGJKK5`_6v?~<ȱc:tzФG$k[/騝ӧO'~g!F322Z_j.R۷С}ҥ[ouhѢu^:>|믿ɹ++++++?䓁Q `]a&"ٿڬ bbbjkkig:xDөS~Q#1q"j|'_j.ƌ9kv޽:ED]ť˥/Rjj?,o߾Ν;Q>oر3vXtСCW^x_LDt {Y5@7nCuz-hW|IIɚ5k߿`WG} :4>>SNsə7oӋ|>OӴgO?{ׅfzf͚Bp՞y]v[lݺuvz^BNN?{ɓ'OZGxJJig%%%,ȩSڴiz #m{l騝v{ッ$~W^Y:jj^zMD]=:ȏ~>zMG}xd߾}{vj=hI*G뮻訩Zv򿠣̀{>}?KG{Ո(..0`@[騋aÆmٲ&%%r-)"jZ]mV XG <;fփfQZZ:jԨ fee5>KGMmݺW^k""ȎZvmf&.ƍyhF/__q""==}ΝG>Ν;[騩e˖M>zMDM]K]Ϋ֭ۂ |ݻWUU9.\V?W#=k],0rח9r_?,Zz7;V[[7,Xm۶;wQΝ[W^}ĉ'N\255u˖-Y:jd͚5#Fh|XdI.]yrkN:/Qw}]jkk<8cƌ|Z/WUi;vlBBBBBرc;"\B i$vKF,//e˖ǧFGGwq„ ۶m |5_~7o7nxO2/ |uqɓ'r-}QY:o~.yXvo7x#,;66W^/Aw^ * l`le^ /nփn۶-??瞛5k֠A;vرcٲe;{硇*--]v {p;la 0^xa[9򩧞O_޽[)5u~=֩_|w2 |uN:Y+++ܹsEERG6lٳu<##ȑ#N\=|>_^游x<Ю gU;bILL|x^^޵_@ X޽|pwK=O<իO:u͛7}ݶ@S`7Ξ=oo}_#{yG^<p} #p5Xp5Xp5Xp5Xp5XpK:sQIENDB`gsl-2.6/doc/images/interp2d.png0000644016036000116100000013536013373111455013350 00000000000000PNG  IHDRKbKGD IDATx{eEu/:jεl "$ r$|`iD`L4ɧ~JɁ{r k\0 ċD4B|ƃIچ!{κlzXZ?V5\G#98hp8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)7`p8߀|v8c p8)`mw}^xꩧr!!;s9cfvۀo]{}cO=ip8m:o>Ӿ}=sp8fkl i6ؠXM73p8uzhZ8{pj c\-Q+n?xŠ vF,CD1mbUVl JVOx+s2lqb9rQ9FWr*_y1ŏVZXko&gɍDKLPOc:jTK4LbZ)6[ڞV7W4w*7-!dUp8S|8!HhX IU-ӵZb#ib)FQ"J7rY$S E8P\ w4k#G:ri4lR- 劕˕6RlLa}4D֜b~,57{٘K1b Jq̅cH-W^>}F"l1!bkQg1 +Ɛ*J9!FDz9U/">ks%I!%g1mO͂Ar(cYH!3͘&W.Wr5J@9 wT0E+vUTrqgF{Vv^L#57$ȊaP.nED:> o)0 mJQ̅_Lof^xp#ܹn#<裏ɟip85Tkl 뺗e_z"ُٟ~Sp8kM&t6< VŃSi]`@Qtq v \l+-J/!lJ˱E7I}ZeH(A6tq mxi_rj`1%iW!j͵5i9C 9!''iCX"F^4kc1Zgt)I7myNQ8DQZ6r1*p/)8L--q}LˉB tH^ Ҷ%-[ ؘ͟" آ{aMG\T-RK^&5F6TɊQ;0آ24ƊYb8ȉ`#6R;f1QsŔr#Si}RFOQjy;kUj,#+JA5rt"5IGޱkBFnXhM6w:*6KCiXi`J\+'@!2V5ˊ X*rv^A+ـHQ')Q<0i⨭&)hS1-͔q5gq#A:[gFÁzN&7Zp\$1 gCDD=5P>ZA7n;pC=4}4{A1߆ 0|Ʌ!=2p̛|؏!l>uwN VLLL;T4x!XDD wT1b:( n#YUlS@bo$k`؋2KTrء26PR$M">:S0EGS;oxqX~[DSBNDS.P\ O_"t :NNƥUtQ?M|q_}|3Θ:옶;N;~yciǡVauP(8P0A$$bEDNO4>S>}'ЋNY(w=t)P njX36 lasO뿪xoWo)>-pL*9&x9D $*Nʭ|9UkI]uJA2-Ħ3j\F- v=;R`)hZ9JNp"?""mXG KDAo$Aj7&5%8g:/@GD#t?E|D!-ZUO{Ζ(PvۏNW]Ba}؎5cәOp°g|Ke [j O9t8SWS3Jof[j[:h;Q?FZhhz$Xy<=΄>/c;m]wퟥvO>oDDqi~u'>G'ۖپRrol߾VZ:G"u{ xu,]}v]i[nF/|j@-Ymoחh6gY :P` %d#a~7`~!9k/%"R֯2/*eʍ˝D"ٛZ>LX `‡ ~pjiDTr2a%;\T* kY&-dž3)<징*Qk8(YQ-5qGF} "PU w(i)OMLXA8ҡё#҈4=ۊSa@~ߢТ|ǍD!y;]@DFEAKK4@q@KDQԆGx楖dSr]s73g ?OuRzv0@D!xU[?}=rǩdR߿Gqmd_0.<2aU<<g*[QfJkT rf5 j&[Z#+%j4u6-6BKY}hFI I&W<똜Jw\;yF焊d|NrU;E1>cC<~w3=k+ՙQO=L"/=BA/H.УPD0D7/w{~kyU%kƦ"=! DQ)%z.J2f7x:=e~ =H:NXK]k"-8["4C!閖ؚ3am}on:O_^wR;\s=oE>$wpy5D,":E/>};?"!L¢BBP@ Qb^p@nRڦ:BND:8N=JNdRlÎ`K8 Hrj#HѬI ;փTRjh|8VKl2(9H)N8h6q~A!%zx4ty"ҁmCuߥsЛA\}/.ѿHEz.tK'Mӽӝ#N|nhkXx&Ė=9÷o&#oܶ"|8M@[OӇ77WE~[Ny:&/ѻўMf8=t1a-_l{}#1!ϰ= a,fcPL8{AқZѧ&([7,͹<PM n_.qtFa/hpX.CΗ=J}^M4/\1 #QHMb xS` ĎXEHM'X܆Sv1Dֺ٣H)QfȌV;cF jGf/ :ϒ{Td䌊nF!eDd7`$/:d²HjvM䠔L)hj =gZ}4#fre/-r9n-3aZI嚃3aY/q#mXJtLXcqEtTC t9ERH &oZm Qe'<D_:*¼Wn%J9[OqQlr6Ϙ󀫽pp8{ XeR[~݂rNYŊؼWqR= CfzQiDHIjt:5FQttG % Q*`5e/KrۢQdbcHq(iFxx|NFRѬ3Ӂih@m/3X Mf0AG ܴhptVVEhM6wVx8OZgRrV:lkiJ.cT5'6Fb6MTX$kSCRqCFwU4cz.$0k^LKV%QE &*I7eRc hdDxrFT1GT@4ZzXm1nXؔo007!2 ȡ/!(2OemLTu4'NjâU&MSMQrHճ )h+0Ҽ؛+tBf[v ʶgEi}8Ǽc&B#:g)-+FY0JV*\Mҿ:JL;y&i+05pc~+91q B)LwL 8+0C*!SiT$?l*#1pp[4qQ,0UfcP,WPC;;F34$MA+}oD*g JZbA&#EcHܵHl&UUzfšra}Gw.V#gjR}2l1Zm.dЇw?0$GUn Ӌ@$~GS?M4BC̅(qRȉpOaKFŒ9u;ñ10oXkƦSCgMeP !0.A(!"*(/Q ?aƨtNӮgAJ& l$(B*A+{WVN85uS`iy0$ b k{(Gw2, DoM@c{dʗ#L5C’)Az{h۞>P&VWOA؎5cө4u S`śmI7|²rr@K~B4 m ^zPQ〜Z@W3wwj[3ڦT&WS?dpg~&hCAĿjT;2ߨHЍ{G%E-6i>s݀ñf-'x*)6-28ȓ;1G'+6(â5v۰iG XeŠ!¿H$&x~7`pl0J.}!d500v\h (7} @:>)IrP7`;mN(5(w-haU[p Tڪ*%SyG;ha2@e9^1\h^]/7Ds$s5w-aO/UA)LXK[hOƠcE9߀[ySY'x)UWa}4ͅj G%4ZAar&ͨE&U9[\rG4-fsW.*!Ɯ:TQX^>a~5B/Q47T\ R݉c/졺 Nӊ0&Q/>-EwI7`p8:7`plTMkSaZm:eIT`JT" MC&J Cf)p+*[ݤLbFʄ, XےAXTsTa6 e+N NC"3Jk,o(h(GЂ&j5$?,sZ 5y8 3JNh92H!hڔ875I+Sw3iH{gR)aWP5VF-Ys> Vt{A[;9bc? %SE-Rk⸚\r ^4ŔxqrG,m{l.9FvU%؊x_[ ^9AB3*xp~v;Ժ؀暝;w|gqvi+6Ї>}c{s9/zv8¦|UP낂9ѱxm~`p}\jOհ,'?*pL-o9nP tkn^q1jItK; rrF !ɬڢ+(/ڹ Zi)h( (ZM,936 ÿ@Q/ k:#IeVF1z&)4WۡwqI'|7x޽{lѩ?_W wl޼Ͽկ^~գrwv=Vl8!j9 ڕzLQ-z #wWiKB>YojP)hJq꩎rz#6UTG+ZJy!6-.W_F;YeW{Ak]f"/.65ZP? .6={r)?۶m1{G}jg=o>ѡ}>x:c*FPb}k/{N<=7ok_W %uC|^4*ywx]g?/~x*]򵕏9NUڡm۶gϞ=!#86~ӛBG?yf"ھ}]7n.@nc>R!r'twswqrmsg<s[s[-P&lgysH8{OfdKS)-BN.fr`3]vQ,%(jT5z,W6*)5jMs9g(->˲[#;05CHjY$z^]݂SjUbvus9v[wu7|m?nۻw?zava ]1OX*D~Pg?{KÜ;w.۷?O}W]urW_˿}s_m޼^ַK/-1_!ʈ-'g% 9^EvФ)hRf[@A!Ou}3:.d-+4cͲs9Cc/Qˏ4g؋R\jٹKc+8LL\])9hn(_^{}ʷ-ymkpov3 !_M>HUPpM7]tE]tO?kf]}u8W~w^x??_QAFE(3Δ8TaHOS(r%Ix**^XJ(6G-HCQ4YIؾZZm)]岧DYLz*\@sX546)4x`b/g"s]u2~Tl}bvu|𡟤`Ur9G;'gyEU>Yȱ4NmͶrʼn;룞AUF‹ՋuL/zuܤ{^;7@L)S>`T@el&9Uu$rr4PohZի0YC+2("IӴd,v1ɸ+zKhPrh|4oI'd˘iS+9Ws(0"b:ȼ!bFNfSGUbٚMxvfKX5Ùի\>`WE={68Vф4k4/C$–VT*eK/W0by蓜KMF-yQB ^y^Yi~s;cca;c l |( \TmN+wcUR]mT,N&vUf=4NJHhJs=N`aU e. D"Vr- G| 9ހñ0mV"p89~|dA98%8R@`OTXk_ \W3j ,ۈcRˎ>EUITss"T uj)Qz^4-Kʇ4)G[E}Z=)']8XWM=3xV(UZ;)12tNPNiH&!e8b!`+O8 rr#+0AeYr0i'˄1us'*0b I/fZKlLL&j{,bG^UPKGioiLϫel ‍(uyE֎2;bʨ f^nڤ9 8TZŢ,]X9x"婦]jF8Jy&,k M5ShqERDl #̄fݧOٶ'lmYNA;1DD.h@ԄxKZ4(b8@+O*L^Yg(qT6'#(&;J[gyAӞ 18ÐlPQ4\1|Tї~5"KAR$C(eD-BNiFsqSwص?Pг5˂X9IB]+> U&UhFk8ުJ̋] }m}&+݅Tv3k Qஈ*S|1a ⵝ `MXNl?Գ:oX-oD!LC=$X6%"?Y-f;^ PܐgUrV0cn`5ֱrRPuUȦ Z[[֛r! fܷ&酴[!\U (}w@ex.6(9P-Q'wX>foX7`p84Mh!m@v򀓨cr} RO/,I^ g*<[|]Z5K阺mGՙ]IΌRTe Prb>15(\.<bMV1J{w( @&,eTUj(c:kڎmjr>>Us'AU$  5ϚNeU])&Y%G6ģS*p ^͟I -NYGڢg- Bm űa3FAp8s2a8/$䰉3YB6M!j2.^D1 `\NKdwW2Up3ݞ@o0p86{oX&_S!ͩbƬwnjlZB6>z4y˱gVt99L,,313a""sGf 1!G''zC>rr9r $Ain~ʙ,0#8&MrtP,kb \qk_ZTeF)_0@ުr5r;5,4Q1snWC(z-bfԕ]?Uw\`7`pl,֖5[q8 cٚM--hb+΄=DhUΫN>틹8d$AƦ EkTn2U_@ۊn`9=4jèe/q e^ZyuTn~pAߖ@NUfoj*\48PD[ Ts $$ZZ>)P*~T,1^L=R kSQ/i5Gƣ.PaHU55Q[J P7 w~re?}[껬cx&,p89~S0U\h. IX.VRȴr*l̮ ILf2TI^hVP$Qu_h#ܥ\.S8^W|3eD3Ի<(,[-m-1Bvl쫏[uDN.SW6ރ3]|verUƴ=0V USr.$6\|{]ZP̗ )hp89~od4ҹbtq%V&Vn)7(Iy\1Nʟ2(:!O|ҷeaR~pm&`Uuq.h V1䈥HeӜ.Ma# XxӥZ.4a^J)*}2* r&qrXb)\rT61''':{u.?/;1Wl+4{Ӯo5+ >=[oX p8))#ƅY&)eG gBrVnRjW}2jdeeT*`ҫ2[:kz/\*lm*,[Sm(!Os3fD!ce9Ii24AY;Pjb!Cનl4k}UnUkWea}-ﮱ fjVU}Ṕ݌Bq 7)B:87`pl,x"@lØdcQ)Y.,0oL8TxYJB98&34 {+SpHY7IP(h#u+GtGE|nA /2/Q՗J5*a}/GR/")ʙlբVK*^+8۲pZ&PZ*C>ov".p.<]xY2k4eY^XDAql 7[>pl xݯ|+lݺu_Wp{nzᇟz꩷rK=5ÿHrUkÿF|ag5$ɗpUŋU ES CR\Sz+ۤgԓiCR-XhDetӂ!>Fv:}\༢3}rF5%=;/P$y5D#ڐ^.O0rFEY+++avua^\\<묳v}Wlݺ.{ ^pmuQc_y啯{Hdׇ'_(D 5Bj⻴*G6'R^*m'& #w~Uv;Ժ؀s)l۶-x}Ѫw}wر.{Sۿo߾-Uls3Tdo[G<FrfetmR:q)_B#d1l5fAw3mҳXSLɩ;A#6 IDATzbczqCX]u %L3u2–]h21 LwcyXy`Kb'IF&ۡl^g~pUW%/!:;|;7m+mNjxT4pjUsLG{}U`vuo۶ٳgO#Ƭco|??=ϙgO}qW>'?7XK1-˩W\1krx WbIgQKj哼bȥȗ&Y+v/ znhD eIUJ1 (hKyԩW1Nlj hO5\T |2IR  V2 pswqrƷz+a[4ue̝4\6RStC-n,+F˝Fz}X=~P4c0TQSй^"#*E~ł*pLSvjY.j4(to0sKɢ|CZ|Z򡨤IcŦW# i4#\j]xAs9v*u]7|"9"?=IOzAPp8O4_kC8g?sϥ^|wܹsپO|Ͼꪫ?|"1Oŋ/O~^WW'׽|7b0j8Jcx|Sl+U;sr$L0XhG'V'Rlҳν菞z$lRb"KSU~`*R\je勩nAkG,wf6 ;EGyo'MOcBP7L_]:ޤ+xnSW6ۡpM7]tE]tO?kf]}uÀu];;_~?W~vЇi( `+ԧ) "Xl+ yU-Wi\ A+Ը+kJSV ZZN*ͱ?Y&H=m5׫Z׬u/lsrZX[;/@V' x6,v;Ժx>!|9>cX x]nhօ˥?-6([+QN6ONy-Y܀qBJۃˋހ1> ))a:p8YF.n2`CZ{*<.(4қZ)[#2>*UTD!m:U6WQEүZ)%:ꕷX!eE^%d1gifJ*l:Ez>B$K̨*L-2Q~1#y߉s9-צ8^^r;(à*3U>h1/Hıv e0dMB듄KQE>]"Q RZQ1"e6.e[մ<9Ex);Hճt`QD(vh‰(y 9U\[Ki9z`mœYvP!Qgm&pT@=8ݱv2wGO5Ry:0x#6wv8¾3w涄 _a +^E:+͔SƑJ2q>ʎ,9R[$H qJ^/f[^>3'dhB< xJ/D7|FA$C8Qb-f}Ze{CR-Ǜ|uh@9;q ɥ(%Z*m% r^1VG/2wmE(56`c9#bn9:GUQ0j0#]'m>1\v؍Of%\b}J,*==y҇j H]rje^bhiÙ8T V飊!Qe"B-铪`9q1%6/UQ,lY35p0|^sLȊq+Ǒz?wS^4S:WE_ h-Fq|Ȗ=/^_3M(F2+6jSh7uO9Rj} j܃9Sr0(Z}DI'IZe1XQ[Ce[n@e9Ә-~bŽPSLXjԱq l#'cKNX;nVmi<"7XzQ#P<9ʻ3ۀu aUQDxg-!G1R g2Ӑb4mR %LK2[vSęPTjx^eXT K#e kQ/?[OzRtc(o)e@Cg+'a1/b^J(kTNX|6F1QdjOrU$ ƽi)ɴ묗9_tm2z.l8'` _a30R!GK>5-`'ZE. p8}8p00τJS'Fb {a'׹Pr_7rqDO$ jePGO6H`BJj5Iod(Ȍ -AGEwrUaH˅R@,T >0p86;=슊^zsl'QcdʳiK򹑟=^ p#ߤ[>ߡ:DsAjUVbkdq 3ևC JjG5!< q$߀32*XS=jJ1'SgR]Y{/j V}ɴ7)QR*;/y>1pMG[67/^ӃfYaH}bE/ZNĢTSr|QIKZ)&U/9sMZy|ΐUD`vnW tjLX  Y-l9 q5l (9JsMɤx:Ǫf\R.=M{P=-Ǭ.ߊ)p8G88Gl<2aqVEhn*· آhcűiL -@Q$6(*2AoBF3sY,T$TDkWiTXxkKC92Qb8Ӑ)W&f[BI[ڀ ;I 0>G`nL p'&`e쀜p&Oa +r~sZ-m&"5/"Ԑ(JN/Q(1O4pBvڜr@e~6Rª*Rr]|ɑm}JNLтC֘ߵJUW!ULiP,渣(҉Ń &{*=O<`9JpyĊ6#85y ._jp8 V7I"U>O~|{|O;׾/˷lْʇUN i52dր-r5UR ZbVH$噪fC)IVRe-gm,\T\qksTh dL NUlglsW$dCcJ|29eXWb= o|#W^y-ܲm۶__}k_?}!K;Ee 9iw&ْX(qj p^ \>J3FeAsO.u2UW#:Fgb)*ʥSrH5'Gx5^3),;.fB/mJ#\*ʱ:i6mKK_~{~'x9ڵkU;ñ6oړa^x+ܹs'>?!KbUDd*c3bt%ݮT$瘌E/I%uПTEcvJ _oZ^hAEH,Xo2U-UFn*Ȥ*I&4$xAˁ_MyeZZYpUNѪ6IBrf )9 F,NC,k jmI)eZc_NAWS[ _•W^y5,../?>U~<ȗ`?{”BeyvIInY~BQ@B+@ƒ{iSҶmWSW!jdB+e#ˍS{yO%LAJa9HiT=ʳߘM!n|@;JT{:Xӣd[N;HRU3Ow$Q |5uf.8L|'Ʉy"!*STάi\yDr`ȃrTO緲:3TKJrM3a9/Qp)ͩGȁ|^}Z.rfƱF)~g<(H~‹B/iH)h"i?A"sUrq"Z2+:2-䃎XN#zi% 3K8-֤Bgd(YEelk*AղX1,0iҌB"4ep&>Ju${3* ):"D[a}pXQ5RVC\l oZu F!GRF!M|x&P*OR )_Ue9^9wrH-r IdҤGqj'K劰hczUL;X>w6CPse=l\~9ʴ\Eq N$Guʪ6$ɩx^3:Er)JF^ $󯬼=wkȂ1`c/JC=^lL"4cbFaU*&{$K]-1#1ulvҎ1Dq[Y2XټTE VlZ}ԏ^;ccaz:Ja)np86 gj)( ݕsaH]:Cr 2aHB)T橴zQTާBGMjVN^^Mӌ&̈́K~3aq9Zl$Y5`Շ<4% GkYg4k[@˪R%HDc)K ti9v"jlO Kgd1Ø )hp8z΄5$G, i 1ɊK*@qF+dV@SR=I-WW|T#ɑq5]# .DXq7ڏ[+dCǗ] JN!gˮlIRF(C"L}j;Y63 V '{}tmM|P<1Tvy_\. {g k~7N]5qQ ]3=%sEjJ쪌Q:ұiYJ&w)(?2بPGH *ښ\J"IeԶ"ۨZzXF:Y 2)]_ST/l]~q ժ'2A0O0F ?*pQlfA&a:yR*qP8#$SUotX p8 Kc6Љd^YF'D mU =u읩\@0*maNJ Tz/gh%é)9ټq{v"m1?u W] DDLh%{. .& tdʎgGQl9qA` Y ( Z]dV0@A|[dfµj @tQi4C,`U~CT_ÇCsr4|̄%.ؒ;sWQdYt8c 2JJ< V|۪z QrqeUF-an- vjeUO/9.4Znv2bLW)1XQܴ&ң`98ɑr:\$La~7`pl,g8mJ[&Gd/ ,7[pVٗļ꣦i 2zq̧qQx\~o|'T#=@K[HD9ɉ2Ǡ~'iU¨):iUW;vnY"^'TDQʡFI(3ja4rF-gY:% R^H +6~LS`-C*1YaTd#"׼퉢`e}sC18ܼ߮Q1yʴ A-KSҙ\BmQxS̄H9 ĎR*'*U!=V=NeTLsEXƞv;TKxK_}__9쳿T-oSO=una# Xks)TsJND ifC!7QRiZb4؁rH#әb+78&TP-Uuwe7敼|cF'xUk:*Ss8Fkꁎ@<rMO4>nFw{bUm|kC7s9o?Dt]w|oxlO>:m߭[> O߀߀ V^>o[øM C6ۡM7tE]tE?ӯ暡wY]}}n KҰҿ7]9=OPǍfK(k?dQR~j i$3+Tٻn"hJq-^ȬK2aeXƂ.GP,frD5n8Xj]|6}"xz]EM,Rb+^do u =-"s>^EJݥg4^vqWTZW(zSoU5zqLuږ+P f߀ 1& OO5V:E&,p8 낂 LEgyes l>E9]@G$Y@FHDQyfAm䬣O$v.Y17` _ r1#gNfP'v ;Sh"/U/AfJie^.,)$|,* ?wi-;4#͇9ԡ<꓊}!(q T*wա[L0(U% {쪪=3xF@T)s;/UQ!%'P?bG[L3O24E"`+b/Idʔ?H}#U^mEHԥdUߩy_&aO*ʌ=NFsInK ,<ͧQe4)F΃8*7DQlҖEw?1U6q{AE5JQ8rtK KZPҤJ ڛ!TGUL .W%V 9^5p8 UvƝ2|&CHs! K(˭L;¢D5(2uGV. UzR'_QU6}'2&1#ڣy܃ZxC9̟E|(lIY,fX++~*3Gp8v8c p`cid&-,1i#%b);p fX|$ wL:J3z1@ t^83hôMZx/ܗ_}flʵXxAKY:M.G+WtwW`⎌>Q*DdQ$3a視n`҃ڬnQHw*m@:D E2j}ؖX,2ab!{g~b'~"R-^GV^ױF 4 g6Hd M(EDȢ:zQF퇟nLt[(Z.ÐdX%l*\=u}Orӕbņ#r6M0FU*uG:,!mKb2J ڤ-YkAbk9R\mH-A]ؗo (KU ejg-WmOdQʅlK&*dRqm 2)q#k |/sk($J=1ki4HrD/_A?tJv3}t  bTW#_.@}Awd;8c/c4ԛtIxT{e1H )T\ARq><&TG|6UEJ[f3X W亂{mB*{0r h}4LDIQ ]/lE9mV̆Ǎ$ " %wTSUu$9boj_)= e.M*}xӆdDQTl/fT-SArH%0CD ڦ:pF vQIaoo>FRD@ b@lp#H),-rM3P2au"*)nbyЧ8ɞ0GQ"|H1aQtn$i VqA>H aRQ'ri'7"k4N5V:b؉Px+#W:-l&,l˴b$2}\U (D a@EBQQeAQAOF͈cj,3AK TOgB$J?B{}k}ɽTw}^|ko L`&:Z 5AAk7aG&.:ءٴV#T % `0&֚m `0& l"JX `s5s5jhc::;5j%KN]΃%:,*:@% ?,PM5%c+μc ]dRI2<E )CN$ 1/JkxdT5gS/w?.i ,K)a9߽0(SQ#Ln:Y"&>TJHV(ƐLRS5K5dmBJRyq;D/\ E bd_y}"$৬+J?\JSGII&ɕ kzv_pTjrD䦰Li- "pWDx.-ƤH݋#MH,89.2+zkHo֫?ɑ`'!6&"ĉp:b[t)5]NSt (Yy+DGAW?O6u\ˑ]bj)al0 Ʌ 0WU"]->"5/ZsVGs9@.\w$NE*Q S MA:6_Gy ,g EW0%nK n;,E]^JXBc3U*;Ţk<EA[G: UdԨ@o]1;%| vA9ciHj[Z9Zk`.x:[~('˸-:[ey@'K0bO;y g ,aᵴ0jhIgM1H!QA98Dk96Q3SNoyPB*xxKcʟ{iE.a1``0*@ a- rPbe(#~\n'Ncԙ2*Xaehb4)JV9ʖ!\PʁtB^íg)*2&"]n fQ@;*"XAW%J؆M N2~(V"u \ 2 {ʐy4HT Fvvt4LFUᤢVI)a\uDLb@ '-5uDL j8Gn_y+q⧃f=¢A!/]d5? M†#w"š"X:H"ϕh[,m#4QMXS{1K;xg?¾CA%L۬dUԬ(ћ)ٱ`m3u\y*#s&2ځĤE y$B/`\(;D+a DJV2A 7)Vnn]sr(˼YEլDizK>lCg@eꉩ4'|t)86'Sɪ[%NP!UU PL 82eB(j`؄̟z=Tl WLS>L&B | K~o(RTv7<'!-j FLjA+~DW ,@JJHhw`tJXS 5<'&b @SXJXh'IyW],q mQON(GGQy CNܰbi`X75j] *hث/fG(a@k77 Y,1C$0gE@'G{SLi%HRo…7+?=cu4;MJ0[,1Vy$)a P S^^n&ܐL(}%MI;N lQګ@C.ͅ>O@aDPAҤfsɸf|nkh';kɢ}"|H|V6f%k$S%kyPI,$魌i;v+&#ӛÌx.CɦKhTpi<9 &7wQhwL`̨PDV8u,wStNV  9b@MF/}ͰRIY V\'xLYR)X;\1$?(ڳ9`q4실VJXXXP@e r(1!u؇/ xXNψ倽:&_STBR\{꒸AR$dCm>L(aRJPB *wr@(a%N2ެ'\]bj-FA P `0 SkV/\ kce2 ְY$1_:5W"R\9z[FQ1b2Q %'N=RЎ}NRPcP !W)!63 m:VZiH<(`ޑ5`PKtgv/L%ʐiQY [8ܦ=ۜ}$.ٌŀu2Q5h VbL bvUl-DԌ2J dK)Dȁ,*af?`:*ʷYA_ 񸯌4_}ڐDGn SmBBu'w *`> w\aX$,-`%IbDcfx|#'E&2}f2]ͤfh&J0KBbF‘"&-GWyu `H%flN8I{X5$`0*"`HwAy|^GkG(ae8IA7&L5 ԣ~P#$`[*Z\MSyGo3yƂe@\<sͭŁ(LJ>s>6'i/-(_-+/K/<{5z=.mSY*M;(X)h9'(h>ثѥnpJX͠ln'k;eȾD/l;{pHƕP p 57/a@$jثϋ`pjz VJ$gbMWJ; J8Jd'U*̣U&ҝ g]ܽ\z u!:u}Y*ZmH MK}+5YiNC ggN4xExq=b Rb zā:IL%P$<.a `S뙹`|MJ*Ñ^ ZLPVXQXu 89n\m=CJ]qLi,g(x2H,(n,ʩMXY!r1i!Ntr?MW);qsnl]mSM['HsѱVYTԒ,Z-O|`x+a%WU(OHA(;:Nۉ+XI; =)aM`GB9dR`Աǟv_gSzIib V@6p vE CDy,*'bo$CPD&J8P4ҷUx2XPJ\B~6 BI>^V]n8 IDATRb7 +Z2O G1`^M)aq; o"i2T3"dzAѪ̎Ѭ@.2~ulm9\>˰RBuEZ^ZItbe,>V6IPK,Kq%4즊^{Hs!e2 HOʻFUJ(X4 SN"XӐJQDtGqz`CtQ  }D#@:$%x3$*M!6}ev=&ȉ]W"l)єi6"ym Ķ(; ,K֭6tXh9$F}^ďi2v֥⃳Nr$rUⴴ:f?PX$"iԟ:6X}qE-F `0&M's@ K)LTkqJܽ\Vu%l3&nQ1ړuR" B uB6$,TLqL 9Ii]{^HivH2H2S/JX!)` VP*&v ThfAۂ*N|A]ʠ&/o@m)qA*a +>2Va\ӔyfP4Pň;]gHu=#pLAI76\x\n*s5*jEMV;МsYRp_jāq;|fZ1m۶/xΜ93g~c#׭[w%o1cQGlٲm۶`w  'm۶/~3gμkl裏Ν;W>^z?#o~s7ϝ;wx`3:N ";9i+5Ԗ̃HAs;XW(vAOCDPO@+Ӥ鬋( vkGxZ̅}s,jv|4i-gفvjhg:X/,( *l .1Huq;pod`g?O=̎OsFel;uSM{^Ӭ˞O3+ʯbl!"59Und?tANuut?f`㏻fv%8+N.?Ma' .bߑi |suxlLq1rcNo حP֯_vڥK{󞣎:믿-oyKx.;?۬/w/QJTm-MR)X ڵyM$w )Zn:wj; yhY9(_p^ JX&G;uHa %Dyu%~Z9"vxrܹs͚5y.ughCmM_ f,NԳp|hs`$(~WU%p`RĀa@9XEyU,lȔʟ:γɑ⚵b TVkH%eoנDJ;)NiIbWOL53rtz^N4宮&,p~Do0 | O:/ijB,gޱcgιYfٳg#[裏{ P5؄5v+ԄX.\{lCCCmǏ|~%KrV%8LqEx?ft ɪRʎ]J4Ϻh (=2p{%Wەt<߄rj-U$SM}N/9^xbp9g4Ltv(RqFTȔ z#JckѕDPf$ ).oJq6J7d%-^+ 70iQ֯H_yQ$~kحPbֹ瞻q￿ܴiڵk;V ᄏOe_c /Uz]%H^,zy`lv !<MOu/ _IgD9u`{ĿbJ ?ao^1qv7`KNJf8Uьqfid4i;tiz~lYIMڿ# '-kmYRS9 !`g`3DzXU؄5v+ԄX/E]xzws9tW\{jmh_~/G}`0 Fǿ1v+Ԅ//9Sn2}Yoy衇[o[-[v76<̩,QoWΣy^&ܮ)N}Ι*e ۞I1%6ic=9[ur)"ɢJC`Q_/C;mJၰ;_D8Ԧ0觍D/~0SOlO-DjL#MurźD,>rqq)]cBM)sNb'>\4cF$ ;f ;^Ԓf?h梒4DeʜH+ƦŽ VJBi i%v.ս9J;BB{;r%!.I; ( hccgI ;,?ͺ2z+mPf{ca'.p]WWuO|XDY&`0 aՐ `0F𫭗\D 8`]*Xv wn'Sf>`6[BQKcJX"za%SE+C*ɪ7q!d,o Jݔ,)G5nAюwp^̏YIac%aZ lM3Lg\×ЦC+aӇ|ĎOjTuL%2Ր V@;Q9#Q;WBFuMWC'xfgUdd讄]quSq$fh7Hp^lM"%jYڂ덃Q쇊6P5p ޿[َ3"4q`OvJ.M=$#}?A2*E/`\MXSBߊUb*@IVla2A ccR|@R߸3S{PLJVpNW ~jf+y K$qj"=;=`ʧXx`dHV_~toOwS 'V4.{o2킂U^ 00ml0 I[)%,^dRe)OvBT*-n%vw:RYDĭ5UOwH;%Kg"2W@clS٤FVMJXD1,îryPDy)uiϙN[Y\[YRHXn~T^̓UvƊR!a'D 8xN:dI#/^m* (q5)+UԷG^ifHC2 z@(aq!D#H}pX3E\E$), ZN:X`qbB]8XI3^r+S -OBTJJ(F QF/$Cc΀QP0!fx ;LIk"hD@500>ifɑ~#;,8sNHCJIcڟGt&T2 I D/`dRb}[˕ZdE}xi%,'WQY!: uq;`E@΁ZbxJQ`PJ]=7`T W<'6H3H/"z|8VH!e)tRىsfu<0AAst]a?Y(Xy'M'0V|ƎFJ*Xt/o +ܨԠG1a pDF:L)t\J$KJ\p]!O֜pxl,@xĤu΄߯hr>]3TE3$'49%6%BX7`;)a[Zyzx6 $Ô`JX`0T~~fRXtFw ^ %L)a'r4bJXI]aV(aJ q 5+ހR9ÑV6sƹZV^w5$N[L(s.B J I 5o  ^Tp9_WQۗ;e7orRWzu X祉+ᤣ^ T_"1862m'G {=Z-8j%,xkL)޺``0L.L(h`0*@??$Uk\p¼ (j{- 5ĔᕣYJ PRQ;Ye)y %~X>$1uEDrB*Nk eG*lNutxP’e`RP[X=gJ X1 ;ʜXL)vBrX`~pp`/$W^(aբ]Bjdv ؚC;bFPd|2Ց-dlI5١֕C/ἘE ʡj .d| G% c)Q*7%!R /IA;H=W~xx)ӺvX-)veKmo[ltҜ+?.=Vs3gFzvlcBڰ:}4}f`0–-{I'bEHW3 t_?Sjն,O?[}n Qcs6쳧ZuXpI͙C<7;vs4{=gU@N" c\RlxyUTЍj|B*f6A%fAJc6;lǾ*;&Ϩf۞fQ'hI5/7y?Q DDcLJi_(1.)V-z#y( *K[_AA}yxƧhϾPJ(aҶPO6x,԰=}*H'jNp%,A2S+r^2Xg(Y% p8C(d&юa˻֟IJ\":d&@:^D{;>z \pV_:37/~ҥbbP5[1X9ַ=~whx%c5_֑vc /ЬY4g6@;^/ ks}[GnÎm^cŨud|4Tfyэvg5G?իG_oO<㎣~GD a1kwގ.ؘg5?NAzcm%FZO\̕=꫏ԧ~s{ba H4z휂vƓo(sYU8"7ϝt˷0Y@'u4ľbC*)(RX*ai;-0}KV=#XG0E `v<3dTBET9wZHrXTªqf[Q[Q0do渷YQ5)E-`E!ޤ=2Stxb]Nhp"NCQ ǥ gI[Q&G^wBƀQOK{M І}V/O-]*ҹz[nPШUJc"h!9fƊ~m޻cW 0efdb4 r/vm.^y>K/ 7o n’RS\ډ:Y"սdY@ܽҽ"!1򀽢9/ b JXJJ|H<*<Z$< V8'(~G!zd_;:!E#EJ?T%@Me[ש*q/r5KbSu X1co^yed}=xW~SUBp}f<w{n˃j-Ryno94:<|hի~dد3^ƙ7XtZ?%R*:k"#ځg(.0 IHD"N%)qdG8R(aq8W!L4v˕\'%,Q+O*.Lڐ9@yJGF:o>$w)k`Ł-&fu2Z3>/ZYIA_;Qw4ɜNgv;2T1K3"!-J v.VZЪK(ÒQijX `0 0!\l&")\hV]^MI(r YT3^Ҁ"Sq"-%wA'N3=cHGɨ=NTkNPe'ɸCvc0RpHjS Jl+q7ITMR[JŠ<Ũ#w^`y3Sz' ^`yS\ aiǯMBTisCԲç4.DY)TVdN+X\nBr)fq!<쐲gv:کH6eU ΐJXM髂jV<,1HA'jt`7U vtS˻5͐_ii'DGwv]E_FR+_ "ʚQC{^?qO׎4GMw@U}nߒGbþN6CvFy{Ѓ:֩āk ;?^bpg.k7EGb-6lXp!gѢEO==_V`0EgQ۷o?;g! vXFf8W4(by̔C rFBf7o8mڅ wwLT8cF1sۺu"_| s=;w4 aeƪ]؋Q,:m1(ٳgz۷ow͚5* 0U1v[.\ac=`!`0cLsݸqhnڴiڵw^(`0F[t&_9zw8skvׯp`04nљ| 0mݺ/GFFN9唛nc)`0LMѢ3)``0&;&_ `0 )[ ` Pl6 l0 C`0 ` `0 ``0*-`0T[ ` Pl6 l0 C`0 Ч m.9s̜9sxxڣjuXn%\7yƌGuԲe˶m6?F!Ї>?1bzq??9s|'g%g?;39䐃:Oω͛7S:䓇sO?tBadddŇv׿~e˖otN=%K\s573fMoz饗q>$?̙388}l\ܬ^~DtgtM/lٲ|;x_jڴi|;W\?\r}?=s9gҥDj  k6>g>jt|I\r%}_s/+(>$/pS{w>}e]6V.ΕW^ۺukYϟ?<<1.V.Ί+˗/'"9Yz8###y|fV;* dY?Dԟ1 6,\hѢzjUT ^uxʹ/կ~+_sn\=]x_r$.ΓO>gg{-2mڴ~]tQVk\+ÔG?.gޱcgιYfUR%uسg#[裏{+C?eY6ٱc̙3k)׽593֭[3,X`}wtq*]w5m4"޸qel#p 6w{  UR%:|~/Yd\| _gyW_so}k֬G=}rQmnz8ׯ?o|;7o,pTqnܸ)iӦkמwyz5:Eqw}wu' tI[.^~ê2 =`aR⦛n+V^} 7׿^~_2 =`aR"p9]vdd{}{[G7X `p]|{Yxd-äĖ-[.첷ׯ1 =`a!}lڴik֬yGv`0 _җꪵkמz###'tҞ={~_ U`l0L2Wۿ=Shppo/]3 = `l0 C`0 ` `0 ``0*-`0T[ ` Pl6 l0 C`0 ` `0 ``0*-`0T[ ` Pl6 l0 C`0 ` `0 ``0*-`0T[ `{,o)IENDB`gsl-2.6/doc/images/interp_compare.png0000644016036000116100000006242213373111455014626 00000000000000PNG  IHDRKbKGD IDATxwegfҷ$^XRYP) U8T+YT=;y;p L&0m۶o199h4N8qڵR @.s禤ر#NZUUvڲ˗?ZxҥKٳg[, "bf咮IrAX7n9rܭD[ /pŊ'OU¥U^^>eʔ[v$ۺܹZ+))1cK.Ϣ ]4P i4^\ZZzW.[lڴir@B4277G's<}ǯ*_oiL&SoAOWFJR i4.};_),엠 `% aQ7n  0 @(JBHe(IhJ CV*wI %1 MI7m$w/zO fV5!!AVt%&J 0H ZJ& FJbbY-.AY^^nE83( D`%˓ aQ<`%;Q 7N4$>`$L3Q<`%g|FJb$SbΖဉ8:  ,$Qn<`%dsQh=E0HDE"ŗV{ˬ'UFUIl Z\AVz6]pj*dWD1La q Y)L)IhJ CVzF=$i{_=E*BH!$?{\]2LU<_ {8v~ҹ1 3$&)MrssnEC)?~[ty$[9ÕmX_Ƅ8N(jd'L`\7n:ңgq"#pF\5!nyP; SޒwVj+0lYkMiJ7K|EE>.6_@#̄дvT22^vEq_zYy]N[hńEϘ7A{.C:m:b>}Ϻp]P~Ի,3$&)b  8BH;}Y[v;0?-UohNس=)$//YGp 3(}W#Q:R˸tfoc]\)۰g7KsY鮁rr3 pgP὆yCCI!L{ Ϻ60_Ͼ Tw]iN2K Bh|GI9V_UU$tB 4\x}y};61Vz_[SSP~ ;AgJILBSR PrIϚuf'כ!ՆNhĝ:voQm~A-;`J>SJb3L:p\վ+2^nqќ :-Y^o{n-_|_CܩyF 4@;6w6ϜL% Pe.2=+cqNOXMBg{`%g$mw-ù3΍ YGslK:I.;{Q'k?LgJILBSR 3;Iuvq4ײ7]b ]i\sXg/6_4pm@ ͶVw+u%)%1 BODC))7uk~ ei}h׿T0earQ׉;uyHmh bѳ"cWӠ>5t@]ȫ/!$_d-oֱg9[3?@^&[M|T_IM;5GGkY՜Ndμ0&2˦ͻ97^lE;m%]/@PeӦMr7!L:Oc;;9䢑1ݟsR0ޤ=s@G_>6nڀpooVؼeJ>SJbbYPIImctj|@UL N<ީ_s}{ ֺ&_7_ϔhAXTi6oQ3'uP}/y<5yҪY%z-˱Df8Ѫ!: ZXZ(JBϨv"nN h~]plX7Ry]jz{DiH _l~jgó)L)IzzN۝|orv;a±^4^^贬Cmc :6FjȚMrssӶh DưiCRV`o4!$8/u5e5-7#]666pPEHmg6j|MFktt}*Ơ!XUձq.xkԪ9 cgqLybe9]3;v|O5ν*5ֆoճFT_UW]筮j}^_xB;ݠecXs,Ùb8ÙbYsjp3`Dxۙ)!{L3xy[Æ{RGX[l>arۥ~. zo[n[=:DtFf*Fa5,!DeTV1z tUќ.z'x}+|+='B7CH5qX˙8UB<'ҕh(]UVr-r"&=9jݙj.=,%6:"IQɱW3Y4%iRY-Uy<%wpeI3ƴt &VtLժY&Le..ny;yKhrR؄8.!N%qxuP;CO _q5R >x$$+}L~w<ݍ6ԪIJQLz;]X9].NH+13ŰqKK<Ž?27::;h5WoB☄8.%ūx pgPK%4.m˽mq,k>¿UEGpb.ɖZgJwh@H{}}-vwSM6M\QhT%sIFUNa#@Ho5lF_m#ok| v/cYJ6r&UIbTUqj2-ΪU0਷˕az6cIzӟoKDX>j:?!KbO^Cjvjpy-qYJ'b}btlz*ͬNKP'R*>늏'M>16"wҬײfUY(ŤJ̀/Z #믿~ȑ(mQ2l}rS}1<{TkC d}(t5p f%$U41A?o;ukޭ1:6+YJQcPϓ&gm y07kOSM_SL= !˲>/R0"C݄ w$0?) '{Bf$s6xI|{|o.:˾+|?%_O>䭷ޚ4im&yr}uUZuc2T}S4}SR5TV! :% q\BG&p-T{k||M?ءåT)f.ͬN1RTqN'BVZE =wI-=gth߱?6gM|ڇg'ڢ~&dp֙$}G}$6G߾}O>pECE.GW7l44̀tMVZEVOB^[]竪Vz+mZoB Z6լJ1RLg qZ}  D.U?^psDJueOQ-IU<@Uݞ曛^ӳ!t-BjFa>r봚; iQjRrKLj.o˳M}j%x<|SÁjn׻x'zDV{;.N݌ngY^U,|!S<ۣrzN7aVժyګUT]_ !mTXSYD]Uc=͋v#b&2V_$VsTAzzz"{~O>DKHH/TbZę7m4~xo|bZaJOѝWX,<$)c7BR$ 0 ㄆz୫|^B(BFvT59>۰Bn_(oD(,޲=N/ig].c@Z}|>~q"Bq ~o~=VxrMd!BU(*˅JHSc^쎯kFeH)~&ԪsѳZid0l߾='''T%gx$gn$5 kR/9- RY B>c'W)H )IRT ƲHYM']zNo?wGk D'w=t:ϟgϞv (NzJLWK?6)Cw“B P^Jޮ1ĐX3zC9hu |f>wRbXe-*ΣUԜGh TnQ*mSo$%Lm7ɭkp\J_UZ2gF߾c}u?79q0AZN2g̘!] jlذ|)x߷o߆ BEBVzV'=>!3GdIV8y?e N5U={J$&3Dd&F3cJ`&]ݰaG6pdΜ1(0+rҹWG=Nz܇Rͪ];-z~HxLhEEŋŇ/c=z=mw,U-8JܿvQ&w:_' 'A4&5IMcSd&=l{wx˔NfW+r6yM)&os4]e!{9~>FX=;&[?v>燔?5hw)Ti.#D |^ ?zP8r/Bue'1)i9#AC~\t~*S]no|o-g7[~G:Y;kR!}X\NZ,h8w eվǾ`젮fr}? ;l"loJt- yԯy1*5==g$3\&&|ݺyo5a8ɨz.Iǩ2wG?nC4 .?;-Lpk ޝB}]RCƲCl{eɥ9jW:RSʉa瓎Se64ӪQu93! Eù#=g];b9U'lg:ˆ X|ۿaƱ#Fw4F3}ކ&g;T΋؛pj  \.,Kю9@Q)RCJhnKНSbG\kl||[{yvX6gcjH!Z^PP9V:Tରuؿ/U3fAzyyy*a 3(Q¯yIKg1,X2j |BSC;Oc1㙾ذ*lk<\lugpaD],<)XJ]Njݧog?}գFG_ C p;7>7|y'/YZLJ7q2{xUꠤ^(z G !cɀtͰa}/t USe wG71dG ԏKC%A =k>5M}qZ &Æ^xZ m ˲e'Nadt*HϴpdB)JVg$RԆ z_u-T{:!2ǒAڑu޺#S/wW~HiQ@!4ug9݄ɽ壝Np?ܸ ؉Ss_4138sb'yGmm6~9?ӳ8˙b9c S35#<]79;_]muW9G;,HػC=ͤ Gʬ܎aP̟Ca؋.r& EWֻS 0BIEp 3(QnOs può?ne1$bﶉ$5#GNNv1*H,KRMt̀4uE pg)=[~~&؝nrFmtJkU*Oq7hbxULTg&Uݟ3IJS{&Lؽw/Gɲq#WϔHgm| . 0.8bвc :6F&8.9 7C =8mX9},~W3f# +x趁 e_ydbX_/a}+**dj+)`pԼ43IpH}e捌͒aR%ٴiMQq ]8³dؤϴJbZVx(JC_Gx9HQ1TLXi+$4%˓ $y{I(9X? !dm L۠$&))%% 2-Gə%\} Kc'k$$E&^#MGUT~mQД$Q8bH IDATA1~BHiMai{(IhJJp3DC?^o;5Kr\Sf0=nJWbp r kBXZF`(%WR( '!׼`-$V !vOB4>] mI;FIRJbbY} =mvY; !AHIv@װRp 9ڿ1TO JGI 0Ȇ?`B@- 0PXIiUV#X^XhTi$v$4%+I4OѸ !$gcIt%%I)IhJJp3D% R"GoGN:@ y(zYp ‚hhK9$Q3ͬPk%۩fn.QK$$&))XIf|PZ,noG`(J%JR )D4Xq|[6no?qx!niBYeXnE8Pr\oWg1JPABY]<ML D NPgoX<,5I$4%p+ItLʗ3**/<+k9AIRJbbVP$:& .Ni>51qAI$4%͕  &t, D g|ft_Y##iwP<`%Q>PU4S5 e4$JRДf҉),0E_o[㹧J"0H iVoLQ;SOY3/PR}% aXKG`Sc  D Y L"i7Qnh=Eb$NSw%9B[QaCyyy:>`Fv-SB6 @䣤J EReX(y+'_JSz$)%1 MI!x(JqgGH'>JRДf҉KO >?7? ւGi.a(I^T/A,s̉3gNQQQGG|_}ر&h4>O*(KR{9Ba l|ۃG(IJILBSRqڴi999999ӧOGJQQQQQ+<ÒPY=#p$qVUj+:iPI'=}W{n/\5wA"x?ǿqߏ1B.OsްX,r"~y7o޺u=XkfPsG qBBHybg(:thс{Fuvo۷744444l۶nx%m!P])nW#8`f+.11A ӧL5u'xB*rWߥfbBTIܤ=EIRJbbY"6_|k֬ZVu͚5x嗻\wXM6_&8 ^a񲷡pҬOBpmF\ ^!%%E6Ə/{ StKW討H;|)555???52cyy1c<`/;O<`V{P݇W !Λ;CvtAF?>|x7.pϸqJJJ=%2odaPL#7pCo>H~߶sOݕD7nRa#p^ (t:MV!Th^$)%1 MI1,xp#wvI8Yu$4(P&F hT_I.з4@V%-4 C*1iP<`%Q]w,eVd^$)%1 MIn&hAXe4ݓ4X@.6U(_" (qٶ0TYJL;$$&))XI82 ݘKI{$H = \g/ðd6f nbdgg݊p@0(PS鯾8֭b!\J $8 ?`eQ ma00:(IJILBSR 7  (nU!` JaD%5JRД$dJM(IJILBS\x( !JnIX+Vnw̮fSV`P<`%Qب600dpIy’$4%gta L}k>0TU$W BjRፉ8@y`ѽX(B\e!}0(Jπ=(-i0(IJILBSR 7 ^48 OStҺ7 "\^^%F]6åp4T_I$ef !\2$J|5`*ҧ'C48$$&))XI4X&ѓ! J$JRДf҉K*ƛ* ,P_U1 @`%Q4@l5j*5ij$ %I)IhJ CVjnԳv-lB$ %I)Iz"zOi_z?xÿ}2CF4b.UB%;;[VAI0D8JPAmg2 gCVCN$)%1 MI1,x(JWKЪ$Τe4=z$ %I)IhJAXCVeLuB2%I)IhJ+wBL0Ͽ]:5L #ZCVE-,PiRB2z~!AIRJbBPD֓Pb"%I)IhJJp3D#4}Z}`{ݤǿ eV+%ޘSx*KF>T_I7#k=k,,.`%Q >Qej,$ JRД͂ BUg-{ꮤƛ*}zΜ9s)**`/_>bN7rիWK<!Um`f1@'-ӦM),,,,,ə>}n W~~(i'Wi ج 8“%I)IhJfXbĉOtѣ5k׮ƩS K/tǎ6B{29茴f{011;(,,%m HGHgl0D5J-3g\re+WΚ5݃V}-|.Ki^ {gΝ=flK,ٽ{w-xyz뭷V\Y]]]]],^+`ם,IC$4%pI{ZPPhѢ-[BOlٲ~/^n/>}zo>`YAosxTXyˣdJL4.`ZMb_9?[%oBBtUR'AV|5r=!>4(IJILBSR D&]'>ԥT $$&))=ͤ Wu5;s>`\-$+Id u"3(IJILBSR DRM4.C#3(IJIL{>`y^bv]7_0X,r" 0C0"%WR(eo  XIu+3gbTCFH^6J$4%p+IN}(LL.4 E`RP<`%Iv<qʬNL!yL*JRД477W&( 0ET*n;MF0 "`%=^ Wҡ$)%1 MI!x(Ji*kz>o^9ҒJ$4%gta L!_+n^fhfMZtxc"D"q,IG*cc (Bs[ }#_[XI"mlM}mO4#-t(IJILBSR 7 ^4X@NdVm.d6 &//YG ZMnj23JPE:߶Ty,(JQ֗ T.1/QI%EIRJbBP$jN5 q\HKTR$$&))=ͤ ×0K|qdQ}?\ۿe[O T@Y,l[.kMF[J zCW[.nSdl B+I䬀X_+n#'(IJILBSR 7  D^/)>74o!IÀ$4% +ILSr/\O"B%I)IhJ+wzؿ[:^i҇vJJWD 7o'mX)"B%I)IhJ CVk/!~yo!IÀ$4%gta LN8C^wty[afZ)D)-zC_xYPR}% 8 &8a999r @:8B"` V;NCF' JRД͂ 8 6̚5IJW_}5cƌ dGɬ#ҕ/ QbU?P| OV47JgT# ^3fl6?Ǐw:+z7K6%qԃDܮ%c9Iߎ$$&))=ͤ#m^~y̛7oݺu<姟~Zb믿.iJqQJwAHJR )􄴿G:4z=F:|pG;yqqq6 z+j: 7f;D#\'NUSTW|M'ccC݆nݺC=x.Ӂ%V5cӦM%zUV҆ <jAck #+曲! j*WQzeoCh_:B$#21cƔ=8;;{˖-]us l, ><~$ꛂGI7Rc1b?'??|ĉC?@[*rurQ!(Ϝ9sʕ{V\9k֬vwJH蒡&nש`I{ٹss=gl6ے%Kv}wGd|קTć||0)=R`yֿݼ TX,r" (x60y+)`Lc)̟~CrND `% ފqBjhz$)%1 MI1,x(JWBU-PV0a+L3KIRJbbVP$̓TlPVIa*L'DIRJbC{+jV''QBXI¹v"{Ӹ0~YY뛒$4%pEC)ikmo{X7Dy#//YG . mJI4T_IC;x"ŇTZD`% 䫕jwC6--Cf$4%+I{+ӫ[&$%=w8P 7N4 _ [ԗ8_}w6/U IDAT buq*} - mY_E]IHK ,z&ԥ$)%1 MI!x(JM#A|XJzFPI'}uSP?/8?`>Ϋ2~ bdgS14}>ފI(+ɘFI 0V9kWBZ$Y|QK5M[goJRД͂$a|'J|XNe`z$)%1 MI1+x(JIvʼթ.a*-$Cg:!JRД477W&( 0W8\$aX[YRtrӳ7%I)IhJ CV0z'ma4N=;(IJILBSRzI'D!Rvּs#7L5$@VoL7*[&,Se$b h%WR(ТW^R0 @"(J" %ʌ*B OgoJRД͂ ^;C?ӽ@;(u}%bur4@(Bf^ӔLBYIL$NZNv+ F`3,%I)IhJ CVI*3ΞR{Á$4%gtaaM'!|҇Y6 @v+s%6W_a +*KYRb{.3.%I)IhJ CVw ƪI(UIrNBIHJR )D48x'ֿ}9^jD>ŒMD=i*2'˲ 0(%WR(@!È{t9XI[VWhfUqQ7ѳ7%I)IhJfCV&_u I(+Ii2OBI4$$&))aXI$dWٷeRUZf3%I)IhJ+wHYK.f%`PD=ZahJҪeEZߔ$$&v={vjjZNKK3g͛D^@VF=4T:[I]z$$&owq79r~͚5>.UЮhqC yco_ ꮝp^8xo~{&%%g?wt.m&T}ʜ"U @@꫿[U_BX}۽nw}III111W^yC=oOOOjG^zu(cPC6O^hѷ~K˖-[۶m{׷nv ?kyP[\9{ǂy{„ < !dӧO߹s9}^x}ܹ3##K.;znK+VJvvP$`HqڴioyBo1}~`h ԩS/䒵k׎3СCsOuuw-i eժUrKh_Y:<`,0B$r'-)) Cz衺~zʕ+Viڙf[Ń$r']pW_}7&&&_OB k׮+R{/UV_K/ջ~K,fehpi]xREEŵ^s| ӁUV=V5pђM6X,I#BۆSG>c+܍H,B C6doCx^+ֹcM4?lc\s8`jѢE .ܾ}n?qğW8r+*****/_믷g}ق˵{kVD:# =eeeiii}ٲekySvm6[vt-<ۍZ5 IF܃pJp,ePDìr⁍߽{10EѨa!Axl+~qakC=fY{y^~c^|Ž{~111ٳ#G6559sORPDoVaaVmwyGjzҥSLY~9봽'?={P<3u &8͇˯{A7^}蹃IkgРA۶m{|N8q?~87_=_&Mxh'{?߿x^z) +u=`(FrPfUBz =矟wy/!dРAÆ /wΜ9s7x̛^y?pyyyeeK/TPP̫ "82ꫯ>Ӄ>j! /o} !#F:tÇ^-=z=lAO,wӿ|k#aԡk`TY(IJILBSRz44^uC'kT}#Lu(IhJ sGz΀{mކĿgWW.]g{eVu/!!lU bYA o#>uߋ;Ei>!m](a(CILBSR )i*(wOjؓ8IY4=ы EIRJbB}5Ҹ-{K7×S'\s|Xm]w| !d(P>`رqqq \s͖-[zR;vt)'[=0@ZGNrxk7$xALM`5dls=oؾ}JҖX=-wߒ%KwB+ɦMy'QOi̒܎s I*ˇu?QD⤯ʕ+Ǐo0F?S~G+ za$ݟagˏUuポ- |95ˑ8Aw4 z$)%1Ikkk322< /sx?~xN׿w}W0cYV|;O_ڿV;dȐ%rXPI9NMoMzu_4i !WE/i:!JRHwz衶$B۱Bǎ^{3f=zn4h_;y"!dIII7oNOO߷oߝwޙ|7vlԯIKC,w+ZDanݍÅٶ#/ݚXJ`MX:|ٳ wAM]WVA(ADki{J8Sjтgl#W; Zj+UFlX Y ( 0 &@B cԄ-Hv~|^{Akٲer|aa pT*Beee{-//w,ŊO>&Wξ|Pa[NWZ*GY0F0ҵ.hB OyTbsLlio['b/^Ly&9ӈ۷oDW_}c/^D.X@VgC+ ? @Slԗ:~ vW d{8XoP_8(]?IbŊlW#M:D/ {Zb&~)@r\\=oH9sfVVV~~>ښ!H7nh2_$641YYY̾>6~PmϮo^S!48F5m CJJٳgy͚5y֭!41!ӷ!nap=N<|rrh4 y7d}59L9'$ML!M&S``cJNs]՝.rZ_%f}||ܹ34S!bccgsrrM&P7&<ύ20dʓ42ZYeɔ=}tooo@<Ԋ#Zx֯_?88H lذm`6ɎV5!` ~Bs1N'$MĪL&L@LoڴŋlF~\'hh4%%%dl.))y&s?$a8h/<CHiiEG^reĉ{\m ƚ5ko2Lޕ+W.p& l6-c'9Ð̔x)ODTVܹsĬhEEEX,jvK.9>kZ_^^^NF ل|2uB4I|HqÇtl͸p0&'%%9})DZcVXDi% OT*W^ /tww[j|WO>VpoosEGG3*Ǡkr\V۷h4\0aC- X\\lR\\+Ʀ^a5`P(V^M}EEEjwhxF*J## aPF555eee>}!T*w;(U`5`?@0 ` 0 jݽ{\.3f8rhaX f͚]PP`Xp7o\fM@@ӡ5߿痚]"Ӛ_=88?..K.A%uttL2Pgʥމ"S.NO ]w]zuCCCpGD9s={V?z̙3111r-[ܾ};i0d2ٶmۺmoIDAT6eʔ^,qEŋ?ի KG&j.[СC3RD)z'еDQD"illoillH$¡㾝fߒk.7E L?#JΪjLޠ\رcժU˰c\3RD;b){fddbcرc?~\RٷT2\'77K/nݺUXXXPP;AHFz7tmw|ҥ z{{K$K^pwPxxs PSSk]w\U(-uuuq3fFQRI$ܱz'qg;pfH~Vjt9qjMNN%''۟*珞lo1BЍAтz6mZMM⡉4ӳa,;9fq7tmwwWQQ}˾}-Z)䄆KJJBCCpbPm6[GGǂ M,--? 2l1SNNNwC(iߢjqCɓ'WWW۷TWWc .?aƠh1TyB8uꔛ㡉c2z6r̂c띆 ]\.طĴmrZoh4U[[[BBB~~R ]޽;yd9%;g(vCvG/)))-'N={6xz WN4 Wd8ٜe1S.NԻk#.|ҤRH$3G?c\\\@@@@@9s9;"uؘ,H$IrrWم"St:?guΔKu非; =Ї׀6 ` 0`(P @0 ` 0|^ IENDB`gsl-2.6/doc/images/interp.png0000644016036000116100000000316013373111455013112 00000000000000PNG  IHDR::3mtEXtTitlePNG plot˥H(tEXtCreation Time16 Apr 2017 14:17:46 +0000.ё_(tEXtSoftwareGNU libplot drawing library 4.4eIIDATxM6`7s%Rp GвǐYdWo( " ղDY'Rh(IS~ñw5M:b!b!b!b!b!b!b!bOy!i44S@)7 v &f_^nMA~UMAx%EDPD]Te?.1 &I8B048n}Lbh>huP:H A34CduP:(\$硏.N@'U$TPA%tr*(2*(*HETP:HA4zP@ *HC*m3 B@*62TPJзttNvǃDyUҩFP@,@.';s\ƚ G@ "eBg*(b*(TMA}aѰPhX$RA3 AyYP9ȣ|GA ?1xGؒAԆ IUO`p G ʆ;h8BPiwb T$*` *= %P=&KsVJ/Z%m ?I,$ZK~ ;LH##V(45i^d8Ma賜KDw'afPMخF bl#f7LT:*}۵ڙPNh!Yl*G%QflTQfqfp+8X'-wy?Ai[͏l#Cd%DPpt\ DP!* JL: zkyA֩=4냬S DPˇ A!C,dBCF bldO> O"@RA DCuOH_ޅ0>2 PH *HAИ1AC a1d?Z+52‡ˡB!0Ɩk\KQ,>i4@_ WkBsP j(y@$ ڥ9 :ܱ]mLP!ڕpvꍨ#'d_ UMm/$t}^H 6 ۓ|DBj2@b[?& sRUֳ:WUWU?cmyb!b!b!b!b!b!b!z?q)hIENDB`gsl-2.6/doc/images/interpp.png0000644016036000116100000000412013373111455013267 00000000000000PNG  IHDR::3mtEXtTitlePNG plot˥H(tEXtCreation Time16 Apr 2017 14:17:46 +0000.ё_(tEXtSoftwareGNU libplot drawing library 4.4eIIDATxnD = B#pGr#<@KHHHr@v*B ]{=?3YϷ^}6ڿg:\ B!B!B!B!B!B!B!ЪD$r@ \sC6.g@4ovq`\ԐzerYl,d h>2ZȠ B!ma  VGGQɾBOG:KcdyF>!y1U&yB'$OH&P3& bύf iB2Ȯ iB2Z# &!V jU &!ְ;J!if@ (+vAt;gbPN>>Mw̱E mcuBr!YAg@(0idɒvwЂA4&˵d|{0H"$} Rd7$0 I26BDIzrPwش!!0;#켅 _mKcsFL1YHBAT /x8j.HiK=d@q:Z&ѽA59loPPS%Ԫ?t(TꚜODq0UB]u(s^*-ĵJ+Ej&<7 }/TP+EjW0PpvEwj";CtOo؞fCٯ K%L:5RjȎVר u+%LA:֚?L[:(?5)ޡftc/jA\Ykȵ ) :'~zf[J, ::Z8 %Q@Ԝ TKH`jAd P-!頹9P \-DͧEd J{/9URdhkaPCRl~mS;(/Z"ʹvP%Б@ ڼJF63Y4X`:jCKh}hC 1[m0*7-T P[n -nH37g3uA k|ݷaP Q{hs6Khs8K(kͽl!ʗ-n 1(_AP̗k e$q-h E Ŀ@GhLP |hwCbA4` 'ʵ15ynR@VeGk:_sͯ}'Ųb:$`ӴεzΟ4Mp~Ck1l*؅ϞozߋCg'o9?#O 1BMų @|,IRtR@i e b(hƁ^N#bd?8ndXKSqbLD0E|؜2]YB!B!B!B!B!B!^sZș\+IENDB`gsl-2.6/doc/images/min-interval.png0000644016036000116100000003301213373111455014215 00000000000000PNG  IHDR@Z]bKGD IDATxy},"z7nܳgO8;;6//OJmmm@`< fkjj @ pEEԩS@pqO6-..K>>)))Ν#رcϞ={H0155sΘ1cI4#}/s۷o#WMM٢EH@SNʛ1'NƆ?##СC`[YY1^>}:mڴ8uu.~#0q͛7/XǏ7oޮ]޾|%#`p raquumhhOo܋+%NDD:::SN?>8@XpppJJJZZ G8GͲ̺rE$$$|3{yy`} ȡ<nxb))Ǐ6W]Fom'O>|PmKG #;;{omL $55o^ Fev&PQQ1G~OU7[reIIɕ+WDDDx SSSӬY444=}ڵt8%**ennN:",,#55u||"=='OZYYuCB2Ž$;;[]] _bgghcc\}}ڵkݾ|EiϚ5+00{I``9sЁ۷&:vZ%%M6](Zl٪U Ʊc:` %ɓWXAk8pܹsIII<9):MAsnu[ZZ:...--mذaÆ {All,5{Os,ZLL̞={xuYa u떫{((tŋƔmN#`!0}twww[[ۺ:Y`0gϞIeF_pBDISS͠A,F=? ***I^.qq]]]555{{{qs]xbbb;innfuttӭbbbƍG$a2'N+))!{)**9}4+p͛lkk@: @wQWW7w\wwٳgcoo/!!qY1 cgg'%%EY&LDDٳ?Iؼysii)Q gAwDdd8B̙3.\w^޽Ig#LAǏX˗/O݌ḹ_|W/\hǏՏ9B:Kp0=r666Λ7ONNחtAp\\\.]ԳgOq:cгg\///Yц ^|J+̔򘄄ĵkצL2pkג @.m fNhkkK:@ =rHrrrIg8Jc222,--oE: a111/UWW'0hkk?6''tu]v]NX222***-K^x1~?(Դp†0\~ǏsQRR!YCeRzq˗@/^,!!qI/_QZk֬Y`Abbbuuuuu;w׭[Ge._3wwwYZ<88}tjFDD,;w˗;$S-LMMgΜuVYxlƍIIInݒ"7d z޽W\rJFFƁY222QQQ{%n_ݸqno,`llܲ$!!PF Mb YQPPЖ-[ 2mڴ;w=,h11 _F>|0`@CCCf0yyy&&&spp ૅ,_"""zd zСKRSS 8TUUl\B: Wli_p9B0PZׯwqq|]eeeDDO?Dezk׮u^~jIAA$4E齠׮]6dɒWv+`166|C\\,EGG^vMOOtC )S\t %::իh_@ "t0/ϡ:GsFDD}y,Z`:y󦳳իWIg*(`|Nւ "##Ignnny2e͛7WXA: t/aaaK./((ӧkK?(wɒ%}i{hF\tqt ##c֬YG%Пf?`ݿ?--MBBrmm/uCHP Ç{]h, 䂂<<<455 FYYRddy:Zf666EEET$ &Lu떇ǹsHgavĉ~->>} FppnK6]r%%%---sss_d2!!!0hjjn޼ĉpڷo޽{ZǷ}²esrr={faab?'''\0͌3&11q۶m#ݻn߾=|p噙&&&%7uT}}NoC ?///##$q wޝ:u >,""B:njjĥ2Ylٳg͛J: ŋΝb YzQիW766^vMYYѣGg̙ͣSXX?pvN:tҳ8YE>RRR w^A555yyy :4##t).JJOn(`脴tHH /^H:@wqYccM69BSૺ_~寿x"΂$S@LOO3ɓ'zzz<@ 70|iiP4|p11Ç@oӦM%%%I.Ç[!))y)'''訲~xIHH:8p#zV{/H4xbuA`!hP݈744p/ݻw}}=<;v:uw̙@;W@R&[D* <}t>'mݺ<>>rrrPRR<%F@K'O1bV`` 8T RUUMOOGB+YbLwsss=z7 ??͚5EEEڤM__?++K___KKkݍϟ>/AW(((ӧk\dI>}^~ݲDTT#55566VGG'55IHOO׿zjRRD 1)hvN_[[chh%m6iiiλw~k׮8ptLAyeeeAAA]|pIDATZϝ;WQQ%juu/'/ES#77 ] 577^XXXvZiiÇoڴQHL&3$$ݵ 8311y1?cnn~+W׏t" 0tU||c'N|M||˗/nS\\\8qݻwmlllR[[Q]]a##秥N4411iŋRRR***'Nh5b222:^m^ݳǎ Ǝ[YYr=] _'7$,A !!QRR}T}}={_zUWW`0z7TUU |S%FL&SMMӧ"""CLf||<:qqHll=EJJjΝF:vاOa=_%((hbbbÇ b0 3fLyyyVVg>}H!bX.\^bii~}xGBCCMMMyC={lLLLBBfXXN Yr/>}ŋ+W7o믿N:H:#!o޼QUUb9۷obbbZ/\PVV_~KEEE۷}ZEEETTTEEɓh_+GVRTTc ߭ҥK;v={6ф͈zzzΙ33%B2zjnno i3Ç7o޾}_i՝8qb̘1ڵk׃Ѿ`0-mґjllao%%%޽;--~Xn݀H'[???ooo&?N $#gϞeL2%22266իWGvww)P@Rnn?0zH/J ݁GdddMfiifH455]zl銊'FE:"<)h@CCChhwUUڵk]\\K:QEEc֭[7|111ҡ:y0P(99ѣQQQ+V#x,))ɓׯ_={u&MD:Оp*++Ž9|rYYYҡ໼… >>>nnnK.8p P $P 4pbccO:u֭ٳg/YظG<NcbbΜ9eeeb ###ҡ@ؠy@˅ .[9] 矐gJHH8;;c GN3g-X^^^t(.^իE-YD]]t(r(`z!ؘrܹ/jhh-\+޽{wڵ+++;;; QQQҹ[@#'ׯZ[[ϙ3gРAsu#׮]3---{ͫ7?^syɒ%.\xhL """ƌcƌ!KhDFFFDD<{l̙3f̐߿&!!kkkutt }}}y 9A})!!!""={4557tÇ111QQQl6gϞg϶6mZ^Ų2%%Hss.~fẵnL}l66yd333&ٳgOhqqqVVVG`OLLlYࠢ{%6mzyxxx˒ɓ'/Zh͚5$GN膪ccc⊊MfbbbbbjllΎOLL6l)211$sΝknnz%&L0a̴VPPhywBB¥K d۷oL:uҤIyIIISRR266611166&xzaâƎ˽022r۶mc0zzzׯ_h?~QmmmVVV&L0442ezȑ#^t7Ŀ)%bbbCÖ%Os}aСC:t A7/--}MiiiIIׯ_xQ_}m:|55ѣGS|O0Vٳ#Gp8##33372LjТ#`긛իWeee%%%eee{0`ԀTWW}y=JJJÆ k 4G=v%&M9r$xYCCCGGǵkH ` 9(򪪪())yM666|gϞ -% ++R222!ߋ2劊7odXKGu֖lٲٳg!!!.,,Ȁ(`zYti(24i@pha 544ӧdGN2+ ^z@k(`P@  @ 0(`PPZwqpp۷~DD[ܘIDD]|۷o-[FeA@S6nܸgfgguA< ߿w|!$Jsؼy/?~|ԩ]H{ //v[$plp̙gX]+ ,--:djjJSХ'9Jv7mڴ` !ݣٕ(`F4Ӑ@  @ 0(`P@  @ 0(`P@  @ 0(`P@  @ 0(`"A`}.얶O(&pޫW~[n1ӧ:tHYYOP[>i ]-maLMM_|KmmmU[[KeA@?eɢEtuu; ~ -쓶OڅId̽իTfpnn?~ 11QQі%>}jhhivK['ma -voJADDtAI['ni Jp+**ZvA(!C1` ,%TfYΙ3 CZZZ˖-[j8vX@@@VV$e#`ii鸸aÆ 6h_p9x(`P@ |޽e˖ >\LLLQQҥKCw99}GDDN$222V^ݯ_?SūW͛'#####3o޼҉TZWJ[@7iҤG>y򤡡<::z„ H"`$%%ԤjiiECm TWW9rǎ;vPSS!}$%%@0@J[JiODp!뒒ܝ;wN$(JJJlll?WJ[|* CK]\\^zEU([ gΜ~E"I`XLAA!;;[AAeIqq1| T*ܺWJn}ޣSZZJe*-EEEWʟ hhhdeeq/VWW'Y7J"pWܽ{w̘1SVZZjaak֬YK̙C*,|t/ 'W󕹹yDDDIIǏ_~?dȐ7oE !BpoUUUÇ߹sgˍ8FҹT+]|- ?z۷߿/''g``qF===ҹky>hw9_x⧟~e0,СCÆ #a'3`PE;שּׂ}7 /N5c"ǜ ;#XPԊ1U__p8-Ztw;vlJ<ݍ7޸k׮h4־/lWJ4],|𩧞zgPlDCDCA {khhh哓{Y(6!fZh!fZhv],pŞzGm6ߣycL.+۷WUU>#< /0#yt.*To7YnݱcDZc6o| DCDCA XMa{0#! Zhv! =3Ce&rX@!E}3"h f"h"!Ei3"h f"hٵxY{z`; ,(jH`AQRgCDCІtX{z`]0Q] $,V7;DA @-A4;DA @, ﰄڶo>ߣA,=H`; ,( `p3"h f"h"!E{3"h f"h١ ?B(w XPԐf"h f"h١ ?B(0ܥhA `ޡ;,PH`AQhoo! fZh!fZ`aH`AQhjj! fZh!fZhvh:= =z`5$(`!fZh!fZhvh:= =. VTT(`F.EcXM`B "hv  "hv fwXB`vmmm۷oQ$z``08CADC=CADCІtX{z`; ,(jH`AQRgCDCІtX{z`]{{{kk|fdR4VH q\ ~7K Ӟ:(ĢQ)0~BŷM%y Ef"hbQI}j Ui 5;,h`014;DD Cw( MMln! qr ! $(TTT`FAC-A,*bhЇVqA @n=(^XB0˔X-7 uNF###S\.W+FTz,H`2e{?wr,'O&" ç)'GT` !,u6;DA @2Ŕj[OiYYɌ/>ʔ0|zC9! ]{{|#|a X7c=w5tNB{nݺkR/I=_yg:\ .E ,69&?d A|v ,+ЁJDx$`\2VX V?X E4;D!ʯFT`*&"h"Y{z`@ mm\WߣA,sRo B*)/+#hwc(F^$fS B{`۰:s>V`08CAxQq-ISe~F !| ݍ"hbCs_#| Іt Eu3"hb CC-A4;H`̦) ĝTXH`l:K2.o&ĉ`2H`AQRgCxpM܉a3*"h١ ?@ :"hv ţ]QED6",>"h١ ?@ `6MYBX6'=mІt 0{=a/+W6(XXBVgqgq7{0#!  1M/NX<*>fZ`aoQQ4X4*xca {0#! B;SX"bxGN|^1be1|  r1w+uODG#"H;OSYb3"hbFx,\1/X""3uoYƷȐ`z14;DDC t;e[~ѭc3{xnjY  %>)ExoT59.Ȑ{`/ʥCrXz RWJ(9oȈd;⼯iA @O闌iS:oXꁥʻ8tww`FAC-A,S;/+ ,#XD.SqG! z`K!R ,mDBU&$_kkk!fZX vp6=DQB")`؈pchv fX ?|0_BHDhtJYw#hNz"t((2]eb6]e)[cvkNLJ2lMMRcdv !KNu0$D$ Tz /*a#1#gff99NKF8Y5ɚʚҖ_i_+_fS.!i''֖+⏷_np*qִ-ݽ[~z_t9XY+NXY'V5 DDDcJ+;+b,IJXAC-Ag̬L*+:]RC.eՓg*+_1ubpx$70qs`>fZhvh?[ɥ<.?W_q]]ӬiU{qx(oT+kuHDlck:Ex柤elkf4;DY! w֥%yef8~̶tc U]]vwZ14;DDF#Ya?{MJ&gΜ/3u0Ze۴>v|FN֥& 9=s ""V]+Aj'g[wUryO EqllL*t~uYoqlP`"YƷ(יx|llL9Sv3B|Tu\=Ѿ<9v_揷  ޓs|TX4LX*H$Op8~_{ܾz{ɶ_~";9.{ Zȵ"hv Byua*:E4xD__|de:?.x)/|ڴj !9Neօa4q/(9v\U;J<$D- f8!+4av! Μ؞mɻ;kKU`7tʏm6*噪i^ m+/RH;뿱_t͔h Z"h!{5+'N8=y) eAٻ@E\eX'c&t0oq[BG׻DD ׭ߞ@Q}M`iQveeer*J9Q%٠u"gX|^cEj i=fWʣ3 d2ͥU`0`|X'lی7'.]&%o'IwC"'OyyTj§M`lFݙ)۪uWsvOzON9R)&-bӖ_e= z͐5X,_K99ri[ƦbD$/ﻳ+lĠf"h);3TJ*L`i/L);+T]`\7I`c:! ϊɥR)3iTN+`08: ,r9IstoyGɗ xLkAC-A9ە Fl fFkJ(\2j SRR`ȶjW fH`:"u&sCC-A4;ݓSI*ꪭuY+h"NX֙('vjkkGFFI 곔V^[P>j(p ,m}f}v KG2Rv%6($"GVɷGHGҍq.ݓS F0yuuup9: ,pTWWl6׻vڶ6y|핮j8Օ.KM/0-9.0kKɸ0֛~̰l2g+ep NSaV2Up8ob[ԾoqjXfQ=9 Q4Rk ,;vf)X&m>Omm;n!)>)=NƉta!fZ8CH'[zw([nJJO~-T1QɤTɟmE/} chv ޓUruEb⢪WWW`y_Lg ,",i*fyz7ߐ/pȐCqt-;MK`}U8:C~!0CW;ɑ9 m+.{>>Zhvmmm=+j bɉDZy|}χSďs /'^;sVjll*'y: h4S,+))ySJ8 㫟`>-6J_@ye;ά/!H$",Qnp8ZʻQ]~!6x" SU3zO`y8ҽ3Ha%S"D>k?Nr*&U`IMhjV~voȼE2嵶BX`kzX4uƒkZsSZXhkKw۰coޗ+vPVV~DX$D7 NKGWW`/!83l[18ZPQ[3Bq J+NmRK#%ȶCw9K8| {rY*}RވkM`YBMDǪ6ӮI`I+篑/ROK󞶠tww(`AC-A-yϟVn3PReV\|?"h١ )4)vJl,ğ8dȺK7+l0wKޠ'>J.Y:J`D"#:KԜ"RJ5 HI\i% #biXfEKFJu+#D$r'8=ҏ(Ν8=%e| )\ֹr Я®& 'bnkek8Kg<.uwzou T$5!=IN=*:>11|*SZɔUQ"DTFweL +&,gĻw B<~9Ve[*YB( re]B|bSQYYW %_n fhafH*OmF`Q)9>@`;74IN` NĸH$ *Co:=&.|͍DTny^oItЯ)NM[[6eJB3= JU ,RL`{{.Z) ?up\Wp\W{TwGcknppMwȏkzxWF9Y:5&^Q&!kk|<3;uT<1omŎ%̭K9{2R{6KaqEQx/^%/fK#[LEnuwĮuwC_=vbi5~TzÝC"7`Q+ 0W}R>R|ց>O#YT0<LSoQ{N Hۤ 1ueloQ]򄲾~ppPz\UU~z߿_O.Re-"t}ߜnhoo_vk@1D4R""-IrwᑑP.'OJ, 6(LLL۷Ouٺu̙3}^qsW|ɞ”kn]QuPGtjc+Ԛ{sy-W`3Pׯڽ{%K;fZ&5yO;2H*fY&k㲻e4Y믫xgh.Rnߤm!޽/L;WP>G&\\ܫs/vv<Nen~NDDU&8[T9,e,/'.!! -g3Dq MSS|f4;DĬT7{E*z헻sFLk,4)+wO{0yx JcKlGri=0%D499m:e !6"ja4a%! f.Y\ȤLX<˷%{)Χoye+Ж JM޵T^+=v:DzkL});}a?FD"|G&滹)ٖfQ 14;DD[+m\"Mͬ~{F߾o74^7/ⰱ>,HK)Qkx^g⮶|ɚm5&MS|⇯~=qʫE"yBA H֢LK )ewvZ3ͭ8qYXKT*L&c;=/\a;قfkMn[Iagmtv#%uwֹd 1_۹׹X sˍ$إB)`6IXFs5?G'ޒ`Wߵq+ 2srWfE H.Yyҥ_c+6[{n‡^POv/^ PE18ŋ8׎!VyHH=C9永T`-SBP(:S4"d29<<|jd".nn7~m+QsUj ,ݱSO~?!g;ƒL.9o'`1euLmZO +OIƭ<`[ښ6IVb1~:/xmbNsk\rqO.CL<~ij*T|?VcXyu>m`J֟_M~3 'TXL9-83kǐrbӏEA:Z8 !fZUAXFXHD$C}Yi+r9ŲlwIlj?˗~U]KK֩.:?v yXhӨb\%~ nJ"h)7[8fR]HrM](JERXʯoRȬ2VK`|ҋH/~Y}>޽)KcrZD@ Wɜkm2Rg+AQKGUJN`E'tUIS/^RJX2=[^9NR$ͲˮmW;| `~1O0,D}/JEށW]gg4r+wT_3pb a.2+L444dʓBl OM{(xah_LYY=?`#B1˫4K ^PHזYen}(lQ"ꋜx?~ɱp{JLJ핵%X6=RymIED 1J[o9+4[jOt$~t2L]|k; ,,B\@b6뛌LW̻^PRUp'(u7!T_pO/ɿP ,-[,W"rg?_c#"m#ߴ/]6˧HfJXsH~Y|Ι)u{5ʇj)(ϻnQ%uv]?r\qe`[ߗ{A28V"lCKUbfeN-^{~nǂQB~了/Q2xȑ#kIs8򄯱ԩS?T*%\ҟ۠\BX1;DA ( CR>a\ѾUT`9kjtxwN͌Fڹ75XWW7>> X/.Dr7Alo~gTQv5;f,D+ n===<ϯw سwȪD`:Tɯʝpubp(?M${qɧy(!ZhvCsBϖ|}W/3Y$-(Hr%%%Xr$zl䧍%oI{e# P5w[ݓD{83Ƭ+WQ]]]ww|$HbEIƈH r}39i{kŷ) Vл( tֈD"}f燸WTG'"Ny{ZwSP׺%Ϭv5I1ND 1.1Ԋ-e&Ɗs+// 1Td_Bx1k;!w_yzv|Jz@#XYp/ݘ:/x;&0b1)Nw?5ܖצ(UZKX,fjUe݂ (JD{r0-=fvKuYGkkxJmPX)\6ƾ'/n&'|Oeի/)I"!LJ OS4Y1L'Dbk4}Wv4g29Ӽ0zf߃OEQ& gwfؘĉw:# Ww~etj q8v=!_Z{;5D}ESRﵡ_i27Oli븕|>NJKKc+]ÏH?O gN8]|U>.wf4&$:BӔ?q"s~ǕTАpTVV\zGjtWc}m\GDbLE[$=Z&((`0Xs= ?u'V]sJ b a9*f8j6;DHF9Vu4H87O={~ͥlUV>@VXN`U 3vc]ƾc皏]q(~!PAG>z)t>z設Q+*_:rmCH'G'[*9D^$/ZT\Vw+菞$Fj'511㩮:)X4QN[J7 :H׎՟h\!NϜ9Dr %[X#{徉hNJ*w !/KpV&|;Pg/du2ٻs%Љ}''ވ=r"֪,)I#}cK+/Y8:ߣCbH`9T*ccc7504)N)"">x{Se҃`00rF8=ٷP|zߒ2%dGm?PoXWyI檫@njcW#K7Am')ܜۀ\K[]\XWOfga;/'LD(jwpXz~b{FbxyӒGx޾7ŧooDO?qMWMAXDf+uŹMf+|͘"hvs ,-bV:E4|ToOغ5mGt+oi"?4UtkV~=r?7r7rL~z{Bp*9q9I;O +S-)Fn_BJ`m%[oz}ldڊ%v䁶J'߽8ڑ*jPUU|sJDT;)%6 ţ?`"hI,\/%`2EZ.=8..̂ 9a ,F(FѮCDw-3b_s2>NioM` XpXY+8l4P[h͒~nA(;xiEϼIJ"mgíX~|nXN<'H8.vMyY"Jce|婷~m"\ESgcZ&.]totю#.{J{Ū6m*(=zUkn}}{u"+.XXze~F_PyVf۳檲NxxWMs"#;9=lm0tHy^0+8yvaeJdv\)`WsG? Lv3 #ɜNb˥jpbbBN{E"$;#xx`_ϓ Ꜽ-㸎 Lg\}kn}vvGKiTΆfKD>ϵdu ZvԙmXz|l(X܋7ݩ2d<Xx<UL^dk)۸RVb~Q\OEOO +|Aujue5k׬U" J}>ԇB^(5h׮3Xt:_yexleT*Z9uWt/rb[͛ɲ%S ,r#%k ,"XpncJi%R% ec7)-ne+;N766_8n^[)X-|;bӨenV}K}Ϫ?)B@@GJ橷lReIm(rYݧ~h$~RIt;@Kus2[Ό%ͫM`.!PATvpgk=_9),hFhQߍ^w_/J^w_DY|dTHU 2\|_i0ˁLD]Z~~:g1~_ =3)0#m5j&9Xdc>E1A @Nr B<{6@fO"ܔt+ U/q\0W]=qLՁ^vs]eǯeDTVV& x+ ,q/ڏ!ZhvՆx,2P3g,_<|>[KKK'$QeYt8Vf=w"}ZJk4Ëog;m۶;xhK)W?Fg&X$ ,bmW<|y @ј:nJIaR##r}2ݯ{W1R =0-Ҟ/w,7"E/9M`쁥444$Jem %W_XZ25?Dz*lZ GsXհFb<¸ f0+BW^V,yE/T*T鏞|cqHtټ-j\\}fM`؅0] Yò<)Aϧ\W__ݪ U2EQ3eII[xGBR)ռ<׺%6Xr N"ޞ$(b!PA,t IAr+=}+lɚ3 Q7,&?Q \n|˗/[,o^\*"r-H=eLo6F*WjN2 ,ekODA8%Eh?`"h"L\,!tww>}Z?յ ,"9J1?Gz"G>v%}, }_:tG>nTS eN`'knl6t;WʴBuLl866lZRR0/V#򨔘+믯W?(ʫ TWdȶ>&Oxtvh bѨx&7~m\gs)ϮPAC-hL`YB8(3MʛOXמѧu:wfTʴ>y1 R`=dYXtWR.$"'aŗ=O)!IDI!|T^waBI|0NݶpxxxX` Pex!%kc۲MA f6/Ш)?B㤖U(vwwOLLHd*]L& ,YJL:˸o[7ɨoC6Urd" {fR,yѐ2U%nT*%'$YKN|NGGϔah4r G ^Q"{ſY}{ӟpXM`bE7!dQ)uMK@sA" b*!ӏlT`|NSkC5)O(//7vYL`iMK577KZlv;+](?6ء߽;}]bOrmɤvT*5/a4FE1A @n!1[.YoM)n*[>Y+DQIl~<^!fgme|]LmKu,ْd2liiQ޲Rm#U6M~EFMː=6X%YNS+ƛ3x*W.J`""k]E1a[gDDg6ƷJ'?R^Q̑/ta|Ss'O &qǖKyfrǏxXfL ?Ջ%crXSo#B0)X8#K;]Cӭ-W_czqO˛W/+mc 9Ϸ~~[-4Pϛ"D*(s=NCX@ ,FF*\Y5;8// /644Ics\ʅdl-*vuVސ[) >U>_j4{8%"6"sc.U`L`|QYB(0قj^pZHTm6[yyؘ9;*g Ttp? hA%HRR#idFXIY|;E?>!1iiiۧ"X,k˝7ܫ=Ɣtm S{Uk:lA biw5sKKK/馦|苻wV_RR0U4X^y_QIIɪU 8N3Pr؜m˟X3=D0l|2.F VּW3->_!%4i"QC0[[[z,g-vDtWnWӞUWtwgj[V!' qF> Z` BZP ,eW;UVV&;P.mm]nޫ~u?̚yXuw]Dǎ G_zN{Tř׌!fZ@qQ=#?6f aLH{Ola^rBܕYX,&wFhٲeW)*گz˥4*9*/z\dv{} RCY%4׿9=lms(;y)nj|#8f8?`"hO~>%N]#ϰLFz`i R{EEQxK$n鎕7V.jKXN'SZ}OOS}+JVԖV9Ȕܪ2mXٱpXuړugOȏem(wX ,_<u|;HS /n\=v⧻Қ;/1+5J)sEKz̰+*o2~cSJ|O/"BroTlrzKMk2 SWW:G5FneAXYED bV䶕,#Kg~yAk+v\P]Fވ05$` ʹ,$[|oR=RvB<+ ,"zm͖o^ޱ^\1^5qs*Ώ!ZPPwʖEQEʕ*Kv[ aG+Lm/3J2Ĺ^u-)ATi%WM|>_r$O@ꇕmÏ^?&Xzg;܌TMI1:xDS _3f"hTB 3,[̛ wk"+Mz7}h$s,&V\yB_cX^Zng J:=>dm\{  ;v{UU5çS{ܠbB!A @n^RIy;SrZ锡$hcr:rF1:?y5i(:G##DJ=x<p* tgqج0w$_;:BD( IS'ĹXCL]Eg%JR}}}QᨹwF:ZSM>aK "":"CEƺ3% dr[HU_dK?HmV}\Q$/YL`{H$2mqQR&KK{Z{ǟ/3hVͲ\{yy-*_Z:w ,,!0yIA uz( q===rq4qHDn;h[~L~2VԞ2"&Ǔtd2w͛7\7sOUiߺVVm0H! Y&3d? d&l3vW=X }~=ʲ,5:9;v,|2Ĺ߹N b孮G?\K4WVe8~NyIO09:jY] X,*>E os@O*S A"X  za0XEVV@ܮSgl3,kSnS߿iZ޲D9LT)W1g` z# WPYYl$#`IfI~fs8H21-G'/@'aeT5EXʃE `C"XOә8Cz~%&pL!&s3ȳhүD|̭aj[atJ XieųD r)w7ǻP>c,CorJnޝ?< à9˷&T}PVO"%x.CBa$Ξ={끕99ɜ n#۟(;{Wt~?\R÷?r4`E= ,ݍ ~ @5ZC=FSYdX@ E=|n 0ԩ`W\.i5\,-8Z M%x|x,r֡Px%OޘFs075ľB*vlHʎv}bb?( qՎ9;?1@8eT,\LG|$R:BaZJ =dF$Kz\[0ve)E0ɔ"YV".`Pؘ=[XW;{t2?1"#$B!VM !@ !G;mxQ4$hZ/(Lwk"xP$M4-hrZþMF d`y,XKjܼ{H^Z7|41fYmlllppP2kǧ4Y_uOa<$oEN'3U' $_5X4[! 7B7o^}}dX~Ⱦ/2T'%Ff>i!XlھV\!,HKw_ԭ)KXb EeaFNh?s#Rwb6V߇Wn2^?0*iJ_rLWh42`?5gm2'vwz\k+ӕRo=;:"8xq_QF?z`@aa_`wr@Smˤ"olm?1Ubwnx2spUUЦ"srkWlȓSh_V#\oU"` Gs" C"X :Wކ_7Pӯ6 ,H"~;xMOȖ[+u҅"5ր'5*c,( (D-[ZZpw욑xzmmd͵O7USs8}sTl5S̵PXtbHq\]L^guqG=o׵m[З`,r4E kMX$`,󨙳<>0iV8maa#.ޟ.3;sjEfV}F˵e ,5慑 ZQ|asz^<_<d\󛚝N4ry0l`Y t:%Vx5p8<<< voi-Դ{:*i~p1Wu~8\}!WӉ߷AWO?^ɠ5ntJ3L2je`a%H.CB$~bՌ ^'2~5)]NiAd`!j( [/Π^7Me^K] aJ g,,kItE jM.p?w2׹Uk*Ӿ<{<[[7\'}[/ӷ&:F.m8xOOEfNT e 7 2ej´ ,uHˀb!]@vx 5LQqx7L$(&!ğ=#wJCeʼd$}X1 +4K6❳c2}4J9碽ւsÓ7/YL!JW2?aΝ፡'8xC;Oc|**޳Օ J+!V1\@"X :{Ȍ;NՌ2"B!>W¸h})JJXָE?}tsENɗZpFJؽRrP7_kJ]+Us蚐=dgw/zЂ B_ ?fO VQ4"_ %`C"XC[( ,-ZC&]ÿu?!#5ނq.3Aq#"iD5]VZБ:@4R q ,SE{ ܪ.Ct ,HKlK3j2 $S60,w]M6.%D6X2JōM[ߕfeo}Ц~ =xIq'U!;vw@BEus*˿zz d rf`ͬuu5ELW\kIV&0EwqȈty.  B!S*L&&G[D5_s!^N( Xq%+4Eձ圁U%'«|RzĎ*5R2uAw^a4b)˲h8lӦj?s(.>=)g.b7X4~lW#E @^Xxk?aGΝ̬|gP<<$]( Rz~%@5 wų.b#.VHl0Дyi<s η^{ֿo":(>D* K#yޑc֟f`l.kb ӁD A,u ,ǿM5I$.\Vwz#{[Veeŭw2>ڛ)3,^f0$-,\)A(?k K qa$ Ni!V8 5b\ m0 q5;bC-|Նk7[qXOMN}d"RD!,!iXH$h;of`.DقeYٌ,Av_|)W7W?@iP4XolŠ4˘ X  8ǸHwJXþzVƦM6ɞt%k9cxxA .nɌ̣(h 珃?M1?^njmZ'Er Xj2+׈.Ct ,HKm1\sdJ'VYI X,@ ʅKX τǢ[4v*eFch "5j(wܲ&f>Pp>f !ڶT  (ĶZ; qI?EǧXT"P©%PB-8 &@6\"卍}.cohX+]%W.QkUS=2 OH͊Yq]oS4$q[(EeE 188aM?ߍjxGOHӴDPZ!X%(! T X)@dB R7>;C酑e2,B@ 󗎡]?|r" +do6YU&vg ԄR`sJE+[/Mm +sLjq23,VS;`wG U ;MӜEO^;@ Wj,ўcWᨬrp:rz+E) ]H U*gw( ː_ceg IXag`b0zuhg/t@KpϞ=W-`C"X\ &?gFb;=z<^@(qԍ/5]hҊH"L ,^*`m56Xd`a*+Xv˲|̑ӯv\"lឞLUXlP$$ `@8$ !Ih4:_? Z t-"%QX7a nUvj, ¡x\[<RT}StB>/T,+)V/uHK2J1c.FlA(^gY)zR&x@zBWbYymT522J J*w,˶ڐvu͆-hӦ 'zy<lUh/@<*oK "+^|Ӓ\G{&n˅xjJ1F`3q/w2ؔ؛2p8<<|c  sʹ`ۓXVz~>+>8wF-!4@D H^/˷ ,uHˀ+pgOiݟ}h;aA$rd=o,}]4EWZ|)KGTnoʴB(Z<.<kħ,`)G|f5hj^HDV;Zwp9OCC!u/3QSeY6xNu΢\WDny 0%H$Cl&{LDP0$e lKg Yq>_RU-$ږy^ǃ (!DQaJ<=ˏ2xXbNk:,itL(7uW~s[$8Yg[ZZYSsuɸ8!ڌۻtҫӁD!,D!9gxќ,~+|{VWVcpC=m ]]իJ]hOrh i܂xZ+uQ6f&ir2Ke]W~?ݡc. qBlG(v=Kl' Xbe' ,HK={QE Sށ&5o j$RֵZ$l,eEwO*1r\+Rꙗhh5zÙ\#5V,$:nx`D"=#]mU x<F e**fJRD A.{mJol`I9Fu:Vd}30Oj >*Ƈ5[O}Ͳj}= <ɫbH^ aa-|7 7{^ =X;CXWDk,`25%`ɰЂLW)2^ż XC .``,j6̊ (nZ$,$hYua}= <}(F9!q`b~>;#>>v]톪Ӕ4Jʿ aa-ScDġXu&pBb;$Gn a XF~ @QYEh1C.NFsōhمnB3`{{{рxZ@ \y'^/K;j^oww7fyު1t”/ȿڏhcyI9cn΁ǃ /wsyT˧_˘e:Tm՟NLzg B?^jT9:RPV\z^r_sǓf$ JWcpiiPHQT펙/m咏?a?!_O3KnV5+Ӎ?@ flYB8 ,?]9@$lNb0rU +rK e4E=þᨬ̩t:Se]j+F}#>hX}/T ,NΘ[miFk2 ?_:N7/W P$=~SePff6qZ]]Oq|r4Ĉ%K|~V51j?NCʆjT8/zp8vq fsNkOm-JW}]QL&/0dXjdo˽y#ֹO6x<I2$Rw/-;+&:v%:v|:XPU)!<3w2>!n^N.˘aN@zoblEV[gx@Kma˾kxAx7ȟb0n;.; 7@g'$6WߏwA[f=p?yR~\Kv+!,uHˀ z7 @Z-?`88!9o~:\F)o/'&1u~ڢecX^" ֓f[8{^mn"`̐Q}vш X:.3mM\?25J_|b1\$8i-t2׷}{BsI:5+R$$DL$뙀&3f a<~_`]Wo[eh4l6?q MY^:WԊrLYB׃.e FOD!uO𣉛zo:yfKNA0~$H XUw;twGJSB1C"XM{Fث-^@ojOxެ)qY߇4+pٗ4@wjsӒHΨ7΅KegD_ݹiZ{%RyίkVX*sNJo:5:4ݷ3kQѓοx#9Vo46U $Wfm@|_W} BqB"X;N@0xYUm7{0jK~n?ෑ9K.IΨ [˴.ıW[?/ @ ~LgOiݏ vw`!8K466v{$_pz4cx4Wԛhi:e0xomD$z^t,fLfeian(K,A,uUw"N?T|}8>b.`yޡ!eX>Me}oܩ)+ ,@ \1up`Ebηp,<d`ۗ>K~ /t8U}鵡QxO7S!.#s.nkVnO X#@ J,Kz4q\)Od$4f~ _t, ܽZt+ 5Y, X.+*V4]uUvu:h__9e]ې9_sI5m.NQ8qqZ*`|{Hr AjC E5FM#/%>eٚHՕ,q"3>)Ԭ:v^GN#?P:$e@AϢm_M_̑v]4ID"ӂ6#?z}G> ?+VtFe敁+/XuM1DY՜zϝdрpwøF z^ kVa~KS7AJb@h.(mk^$`Y@XtttVBlVsʌ:OzEVq[1 rd` y+c%E*`  M|tH~gmC[첉].WEEEWyA\Va!z6+,l<ݼv6 D^*t Ͳm>#SL(NHK2 &bhgr>eșβdv%)!~.f]ׅ95\XgƦN+*z`]JJ\?  ߹B_9KV+qGq }o4م` |n,,ʿ݅(+A`@X꨷~ aV$~{iTo|c#Cu E? ղHG=6zRFKX!9!0dᲢކ +!A:W~ _,KuʿXE /q!n`~KP$gZjۼ4d⚴Օ?;qqm×op>h&mV%MfB(Y=.#`|>80Y@X ̼] }{y)CkS~ee%ɼ[o5%̳=T~q4C3c%642{ZK_[9ղRTo蔸Lz{Ǎ#b^o__-ceY|f)Aۚ?!Nz[& kϞ=$ݷ!,uHˀ‚,^A8^IifYj3ݩ%yH{釪>>Z˿d$u- rz˫Wa_Ζr"e0dY&8mq?tv7m߄-AբN5X,k(D{>)2Q ާ`IJVJDxWJPhɴH%!*g>{EQ/s.cV{-!$]Kwowuu0ŝJh\}[,8~z6Q4Ӭ7<_Nu@ Wn,7ղ wpI!ފ$3&W b b!XS[ax˫e I{gu5[]2j-1{_rhh4F*o#B@ LE 2q31:K͚{/ j>l^VXhT\x#%"dVJ,S.z`Q"N%N<O$٢OGNx61*CS s;-* M56&]Tw,T 7"$•Fh_ ?\<'o40 +A:$C5+Sh4,++@=aa/p~?:2q,&`v׋'UF0ػx<+^;=qD*ш?C~V>X@$GT:gTa$ #'|d]m3͜(N?D$d/O0>O&LS!]!3d"єnbb".Xod j:4w?}{uYê^Ȉ X/fj}>~"D!, "?~I&U 8.IւQeJ`8=JrY+dID0ŬXsOXK4,OK3xG uh0Z&.oJ_fo8w(|Q}[j(nFi50UU$e!9B; ~̢\ٍ0 SX˺c4qr4Zx1bț*Ɵ[m%2c#ĬOزK^ŽO'wn(`p8,&\HT{^%;5kM X_Ε>>ʾm甀5k0CZ ,oHRG?7~2L{)d2efocM%05WW/"#9kghX@ìO,͞(a$34 ѓHti4eYɄ,9<<,n\e%xezD%OBWjKn3`C"XĂf3˲f>~{7ZCk>i8aILEE!`1{KX)zIYSB8Ką3 /RVueٶ@ 0Ǽ/bxa>d¿]X#`͒1$e b㗒;࣠6rAX,i^Q#Spfd Ĩ_5z@5MӒ_ʣYc&¿0ِuףp'l6"`z e8@4\V"X9=M^<;j Fz=>dMZ @ZEI:^@b X XjN'c]J%/f7mEOFתONN&` ]?H/ B(QTZv3 Qq찲 h\<+9 l *5Xߧt| 2~f}HNvhnPZiZ0 fzϝ`6 "`"f= %m>Q5)Xh8Aw:8^\Z_&EUVza'pwMz&u/(Je3i|0M23¬IrjE2I%4؍6Fl'|z 3>_ Z-ˇ.Lww}aۑ1(ɫ*)`c*,@ Ly~<rDIY|>HyΞM&4Ͳx<⑬T=tE)O,7fy#L )`Su|+6[4Rm83 EuolԹ@ 8`*mV~0x`wjn7ϺTfʀ߰Ќe ˅fY_/HH#A, k*iSۻϾ El27U-SBx0=Y :A`qLd<;47[DD*=`TFq+1fK,+Ym5sܳ[gL:apϴ"H,-%`];::dRD 7h'.L:f4,0g zch^~o^23̇@3,Ԃp\ *€ P֭uށzSqW*H=,WH2O5fH,] B3Yvʕo o} 7Z0{N"`ys>\](дq˦ohan`k\䯃bBu5*Wz;9D 7HJjdFv3`޿\Yo<!]P:Tbdf`͞+Rq|T X`o:?RJqW+`͞+$e bgϞ\qy I%Iox b5@ނpqMf$APz\B4#c]X]NwGV9n(nG.pqD'8kO!32B%`oqXZ$e~O煑*Ԛm#&Tf`Eܣ:h:q px||(*kXm1Qq3JVaX@-d)t\3_֤ U.fO2ԑODy:_}T's9޾,5c(P"`-\v9K-|ƅ(LF3s'=ҙzԞn3QaA]X('/`V%U_G"=5PE< ,2X#.&£S`mh[F%$kÂKmhKb(3MMN>~#@Q$づݚ*'L!GHR56Z*+yFs;#7-73Je֎Cek&\1֘Lr: rPEd"hxuhq<px~4ڛ0ų_zs[+ނ_!fmA0V`xjxxX:#f On<\mBѳgt_BC"XDX"i#EiD$q|XͰˇPDss%j,^ Kgj+rNPe`:OPJQ|wbeU/^ vD;).=fO2X48ŏv Ѥ:euR3y X#n59M{Ozb8 tUH iRD6Jf]TqXK[_WLDwcu+~N *`@nRx8!RD +iXJֹgɴ)|j_C|+5X|䲤QK=yzeqxyѨE.]ya^zfՕΊ|N T˛*"tٗG K٭XΪ%$e bˆ]h{܏,v[ϺnwQ`-n ӅXG%xVx\Jl`DHT]o%`I2d`4-序yPV0m,M]ڟO~t|X0 0 ~_P#`r,U?xÂQܶ,*z=O< /S=뢌Eu{ki2H !@ \)r})L2Xm$ O N:5y\D *= 6qW%bhzRپ-W(M05]j=̪+Ƚ!Gh{??,{=B$˲m;:0v/s@Na"I]͊sVE,!,HKd"_HnST_,twi hj^`+nxϔޤ+){3@ fXXNO12[*B.NF.sQш2o_NүrdդXs'GQg7L'5.[wb0IyC٪R @  ڣb+"'L_uC"p7ڮ75LАbA~vhGcQO 4ӆXG]q9#0V|M1kKq~_(дnKuF` Y ;{@/\ӊ@ ӄlFa2y{^CGV6mZXVz9n4evשQ}NJ>-孮y]]*#^[ X}}JUBN  _rBΟ3"\)tɅ=T< svr:3JKpMREt#U,M8: ]5YW"hEi+7,? H^"sb1mk%~X%1Pꃘ;@d-24sJx<dQtl8!NPGSi WbދrV6UWQ1J8ym5(+ ,uHĒ#cy;\j~jFDzCB/e5eY099)=Ao8C@ f҅=JXCZjMGFB-fM⏏7: 2XW`$N-Ioo~ iA"X".`):@" B[UǶȌ N WbԱ;=حh7x`:;[!,uH҂8N U XWP8VklE͗z=:\. 9!=>6=XjKrc-o)/ozx/A BOܩ^VikAUWNB*띉/M|}dx1XtE¤8(`$<*0&p=T6o%E ncU7r-G, X sE:xi ˛N3N{k-IML1pUt_ebx X E<mF`9C܇ɦU縵|}"XhXork|SD5{J'tݲ,3)׭[ǭ /GDBž d.A 29)0$ J֒6#މs#aBјEKwo4˰1+%3o^v3nB{yemy?[-{:IڅhXaoDFYNfjZu*>mEh?9ƮO@+'K!\$,kYrDQzdHSSS\ @/O{R@A$w\A;^TwO6LfC~sE`5KNy:6`)4L&˲$Zֽ3?a)Nxۭ;XՕJ} }Mufz}M5 Ðރ%-`n]KM12yܹsc!E =?Z_7䏝m[zfCP8$I8.mG\# X9ɬRo6eAP9% Xh'F~cTcccI,5l*;#w|8u"KeGp@1$;ٺu:ksmCiu>x|ԐIק z= f މsC2+OGcN vN0vYCe} ɋlr^qˈѾ=|d 2q#cYMӢRR#"Ro}?O'?K6**&''f+vޝ+1+kXI ߯FЇ; uEͽ ΐ>IB]E}m-7K<,AY9G_>5lMSêrFQyD _W+3b8B.|(̿X'܁$u@pxEĿA0,Ʀ |!_{ȻG1H#D"7i`2q>ls=6fs=_D.y`e"`9Nbb@58217cmBiGpmp8t-7|$&/ZSN.BYf3m3,c-NRAN,?VX FU.Ze_IaY6]#Y<ݻ7m׷iӦoQqx}<fbVds!,G-zm}A.]ZUA$G\E(vn3'UgA8x-sSV](kMމsf}3,D~5i=ly K[w3[,x.p2g&X K2hoo'YE`x?bc>MPAUH 'kąX XO<Ķm۾/;/y֭O>dwys"2<(|#Tٔ@Kq\$IuflauD|.lH.# عsx>fYr7Wq'Q}#{ZQ_X8卆9Ė>;qlZga- щ͘{fMwvTFOd2q)I mß3~c"ʒuj~Ħ/[ e&o<ݔ>bY^x|>er8SW%` {`C6MS\GxoKEAd0iZoDQt'O {n V!md\Z |t;o헻ǽ}> 2rjjћIT6LtF-^<" AX:C ZKYx FO}/ pw L, \ׯ]AͲX)b*ֈ+nYN>JY~3g4)++<@ggg/0'gL,f'zVUcYC ωZSI[K-%mBY XBgY$Iou$JY %BhZkFwB`}Gx7M$t:t31Cp8{k9,ENrȖ-['NDwaկ).Wn\.:vij"3$U@gU>}[JVh袳ưW}#-ZhkQC&b8=+3(_q=x|tq«q,* []/ͫko!"5 Ǖ1E\* ȕŲ;ob×itW qq ?.͛ҹ}nk}+dn<?~X]s kJ0ϑ֭[700@(!H}'Ai3y_Qںe+ASٯ)mL[[128!0Aү/ؚ66y$ |ddd4O:E777C{.aǎAXx&i|%=&XCo599E>DJҧDy%I1SYs|sBYLuH|"`),ySA2#=6KJHy{Ts5N/` CƢGnozw^/^Jp8hh̿z McKSSStNANlm+[R9 >GEֲ5[$I<)Nމ B%o2IOH%1bW27 AYҖ$)/m3q|A x.p2KrO]TE۲,M'Gq# 8ˀm+zng4䳮dϮ;MA\V!=x'. uE1I,*neЈ'Mˣ=p$GrG\BdXރĥ q&(iA(1Z\<{:zS#P*Yx#G=z_X,I;_vZټk׮ζM6e"sRJ!u~{,o{2u~6XjGpPm=iYG` ιQg ~vLoG("Kˠ;qh(M5`јL&0c tjlV9G?3>i #r 8K5Fڌ$iTX2' @7YoY3a*+1#e2TUYH<6J IDAT0聕]үΟ{.էݻw}.)׉K! O!Ly O"+څ}J{!(tXhZ,`ijo*mmA2@v|y*sӮ涆[xs t=p8,BWwrF"MCI%vgɤ8XZ=A2^B!w&2V X}Ӓ.0 QElpp6+ OH5 Fb0h,$y1EQJcu<CI?dp~d~,A" 1I'`H8 /OoYs8NCX|fXydP2,27#MwN;a%1+OAqћkAj3HE:N ӱɵX}Jzg(T>iKy 6# <ByI2Ԃ{`яZ"ñ?+;L]a'2f[[,RF`DreTib8*;foH6k͵p? GwB'`iz`A/鋦 ɑaZZ7ph,e{<5 ˒s-Y1,x.p,{[Ap\v]ie4WZe7ʼnTC9S=f3v;N&ޞ)'ie+:%KtV*MA+WqDY X2 JeXsp,3O [\GD!\ؙ奍Awb8?fA_wvl>5E`@Cد|gk-ki H [P)*EV2q"OVqn,i 9I>*1qU)t=;3 Q.B̪ X OHM_X$(҉O&F -`a Hn;l":]oRIn󓓓!v=i5yPcҭ~Y@,?4:E8;'ڥA$t$`!(ӗH[C"$Id eYRO㷇tbMߦ/8š&wҤҁ)\qq_pw $mqJG L IRpP? ȕN$${f&ӘF<%;&cWۮ ݃0LUUՊ+:2<Ǧt<C[ :` I%o,Nhat:>^WE$ O;,,D  MgBHH~_; oҬi'˯hg5<;}=gfL!UTG`1-`[[L @V,ˢ(kt^tpD#qTȓ$M +yHViooǢ9 `# @&{iZcT2)򆣁z6oP((((hlLQɑOoܳf]<deu`ʯ/^*l2ra+M=ш^O{N9 ) K= A\dBHHZѰ]33r[?iѥqش<_^^:SѯcSxOWqV2:Y3g+1^  leQ$Q.IQ+B}}audN%hW,Ucb3džd^:t B6P³dJf=G*kޥ׭0wN\@-{F_`{Ke-|[a@\ 2eEvT݈ zUQQ]|}}=-W)t K3kk*,߼QY X&0&4tZ({O,]:N"L4VT*!j*~b< XKR+Qps%9m BɁ > 0_'~ҾfI މ ȊWL^X7 aiXb a2q"HMBHl,dZ6Vj*өr*Ty^[ n\SV__Y,Т"W1h4XJe@ak-==GUe&!JA+ei+s;:d,tbIݮ0H Xh,cV,,U[c/EvUXlF`!e "BOvMyNzP0`>FoX׭J ,.Xz`00̾ɓDM8Pb]QltAMq,˒|}P $Ff~u|آZky@5 Bk,H$LzN=kbg"W,GX|Y*4XI{VXҾMlNm-PYX Uq A@]0;PtUe ͆y*H͔7D`]R\BܻϽ;Yt~nkR>SNIq+E~ieX:?jGT&z#oVipIAՑG0בYG`uK]E(ѥP(Dz#,,3ON\@ž ,Jj,)(//zK\ KA3y99}cFe%C,bßujmʬ6!j&sk}b,(`* F|=_Tt:U~be) =a'3 #9"og&-+(^:헻~ꅤ=].Wm%vbi=}A⑧ANk)E%bï:5xP9CMaSHV"XUUO|i/ rh*;V>r{S&= +//y Aap==3N"7_OGui  }AdwL! X 5;iFULd2f$ _"IF\\eʂ+ 2,s8vO/K OIz9>>ƹ2 tk#VGs+!AJ0,_.([s)W'?# :8J\\~nĘ/:ucaݐ"^;Q/x'.,;ᇯ^duݠ7XZ.U6MTo䬐{΂2qi"OV=K+-`mdzpLZT–v:x_tN4Z⠀uEv )'3O m1,J!eB9 &;` C|AW^Y0rM+VqTOcK18)`-q Q5Gnoz:P\ŲHX37s~^/ޟ׹s(, 4A_C'Mq7f}ܞ%%ƢGnoR$nUOՔCyFw8dBHژB xzoGO?~d'c/Mt:驋 ~T:7~|tU3 9N,mS.OkXHh-OI'C Phll`0'{Wӳ2Q6=ue;Snj0sH$T%ħ 4ٟSaܱ!xElӵMwB7"`,yw8[; vSF`-qPBRb2p拗 r{cE@+,R'op }/=~k' TFXUXKE* E:x`MPi(F*?yw̃znXT49YHZNl~IO&=_utDN'⮒( $OLzM=p8-CF(x.pĝlLߝzJN:0@7tMBi T(cVr -D56>=-l4WZbĞl[ $)(λ={?X)mBѰʼni2j.zs`EKGVBIQD,#ɲN#$rF2Y:[n/8KЫ?O%`A~.Ep{򔞫E{`5_N*ٽ⻯%F= UMUN')ʶ!t dMI"6z#c)=bDv1|"d{p{I) gA֏O5R5h Ua^Ś|>EH0 qʊǍcѠsB1,/ Hsa|ĭ[M`0x%wv<ڻ|qM_88XvD%! [bKv!R[h~gU;Rw% X4,n*ѨK&Ln:RS,9̡ ȕF$3dXFbzE.VTMzmv+*FOdiEKE>.K!U&!*w{f=(˲u*k 0pvABhx9~_p:35wB9_t1MmҪ=$ۿ_ nwGGG8E_|+hVܯ >NVu JR` njH%/ISmn)ԏz{@3ҜD7d~byWץA\A' Ԍti*Wl4Q1+@ buy>0J!qob!DRC\z 2LYeYD"i>F rɒahemΝ}{O?IO _Vr[sA):)ԱV?<=MӈJ?b ls}s F<ȿޭ<џw6ǔ3GZ*:y$ Q}?O{m-~= A\:T`&7}~(ί)h?U[2dN"VbVeJ!B"L{*~Џ/*mA_}ܧ}I\G0{39DsYovkllL,E--hXO*fÔ x]͏ݻZA/b\7C}}}KUU$&2gT' O 2x.plP(D͵ש!'5YՓs4Yڅ2D" V9T 2CvOx1~z=Ͼ3P\\q+ɮ_(mi#YVħjwVχh1eζdRKb`NTlX*wüܬ" ScF)hooǢ9 `#7=k-U<3 hlؾ=/"f=0PWpUz&b3,ZNlIxzwNSci>9J#mK-w,Ke!.NJcuRK{N)HTήaXPtr3]JʠvTgYO{S[8%7ctPeX@ ރĥ4KL:,ZF\¶!R1+A ICsy>"^Njp9J;StZ+0k b"Fn#Eh+?EJ 3*%{Fgޫf C8YHxOS/'klz.:9i&E*30re; tƉŁ@E1mh9Sk{pTdgԈ-NEmτ45W7%WEl Eda4S4 \}%/HǒJW߳>V](SPPW#'rct<*L'_>[|(1L@{` Fvg%"~?@>BڛjX TW B#LIG]wrS#OǮ?5Y 5t:aX`k-]]v5FQnuz(J,IÖz+mi<״cn?AdI!M<^P 4RDVnN-N 04Ώy}W@BTysCd  "`^sXןQEtNOd\TCqw6KM2qAkH 4 r_G&C<7u쿶NҶX,.Z,^J W1M ,A]A>j슀'\0O\eka~٬U-k$m mY.` B(Thdq}GbķNϷw0310gB$=$Ȳ BJcwك–;x} Xߛa,y&68ozd!hkk[K@`3hv9x H adHFZV|EӓB:K;f) Z N``9~g~bH)Xp{pDg#`|>s?=.d%2$ X,;tք F`!YSi("C|iǮ"$}b o^ IDATpʭ:ޱRvmM:Nep<wTANecZ2E.;w\K@`gc4+o$.w¯v6Ac[,cɤ> aAȳ7Ec1-4Z(NЅOdPP Kdruz#bk{pD&bUYt%{/{yK>z5w9$T K 0 Xk1+gA IƢGnW;d|!qmp8A y_T+M:Fpiz\ , B}}=a`jOƖ& _<2 Ȃ {Hhw[ /^T`ո4,-8NM;8N{vB#,,$Gi3 (ig݁hԧ\#M[{D) 2ȿ;o.2".p#Y&G`jg:w6_UkY#:bV]]rr6YؽkP}?y7nO9l`X&''uܴauQi @GC" Y-V_7_ G`--81ٿbsq~3iVTAOh|ZB$'"K">8>$7ivwG:,F%?ՍjjQi#{)c̗nn5KAYy`iF`~V qSͶmdO|[gD,Zl^]E(聅̝޸[XC6/^~DASXbg\Qiw5σj5@#%"EQ;|c3rq zO_>U缼)`&QO+xZNY`*ͫ>IӅ<A%ރ%B\ a,AylUjcͶ7Ǥs[$˴VM!L'̋GX3e[/؎(T(V`d`*4V]tZIN4* }~Vup<= +OS꭭[ ||T_ܲFUaL&{jJ;i4>9ꟌjZt} ՙw6iHxXcZf#`@- 7籗Jvz#Ez6زFҖ.p2q) Oò5z:SjNSdm$ő K Wd|k=:4 'y-5ؘvp8Ngi((9kn,2-IW>xJh4xx6Z0oY\d7%`YӨ<X$rd.@d4m_ ah|‰XkJ&#H.3np8&&&IJU@MQ`PTASRXh H G$QKq0Gkʳ\UUOD"+mP[Y̗wSѕ7Ύqv\io+b+VViXZ*bm#BO( 98*Ƽ_ZT'}?ʭU z?[6GqXsR`G{M^[WKz]5#y^XʒAru탮PD2;lS)r8NG@ע! 9NĞwɦw{z Yey8;K47Кܱ$';B qTD`;]$IDRn+fI\2[TH΁#%6k``ObMލXKIЎJ˧FzG f:K;ceFycdE߻<+ i}ٲX<X ރl#|Thm+RxnǗ`-Q ;O56=8&߰ [enyC%+w L" 0kق0l,ۛsz%UOU(q0^>>ot$JŔ錟wH4!O?iYaݺJH#%ĝAxSH@٣ X7be ƢWL&m/D^``;qQ\K XNL eד}ӧ'$ [,秦bW]m/l̿ (h[ZTpv?xn<>,A.''pUqBSSSzμ:3: iX`L`9W p\ޓ&<ӱu;7kE2qϕ*&C =M_ KQdFJÔg  7n AdqrF̯^^RVy-̼IB+-DzO>EOpii(0##R6;)b2m)..VRo ) &<X\.d9sK$^/fY6x͹.UjGXZL^t:~r6OM]EeH>`Z8t:ϷʶijJÇ_)5ʦⓐSd%"`G/j7pDYB~qa;lIۨ[C9:`;=~ffyX}(`]` !^]\h>tfVk]]pɺ yM' sAIQ)&mijR[h!sm/8@O1F+bAa$I"n{ddW;d wAZJ<ΧIŞV:x'. V|5:sG{y<zM-OOAi= =+?L{dA{pU#. y|7v]e^lHHгXclrf+`yIO :̮5BrGϱTA692Y jii!{~^TcN4zzzfImi1,h- vܹؗ l0+wZJ3D=zpmӝ˳ /Vgf*b`;q{0D"̵%2rByoR25>4ѧY(\ f\,kJzUaβX5 XV!0 iUAU>l>;.= < XV˾|Tx#@$,U5֖^cɳy&b`?]ęN {{s\7.ʤ"kV:Ns~~bnbV&.+1 k[ P,1<Kc$1OlAd~XܪEQwe'Le-1 S]]}y(ۭ*ǽ][d*JʝF2%дʼʪs(9iW PW&[T# G? [fAf QGht^ot6Ftxrm(iLՑXǷݞf \}jj\W=hzͳl[P,I&X,w[2QbVxHi0yY6AB4nU`7N-:f N'`.uNB:4ۯlt:RC'%6z;qP|ܕ*tr>ꕌy \އ~;eϐ܀ldSeejIA.^k>fߟ21{]IkLJ_ZA`3?3}V5F`-kPBEG[v$n7UM(%A\cߕh C4` cIiۓ"+f9zz+Iқg_QR#gzgΜI~dp u\6N\D63UNF}*`K'G^,鮴X,@ XN3Ql$4|T_g{ 8#C,Azzz!I:"`K+AZ[[y'=S&0F43.$A zO#YP&L~(S,uL&FXFyL(:Nb36E[f[]/%k ͷ-/B pS8CW Ǒ:37ȅStx7]::&bClE'?W67r=;gu %>TݜNg7;+I[y<___O ܄43PckC,$<|C7 s{Q"ՋKyHM7T::$K0vFuAQ%IJUK)#PBr0,U !F%(RwlۖukuXaAT|{d/ؕIj#~P!Z (/Z%Umr m.5֑dra>5t6! yz\)&نs8(6zYy>U}b7,$f]XNp8Lmmޯ/$ '~1kA{p%.f0ysEs8+jKfi ӔxF(`!{֗Sc_R~Mmq2I+`Kea@$[\?' `6ݱ9fP3~i'J~ۓw{}YYM{6aՒn?W}KN **qa=po|¾KhJ34z:z)8F1Q٬̈ JkO92HcA "{p%K=͖6ht8$Fų#V9} %FÆjXfW XWZYW=޳. _H]<]4 ܇ddEe H֑ݳJ]GzܴbFH bX;Vk|6z 4Y~x+ǦMƧrڼϴl'pDmOeݭ3bXAaO4_d뀪C(Jul!5X L[[b_2/pHHDUp:ƤU[e0e4H 1M,744QW@ ў؋:W9މK]]ؽk|v gRRwl60  IWl:}0EH XFgV}= At !T4Б=S1f9s1V XȢAgz on p d5"\pn \p¯,Д"q8NYd(Sg]o`MF1UVDksc833 )nZ}eٲ}-b͛M۴Y{okIަ{޶iIo8ۉ۱cKeIvQJq`_3s` ) ~ߐ=5-[XJiN,3L,}2 i 4,EbYS;1PP2h *Bd9X`x;'fK XTVK+`=)~K6Rk3R\ea:wM A UƂ ΒOâmG姒/?~X\ 2Lktf<氯_Ÿ@Uu׫#1l2-䊒f`i,Škͬz$/)rU.^ ,AjԟSg8\#eչy=VTD9?/T(`!WP!9~Y5d$I+3L^3ݬ\.WWWZvbeБ,:K FpaWwi]+)g+UooypppIR~w#}ACr'0KD0Uon\l_~9vA<<(yheA@$ǂ/!d|9q2?\9Y5,K}=m5^k^s&Ffɔ7YOܷ#U XHpurw搥\.؉WTk(I]cX,ozO󿕝دAF&ٲY0YtQBGI}v4~?n"7:' WB1Ųn_U=Ƿ6Pߨ^6-#?kƥ3b1ϖv;v8;-D|C lC+pyd2I2fdLbL!^]] DP M\@*Ri7|Ѥp9gjX:J j;?LOhii]@Yi"Ap?gF1cuDȥ5>g8NSgVcsFO9k  مp.&fLL %g,-A>l˪ ,9LbeYzwɞe[w,e݌u5=DgKkqA}fZwa{};ѵ;ݖdáqq3DAH"s@4їzg^~ .<+К8=c,|f]. ;]<͟$dѲJT,A|xzO'1ldz{jj(x&.ٳmuv7zik&{ݹ敪P1=E<K}K|2yC??$e~kZBXوpHD%qNɚ{..M Gm 7RM׽뛉 62G~^y)zn,G N}ms, 7T4Ӗ]BAcGk>BJ=Q X4fj=4dd2i>Uo\y{o(?;-2![CqԐH$|>Y,hbONI' d.*"d &K5,& 8eЌRRܶnbI"y{ol۾qㅩ摙h2.4R;7 H!&`YB p*WY\ѴӫL!`a:=|XMdH"Uc[N|ܹ#D9<{kmsZTq`z2 :+Kݚb+ bYc3Z\\MGwyaad2]h@֐au XxVąEO0Y|3~?bg&ͥMoYBCXBh@ ) H}{zSX,~;FR<&`1^XP_G X)G0E l `֓#Fq9K+?H6o4OQ]4`+ bY#`eGPZydc$(,],::K0 ]6v*f0#Jj.ɞ3០J0 A )5KէqA|SO>j٩`mۢj^, ]l; "/.ȘFhCC_ mϲ=Mү<%_P^ Aek0͟O$zOl(jWN:+Q ľȘ\#xs-JX ?f`!PBJ{74i[*;: |( uC6/.?K DiTf`#B!Z?`d-ky3:tp5Wt @7Ǜ-~`} &O(>3MˈUꅿ mtS0]b<Ɏ R^` GJ省G}gǎKk6BfA0eA#mXdGP#`1 3AaÒkZ1워6fg`^ р:G)xVDOW;@(HoHQX8뭫2gSf`!(`!%=Vst8)ːD:ƶ/2&@eN~,LC [dG)/0 X_fs=z"oA3+`a+ bY違^Ȏd2Oz%F[]:2ٱ\*<+ "G'+XiSksA+_־}* ,,!DJ Jv WSrB>mrF=5#TP(w0"ޞ9g|XAe`~J X`bbUa'Tv5yg_m-rco9Tz`Yv;\,{ }0 ̏3ƵәJbtD|Psڏ*y` XHu12l[Mڔ~w-^9FOn~y2A2, 1!TpN+Q#Uaa@a:Od}VNiß\tԤ% ].r0˕ʯhw<,Aɘ &UJ(el } e+iL0 jBB/R4Z"Jh2^\Pj4u8pvZv=H$&&ҍ fsCC՚*)orEi xA* w::\Yo|cW|4Z!T(`6c2.DE{n)|waicLQEQ5 ,#H5iuL燆b?.sG9i",BPBJRL-M59W \ N=fj5k4?hY#˪C{{{ݲez$ žA* *8&g2#X oXI!Inl QulĊX.6X%gi+d2ͱ M,,L&us .ł xWڸe]cm릶iirB-{~Q}  όIjNFk;=x˪q2|htfQ$zAit3WW,VV$.`d8 \XSɠ(a, [ƢѣHՒ1k%A0݈[}<=3MNNKk#<)(KuD:2mg,Y*HdYξU}qae?.[y^sdk~a2E X T(!J ZCbB#,: , 8ncN'ؘ,p8YeFxPA Ag` Do }+*I#Ua긕]%ce|!߹N*fF섯J ,Aċie8nST@[8Mݻ4S-{ wDfA!)]22 (!8žl%~xK.<9Xl[86XR-dd`%@8}ؾ:8򊦋i ݉ 5qy#mnU#`e,zԇT+k cn-@Bg##w:,9 ,Ml&(ۄ&YPBJ}{3j5X[:e3ۯ821p2 *ښ7j D)#0"ɘm4WB~ ;˺ Vrq rϤ/'侮f-yxh#`eτ2t91q{?%?3vǏL%'| 0wdڷ+h,b6@ ,!DJ t~~!&1_*{|ᱧmOu߯Ma\i X\AD2&|33ņ\^.u]X3})= X`˅{/GAM"t1N$~>Q^)961!rX1&y﷤o/J ,}0'>`c[pkoיlv֮jې=-[w@ņ_q R;3KE%qGL/ߑ~rkq.%6ᒣ<р4=RH1Q3HFѻv\0ʰ Kݷ.!p4ټa=y1 e`a+ bõ<a* b{[L&0,Y[m٥9ew6>*s !!.ٲ?8m V󃔤.f,Û> X X=.%e`)ɖyQes(rj4zv0 m['S*,ONZX,񘚾m La<}y*fu.^Ѵ2JӋEh ec]˅}nh2|qùXgǏH5 끕х0QuT'CA?2S6br_+dKiiF#`fWfYPBJ:Be5a? M 3j`fn59Q%IbY8m=-` ! W݉ 9a31- w3cebʼn%Kom~}*pPTI刟mCҌb,0s0rn99H=#̓ϟ2{Il~Ƣjs3}Sy QWWmdYx(:r&٦e߶A\H0Zo$I uu02=CXuի[x<>sCrXX`gL,4pSSSڵd2)Ɩ&^@|TƵH ^CɉpU'9X`!vXT*ls?gu5ikX,F,V+D%t@ )9kxx_owy׿+YSFX,6rnOgpoN?Zթp%g $lIMA\f:7Oٽ+%`R) X?ٳ&(l%šyh:?Z X`f XzX.U8Nhݹf0Z}:}WY;U3XeXxVDd`y靈=PDI}%uʠApJCxJjq~w{ވa p8|m}w O?~q X%q\vrn1n(#ӛw4ֶBIkU>P(w!E X9._\[[33'(NƇRzPս@,u$_mw V<rG?mID"eZW7n{ll^l6d"- +-`U&`9X`@I Xlpcc#@\55V*{\ ;殿yxuznHSZX<_/}v/}K]w"f!Ic1&ACA)ffA+^Xbۻ* ຮ!cqGD,Fx/EQ=O6׶^?2D53j.FLiZL{:&ǑU$IEdZ, vNӌ P.LP-,[ XRHtƛ#ICGc|:jsS,8FGEGK s_!>%`=_\uN 1m' +r`) SֆϾɤa!Z2;Ee`,ER˱u-t&]?c4XYL%avʳ4'HIn+VȘ6KMܫA*y T*]YLA<̡'Ku  NO; X_nE5$z{{7nHٰaӧA>0ۗsǏ(b9,PyVJOf2/˰]р4ٯ?A\λXBq~:qYD]ۺU0%`/`UE+ bcm SR!tV,aEVU9;5wkHyK Xʚir:V2HfF2@ XVtVeWT _1#LOɁIuaYwr X011}Cdڼ~ht٩'?5VӇ.W I<կbeUbD"9\өR1\w{Wo;M:ujjjc2v <*+Cӿ L=_c͚5MMMs?/E[slxXA>0?+?י|ٱ1eLlիW/}wz2s~/Ǿ{@ sy! H?9/=˻VLP {U6iooȩ?P[MxGw}]۷oQK/_;ܓɗR<RAd j?tK󧧧Oi66jbHE_;z)ɰ+41 oNͶ78fS Ax0aDBEZtkz=K/;=q,gn^w<+ D93FY˂jjxZx1x<-bqݣQǶ{r,f,&URZ<ֳ>^ů|0}8uXy/ :X@ZJ3tl8ܭlO XJ}EKK Gk5sbcm*o3na{v{ૂN"(G dZr8Ҟ5R*~Ee&ޢMܫ!1`Q.%Q~WWEqe>IN@8?8P J2Ջ\eQ)!_M;7*ޕTr +/?rMK?F JKԧ>q? O?\\qhZ ^:k%`2Vñ_..$S aخ-b[VȞxv'w)Rt"A9f7Ĭ&(No֚-&hP\PPcџM5 ;\2Bd29Mu7}?u-[V,<+ D2JG4Q~.j.].Cr\t),%FECiy`־[8|oI UH# :*i觗@yxVe,ɩɠ$L7P(2m% A X:VL(ME9w9bgb̝u Y~ HYj5o>*:'Ǒv:ܷGqTWe X͗3ǫLB @I K Vssle7%ҙ\[= 0'RWVZ2HePrWuvvW[ %י~8wIi~og]?!ᰲdAE+*`Axx yrd` 6RIR$n2 +/N,7-bN;\5~A XR0 SLlumjz:tݪr:::½[̼<ܿ~{5 ,J e"cklN X.k?O.m-ucsSrR:g/ :7iO%g-`6V+)L$t"F/&ˮ't&$Id2y<їq)g`azSQfp,z%â( e93$J9+w5dj~iscwu7df`4=5X `˝B"֐Fff ˖-+w^/~6x @S;yw)Vq&s e`"^&^y;}Dg` S)Ћ6(`!%ό6q_ ,2I n}(]XŸ[+}ȃŋ׭Z3?ui3|PT~ÔQ\, Y%Iͅ?uԙ=74> [-X`˝B"H'&eEp: TY5L;M=lM܍K ʃ(Cgf+SdrcbC MM퍟PʓYU|d` ?Ciy`!H6X,Ţq8ĉ&mMLx}1ݼq3ctf`a=T,msq'h|]΍fVMcœ54-,)wt&8 ,Wrz,+ׄw/N"/y11ӯj%6\rGt ,ԩ+cDJ"h\YJs V۪鱀lH*>;i n/Z2^DfX[B %Μ`_f{8?Lfc-k+}}聅  ݈pԿ`bD"cY: h 45:/MO^݊.EIJHƞdǺſ/%-h`R 2: e1 m@tA_#wmb4%ER"m9sRA0NXQk%c2r:r&UyQ(ĝ3y*$@X (2ΉoNt"~FB2(7!۷oE*2K`k,:׉@<  elj4m#/=]]]O:S# e׍fheuy4xT HN䐏څzg?SX3PՒ;2)c22.!W2rbtxǑwIsDS>RH zrk$?tKu}莪LIA6e\)T,!D ̫"b˗7u[k9͖i ?LJT<a``> XԸe~\?c\):qA<}v(>2lV@ ZDoTOiAJpѤD .G^ǙL&~2/SKk7O]>K'˲d"Iq,גk9fjE\ah|'亷1 OQ^RswЖ}?&jY ,$:& Vge+jʼA׌i$xonnԸ74E0Wn)>0#> XElX}]d2INpa4=LE֙'?97, Vr.iWӚFfb:B,km3{4bk8rEUU>xVDrj>S(Lj`0 RCI7X'&;͔`xxx^3 a"^'F0q7|E<9mÍVȨ6cՅP#`)kq2}܋ я RT|LE9g_b:r0Al6k=ssnSA0N\N Xxoy3X,6>q 4듥Mo*_^0>$*-e< J}*>2?&CʘW I(63/LG,޴豺YМZ~SuI[P 6ȜA ) f9V:LF,=::3em}ERڅgoI?4ι!92^(TA: 2^4$*)yɄju/Ld2"`3sXjXAoot֩7BכO rn:duձKgwz?ja d,K&W2UUXxVD~m^a0Y+Io7ٳ¹eYDZd X&Ie=]PBʀ{[Lg$re);qnK+J"cgBݪLp8tC(O&A-  AJJ31Lu>xU/ V-RƴX,CkHdx8R;޸cArg: L&HxG'N>պٓk=(CC- IDATCH$_& AJZbh49::{Z75 T{+Z%A , aPwn ݾ^[mVGs.Ċ&d , ,{ȫ~ޮN߯9EtՎn>?AػY,Bb_'5%eh"`E"ynL(!D AJ i l/v sf;*sf`!(`!%K ѩӇ>_wtF 6)Y>FeFoV;A9>w OD"}ᔚWe{̤Kv7{7-`ݽ*>)070N-SOQ/J99  j۾/AQJ/LS~M\'''=O S^r<^̥@Q#cy\(w4NkK5#XeY8Űf`U ?2gPBJ-i %@@\>03"`-λ=FsX hʿ? ,(U @GP),,~uʇ\ }hKgyo֙\ XuI$P4)?.;q "Uȗ59 YMR w/L,vֵTˬ_A.;Lvtcۍdϥق>ޖ+uދ ȕC剋dm2R 11txUırs#$_؄@LEb;k@ ,r[w M XVɺ8Yooܞn8}>>ћ]-Xahrpe>OIbb9O辿l& bjXȻS{5IjT#p~ ,clLwx없oD"/ Ub.Q>^WWw`%AR̬#d (jkpr` !R_kX,7zn]ɤC:Dw rۂHQ&31_B0>N '}&u&SA0FpS{:pp~>X۪Xdrf2aZ-PTn%߰4tؘ=bs U?ɭlƆ-kL9:{`|&855Eߤ55thpq2̓-+ XHI޾.úl6yk[[Td28 )Y`* D"A9,XѰ70+`E6X, 7jڲ+-`/wxVD!cdE/NOUSL#>W5TE7IaNϚwtQ<d`A9XR:zLHD 5y(cCRRbk۽DQkKS3~;AQHzQuCl=HvVez=n{hh44E&MN7© V1rg#*5=jX6KjVk rreL[f*cT u *9$M\$[lsB$A)<|/( ގ2q9n^;֭iP6myR,L{)|k[nh} C&Ɯc3y7>:OK$Q}B XP*&IJqoC;NvKNeZnw8VL& G_IVxk+={l6]SSC+a-[΋ %7Lw b5A,w<}܉ E/Nn7zI˜I\.KPX9miˮ_Q=o$_~J-5sK <+ 4= I&q6hAJ"o]Ȋ}RN͛Wz₩svT ?2OPB*v=-`MG7w佇NBHcW>>9 2ȧjz$3|ޢlrNP"cBR=OƦ>d}k:].d"7o6r[DW^ AܜJ90fծ%nՔʃ =mG3%c\ p\kWl\viC ek*+-rAc;6v7 r"xI2VgeXRX?>L6*g.I UOxKTطާݯ>0*ۆ'(`!Ef3q#!,32 $959JGeAcXEDfiۇufE":Osuds.unҼ+vwũ&gQAjcTg& iÜor,y"\=ҷWǯi1R6? tWD?ؿ>$ό=9,Me\WYxMkq7gBdnﭫ#R,Tz{1V+\VG2Ͷjh^(<+LcwZ UvAeD0~1-Y釖gNWNKMoasS)l(`X-X TJ bs%"Eis5wY J*k:nT ")~<>l[J{``_\V"9XT^vZˇ6{&$[iuݻ#¶3IǷ>}V  XHIP?3g`f+PR+m7&lԧc@ta XUa *2"Q?y tR$I>OIFTTooO|".$%`]Z._P2X`˝+M!~/-7:3|ٶd`I4bYGaZ{eѤ CC\)XxVD}Z2m2:wй`̓?i3;4sΌijr nWʓ ,246XX`w6mwb}31dVliz 7gC0 ( JRB4їzgʘJAl⎎>znܮљ|/L fCΏB3hZlޛNt E<3EJas$JW+zQf3Of،۳h4 Fӱ'mZyy` `e3n^imb5 "B ;kzv(IO^' iܾ^8sp0xɺ#I]"RfV'eUd,K$ ߃%@QIIQ\..l6b {LMګ1+)PdE4Ȫ\c:W%pq^=-+9Yק-l:O~s'O?;_VyXjEY/7bVإ ޣ۝fM4 7{0<0iVsx0zEPϱ 8&2 $,Q0@1=z|%D1fNnU/틏ϑ[*uY'X;/.h;w֥,CNpSS;:Ng0:.Mfj힍]grP;:3c?5ͳzE%Ad]( u1`Yݶ,;n{ddܞYV-Zm0xƗS 8y'>nK;YoYjpv.HхkslVf N@R{ 4*LtoWґ0T4w,J,H',2D5΅K>L%mm>EZWe: XHAA.``Zi^&`5Yw3k%|oCaX%7FQB2|oؚN1.KӑDL*o|򍙔m5Y5Kk:ن;Z_a&M_" >$ 3uVDOA X5h,V~D29HóhB~W:n;XB{>;[u*SsGg9%t]=d}xa~L3 [֠273ij‹eGva?s]*kf`!YJARrq%es1YR,lD k6RI.QFB](pګY'MQU(`!`K NL,$2}Ŷ KF=]iLr=$hW] ,,V/v4wxYe`Pя{3äyP2u*5̊dX(HjZeH`uஆk %lm7Iq!?#xq/F,J,%`f`TVAYbArH "`K\m\ԬpOJ+4!kgM+LMN}~s 9* X4e`3@2@" zC.1X^ilydAEdɭZ4(޺o~v<}&+XTʻEDXcfU % Mυsn Hݳo{BYIƥĂH d3|hrI`NkIf`ddČ̐U,ZkW6 o^m\7w^4!-B`32Ctݾ||Do-?T a~~ EbǸUG)yhPR HBbɟ,$R-싪Ϟ&`,KgVf"00ҵXlpv;ڦsԯ `#DX8-˰i `!.a978ٲFH woq\-R !WXBlPn؞ZrMK X 0o%3]bX b1:dpp h Xi7f5fzUn?\1SA"h42 0 de{Y:AMA6X;99i4 Ld`J(!DM;@qs+L qG,Q3MyvT/K]ӂ(_ i%&$TZ;Cg7/< ^0‚BDHsM[/.}եH#(̥,F=Sό|jv]7("HqgN+TGx-Zi bYRnD:Nh޷tc_Ľ$,|Da,9ܣ(Y5k^']k|8ו ~dN^p, ;##E X&hlTI]uhv s8'|{[r`AFVC'}q9OeV̙,[X#cK<~]=.^\"KFP,+3m+e8|sgSwh''~[VAȏhAXADh0F ,h\As7|XUuKR "m0ۼydNwy o)=3׻:$,n7Y: f;vČ̐UDCFtOZUX9-zʶaZ`8.sTNs_͜\joGƉ+y5Od\"KFPJK;^'>CUԫd2f)}}%~~rnzUmk`6QADh0FpG,.z&86il%so|Ԋh{( pOO讫Dm79N.LKwb`VkkR a[3LBD_}&|H; z(,M DeٸH Xo?)+c<.6P>zRDQlpo__rRAg+4eXz{{ɕrG}J}0oݓo %1ROfB!նG, FPmfFRnDHzsY>A bgcpF^Wt4LE|PeUѓp$ XrL\E10øjV@'^w3zƒlDQD}+W~%-dA RXf騶K ^/IܦOLZᴢBD"_OY|}jS]/csrmvqչ |)A|?HڀN1FPI`BƝX2lp5rYL wUit^QgUr Vr IDATnfc40κGpgW'' 0s$³FG` ]Z"+؃w=r_IqwLEr2MVJRKcXdÏ:(`!`fnQI'JSIPpaO$fy{?qt򿉆5H6p,,K̉H$Ғ6lp_Hɬ g9~PݱuiKZԐ[\R[W^K1Hbg#H'by>><%{ -@aaI=) _<65.6v9llV,ѫRGVbAA`%-xeOJc 1qX,c}>_Vh ÇzA6laX5%J=kh-JSӌ;@h1HUgn'ѰljEJKATIvy2 fDjl %C٠\h6p)K)# u[+C:$<7Er>\.ep AXeYXh)\w Y^YG OqeW4@4uY0Ad]Rk{#+=;; eD,+#|bK!#bp^9#0/0rMd=O3*4qVX It/JNnFGu3Mpرuy^Q];kǷ>cp8rZZZiiiQHM$1J_$3Pk8 ׶EߤKzEY-1+I~l_+}K24'`c40κGjL}bJS.:̞&O8QUJ,k#"[i62<5dNv\_vVidqD9=scg{^''۫U? ʠhu/V7ӂ(vOdЗ4,RapKg`1Ri>Xzv$,ј=8XkEZ"+#(R[Q5rҁ1VZ@(,J1Hbg#h7Z aZd<MT/ u r:n۵ʓ{NO1.J,#Z3" ,Z Eg`@e3Xr*+S?ͦȌq,A3Xr3B^ү,,22,B3%ӥd2Jr8DZPXXʓ;[8C'5(`5@Fb{Sr|˾4XLSk#ыq! YARR#b`Vs|04F޲EDR\̱Հ_h]5yY|b|d66Rij.0 ,Y>iX\6+lpTvgjrzٔ{k]&zs^5\R0 ~_l[ ,`n6%8O{` 㬞4tv<Ad%]EizM|>", XQ>80Ԛ70% TݤӠiX{m-eABl`4RXB{SAL3ble ?saqX[gԤ*k=LJo7UZW@,DOZcץR"XN XN- XZ 4Aaf(ԃK=/Ly^ -BkXs, +_CE vp b9"ΟzA(N iP}JmDVN1H"۞_mL&Skk]ɚ~%g򽉎e=9Q;聅(&عszRcgFE ŠTRPB핗74) X(2;&HD@h1"G:{\? ^/u^)e`FRuy&Aw|| ;AazNwD1PYpG$x<^k H*\l<ʇ=dd\ R/DVNQKZ@ԱHBNFG]]]V郳a"/7[t2A,DBkHcA{5"QyXm1rF({wyz>˲R/Hj0쒖ZIBCW) x_,) ,AXZEN/fO^ ,`h 'O=K ޗ61?9Qdetts U?Hz#HсV"_KKJ1fE-("+;' q!"MUڍ#X qK3~A-ڑ  X& ݈P5+J퉨Q(`UT} \Qhd` (!HeT ,Ų,)lI,QoN5'O Xx| ;Z`AXi&PalԳC*'+` x\m]~kz"+('Oa,LyvHqlޤUH!k "Hfg0#I6$Q"s|}aVXW  R)1+Xq!2L%uKW a$uh1 Af`b*X,֚o3ҍ;_gl/|EܪM[q2nRIGVx`z(JすP$c.;BڏrZw|hV⁥ ,Y;h,fdAL&'#"zPeR,:LZB1I{o m*+(`!M<892=H+s2L,-XBXHKpDtvvjAk^ DW_!"T0$c?66FW@RH<{?u]#D#H`1Um 3 oX~(7Ǎ'/t=V` aKFv",-GR-!L`72LSp &MܵD$O0Ŏ".4uT_A2?u_E"+DAL;{侴bciO4 >>A/`ZD Q,Y݈¹|=<OUbU%.L((GfVXXExa I뤔{B~X&3A`VA&4 :%UV,O3%`g_E I|Z᧺+ng˛T/DFIQM\n\QX["2(`!i/v韞 p̴te ."mi7gB@DJ&*z#cuc>).!H!NRX*XiX@q9]+< ,A4 ,7f˩I>3)VOzc+bp8<AJ^Q2|OH$99ll%cɤء٢iA ʠhcǎKi.'9dϲɷ wܟ/sB &sn4de67!K7~MNVZI Eg`iK6f ,ɍS/Qa2d[ IJ{SUBr8Q|ܵ kΨ`A®waIUBHU8-ZA`=z=p;ĐWg CZXXZnz]71FWğz0ԃw< Aɔi[qp7ɭC¤ ^C훸kІ(`!HNhv]o(p, PvgI~2\!hDHN(OFE2 G[jskT3 >:֨oOA4 m.Rs͎+:9*ǟ?̶`0W4[,5}E–<* HI#.L sC+BZ߯|ުs6Zs3.΅r*c):p hKp,sd[%9| ,Ǔu&a daZ'*9kahGNouBEI*+,ZA A~7Y5q\U`~u"]VŲ,ٓӳ9Yi:3lpg2ܶ bd!2$O|Tg_$!Аkiiu H$^zvMH$j̓E)  G%,$x+8W.0 4[\k?v"0%}V@,DOQ9+1gj+zO9[v]_!m*`X-!D3&ϲ,튰ɳX9hOc1k|2@" oB\fD_=r_p&X%`eJΌA;z%y"K DePB4lwTJE< 9\m5*wOKŃbe*:w-Gɇu0u!/H#cѹY0mXD7XIcјS-!\XRBѯN|bG &j] E{][\^:&'4P(TVs8W#g9"+yƃLYxGXtj*MMveYr\%8>F铇rs7*hܹs_Evn^/ ] oݒko]7p|׫`X=7B"bdAzh9H>ca՛^of\I_Yg;Ti0L]]id`۰ ;ZIX&)MIAԱ9  0 1sz.4 !>3w&ɬM`w>)K DVȥ "SOP>2 'x*++uMȶ^r1"Dr VnkŽ733|>g޹(gy=woe}Um|9Hޅw;d&W10 .JGl-ZeA$1P>1E˗KN٥1qwkyd`p4koXh$6e`4(}je~$ @kRxŵS`4C XD" pXMSϥ1wDY "?|>漭bϞeY-49x$|.˅ zjfjG 3#HU Xͨ{yN zh;; 1ɗkZ8}?ou jx"`&a],Y6$f($wf"}y2X|NKb. ՘B1H x4ҳ(i9#X\cJBw/Ij3~ c ?7.׳FbY[%~}n*kξ  X\.;雿?~_ywȻ%[|O|BI`&ϵ˛ŦAaz:3%sHxs3)83K~f`A41TqZBvԢ >Bb֡/'?M]y>L\6"caq_$h 7u\:y!JsOOFS|Y:'sbɇH~"KBeTpXae6ЊB/#ft9L_S8[j$L,5:FPI Xc %w8iz1(Qrh])`_RwVMmX`DJGU|3,d:/#aUrc0e A2.WڥD#DV%"ߛrpͭ$MK3gƿ׳6Qm(С´4鹻ի>Jk~ vA %\Lgz ~`= {R.u[.[\)% zEPąiӱeV1D$B0ᝎK 0{oIYBO֒Bz`۰ ;͸ ,R[ʇ]XXQ{A[kIl4Ad%yE{qר>B7 6.s|RM9Fu}+ ?>3>wg.ԟ/Q &###ꓐFdXS9#ްnfr_0P!lv2[B!Nb [ҷR1DfiCgmU̐^Bv!D'L IDAT%т,eW/RXg`VO{-9+7"l 'iPWD+c]bPnXlm|%`I뜁iFk>1ȇrz] m|5R@ ,Y[ܔ5ʞ0LhC~lC;I^e d*Z' Xdr0R/"+/!tjADbXS:UKLg|G!7>MBUT"~0꫈<,iaӷpiK^ojjڴi񱬗{_n.6).PB4AggzcM%k(@g+fcu3.y71aJEZSJ8@ d+W*`{bJ=wfZPX6,0ŎF" ,rl6x|xLGi{4TKYPR#BDY k%Xy8C%ht66 Y=P~yjkk[[[i*8ljcY߆ ghƒmY"`5x6YCB@(0)v$}r0z͙̿֔p7AjAEQ%w_"F֦\xff~K5끅oXh$e`$HV0ϛxguŐ{55d,3ncL6110+zwDY kDvp"`|>+n=NN3'_v\_&7e6g 7l<_Hs;v \hӹ/ap0 MQ4.}w.a"H%b<oNJZx@eeO /\&6,0ŎF"Hw! By-½/Mԡ/<{ aqpzz!ua|d>ӆ"+a-(&= Luʴ>oppÖH#PXLe| [F|l.890sn6$'snk^(++8~`</4KS) vBDХC=>+MMɈ|1,Y1!~eؘnWhG6&0r(-xd}I;{侴\`0zDl(`!E8o aZD,{oO^u9i{V09bKIAZ&nwuwvj!x^kM3/A֗\|+"L*`yޮTq⡶rҭoLj|^ ;hhcǎO*N L!uMDu`q[F샤׎a]"(.H(lBar.h[{-^/j HZ۰ ;͔ҤтKb֚7WkɅق^$۸S 3/% "B?<+A|og.V?gI WBkKQ@ qdCQ¥a@(92@YC_O/][k51;زavO=lU#AX-%g{gNYceK.Zs-}f`-C BaIA,v42qUWWCOP+]8ٵ`P!xŶm D 1Fk_#4Ad%EiU1&;p[ޗ9v_xr&@" ]h||ojIW;^O8?}jX R@@ AM:/ ˒eY*MMӝ ud @Z/ AAE,b'{=֪ZkWtR NêXEтA`7>JdĮpUW/,C3"0|\30Vx^dgۄ^Fp*TYD蟒ƌb6֗S ՚̊H$ hTNAZv6 , ,AD]ၕvjb`t}ye399=A (`I͗0tRy2t۰KAh4*9!]B|+MV}ݱO% Άm Rbhv "Sf.FhaHiGp#.\҂¡hR^9e{ y4/r]4ŒoXh$6UB ,p8ҫzjmu|OeA2[Ǧ?5%`4Ad%zi,yp8Lf x<կ vYu[xs盭;&r\Y׿A.hvXT܆*=kJQgSl-`[ViGp#>Xt aJ a8NWoMNrщ>̜ 0X^ȴ"J51D,dM ;`AX,˲,KdJZcnn># XHЗ-$ >s;DB9ŕm3S.  V=i2U,A,%#E'jQoS;H9v\ kǚetLa<';]v'dTBIRS C}!He`X<ϓ0Ig`w.M#QkzVDoyf-w!DKC14(8232-izb6q𝹧ݾb5w.kԒmM|B2:|YVvb|ǿ~n-rȶ;~Q-JJm"Ț2a ,hn%g:' |V4{O=ȟ}i5^8%|R7ag zg4Y; 9*G=,2jee, Or *! DUv CZBH78abfȥn_˚xBʘ һ"Ⱥ#Bd|BPڙ4ƾEWU4Ѩ, hPQ֜Z lf9'ẏu8=r_/h<J;KAa" 㨤|E$і]əK<3h..*`i7 ߆%HT aX hUKEG,k@22a"r_ X=,DY Da4,T5r%+X?%S&Qgl%,A/Χ2/ vȆbdddN Mz*!g1mH'|fff m'^rsbpp};Qu\CafAI"Ɇ>,|闻KY8MeW6_+n瓞bt!O_TPjsu߆%H91H^#qlPU3^/++݆|}Cҙ .̜^͗_ɗ: ?<HAFΐ1ۤbH$2u[Z%J-[Gm;8)tʛp xR=J)RJ{0.`}R&& B!J4,a Q+wfs-K; h쑜r*zRY)0@({aǡdjgmX.4^W`jaI\(:mX`DfIc XDѴ<_gc TC]d,BA qNeA :}&vy]|W? FRWM~"Ț aVuBIOr[1zJǟvT*A -2T(i?FQ>OhqsLQE#iX:Rn3z Bc2Q3u4a<,iklF>KΌ-\mSi|ϟ|KjD##l-%@bVe7b4OgO=K f`!ȚSxBchs_v~N::Z[[ur10 b4{KzC`7~D@Gւp~~~ff`0@ DߜeRyaKa``ɪ`!MPڥe`KTh&p@m,\?Q: F0R!%So0 &'g-e8? e- ީ Wya A,vA]5I*C۝ +=:/ݫ/?k6Ҋĥ˒/HgOCrvQEVv",QNxĐOɚb\5i3}>@ <+=2smP(D/~Ng!A,D#Zc[N !s&C#:K;fۭpYEƢjy/ J;5 ?xV?J%aYr_Cs\y`NRVu X6,0Ŏv"hXVAE7,ie:.Z*>ޏ?j.`QʉGqcWX]Ad٬<|WάX^W-\7pk͛WMG a*SXKQ=dY,@bi gb#=EdB7ɘk?<9 ҇ht$Гdˢs|Ծ%]]]ϟx1k 4%"R:䁕ռHKK2I;ЗC'~y9K]>("߾xAV<ɪ9".ϓ<70r@QBj,+ ,T0 A3hXRyKf@i7ޕƦ^xGK*W.M !(@`q*Ow2 LL_\{:ڶb%^oyg`QXş B((?9Y(`qֺ? u>z0&7M0 C7ai)˕]H4{hOY D_VK=(Se cc朂, aIf`!(`!vU?ᓿCq!nNvԗL"Xe:/U,y4tD2žT\\+|h'K@a6UZUqmX`DfJ} >qb|53 e=m6gYܵB壒YotٱJi[/ƕ劢@Jw/ch'ȲYyE8Vn53nr)]Y.KEde+m֕*(`!1^D)&|q>w+tDBnVЗ%f\JAPi2$뒔|K03Hv2kPZSLb8 iwJD>VtHXT-&}^I[Z߆%N _q\zaTX8NiEQnun W95rq"(F8ɔ5pNe TC5rY,k2r!k,&Qo^j\&;;iL .+D֝4QP#4rc=9@u&;bp+#X]ɘmIZ ȸѺnuە,Z^-߆%Nit(iw"hZ!z q9a?䥔C醆v",b=*mtUmP+U?#^z(X`?C#G:ubYK#Hi౦s!ŝ{ chGDG6ۯT1Vx18Gd!ȥU 23F) iWryh4:??ޒOVmUS  j\ +#:+z>lq/8:GNv8>yX)r4B6k.`G?:p/ϟ衇OdA&2|UKqTF Y/VOr , κG<={TOGe`m. ,AUmeܞX,H h'ч_{䙁E/c$[v6+@BvdͧNEQt8ʗ5Oz_=/AKvk) ,$DJԿ\MMM $IubYA=Zk[2Q3D5z>O~D )Rgp.XegVƧbL=K"Ɨǽ#XQhP)0 v@ar,1g#}/H(*62rjkke`jb߆%NyyHs MF50BX:NF읾s{1 ?Lv 7lz!8A;l!.+ )(4,쥀(XΝ۽{I]vuuuzxww@DZMzÅYXx$DG.m#’`ɳF^^[Ԕ48{i4=%䧍m|**K۫K! ߆%)\Eh \fA }jk&`@c]4G^83Jds"Ύ3H#Ь0`Cj:^1K_y`0H6Ymlllii\)B쥀(xܱm=c@{=|ST%a~ǎ#s:;;Խ#z;;;WX904w{Y`:~8Ʌ4Y' x^a]plg3CV d૯J vk wr=ҿصd^eO>*X.DqV+_45YAVUG{9}f{Ҹqk8Tǿ{p{lDdn$%?E~zQZ?zctʽD{ݛΞ=;3#y{9p*8Nz_w/D7:%U ~g_/F^OD_iRlׇ1:hjjDYy IDAT{bB~1,>|X="Oh~kPwE=_Ɔx+L CUUU۶mK᳝#,imu_v;TWWoݺԩSvbY&''ϟ?O_/WS$r_ov*":vnu/Gm+vUU)㒹,>|_^hc8YA !4{LbW1K^BX,yV'|2yead$fd& Hlj瓾>@ u{UGάcD73^P}@k#0. ,aIA,vJ2V2 oc]k|x7Bq__AXXX ,re X (*le0 ̏Xh0rx`%Fqx燯~m{ꜗ{> ~GG^@fB$A+rzl8VYʔٶo~o9s̶mۖ}A$)ǖ*!/ !Ի[,{8FTn;( QA9ș(_AOB  ʐtT_q04>d2Ѯ䦥wLml@3bf&K‰a6, 0NIFpSeJȣar۶ko:G:{ݱ.OPAPa03 yOqA%J=(w]< $_$:@zFVpʲ,g6dI By-ԑVY[nyi|>zUWKCK5_`B0̭Ύ-UqXHiDc'dNxWn;˖7 avSD, !|T~}G[&1Dz7ͼ0jXV:2Ț Xgw _|{{뭷~ ty#G/\}eee<ȿ˿aa4fG՗lt EJ'#&&jH=#cEQz{l4Df,/ٟ<Gy饗Vkw~?vXG~Ք>~_ٰquX2 z.3;,ǭô7r.rvik^U]]YdJnkk| D1 }G7~}z#V6,pW;E9VIgBڽ/rGtp[>ѧbBfsCXHCڃHgX$ʁi8+3\Y s'g㩼-'vLkP:>hhհK ~dEP B2;~ ō XV`_{FawQ$$[ZQ 3XhϠbͮ`wL?1XUQ___WWwrHE] 䂕&C[?("n)eRKo"'qS3Y"}S:0&eee*~˿԰pw;lpj/B!ubgU3XR,f9' YE9qқvގMM< dxYiKn|μ100@2i Xyd`!#یf]?XckYY A ]% `,e]hwmR[ıf+cwa?._ k~zWJdaViWٓ&: 9HSdRJO{_'kc^ݤ؂Ad9UDH }^q..Ybѵ_ ' ҏ|/:YR k3+54#5H)#`ԽO@lK{) 5ӦfXFdƒII6Z_VDbn-;gޔ5b50qEN>9n!{FVdklDx&g0!ߛ @W\ֽa2x'f`4?H  . ڴ3 c6ah˽r qŹ֢:ݐ+@伫͑+ kdИ-ƭS ~&{Ҿ ߐkظ08KFfRemҽ?TB)`R@4A A r,NTi.TD8}rŵ25,H5R_Bl{@w!ʚ8>\i1WHS/UX +;kWL&`R_=s[Bě52`ִn~Xd!ɮi{?t[軳_5d G,쥀h,'8qmn_Renr< )~v,ՈV5-9 *d X(ʲբ2}eZ baa¼,k,r2U<}[ ubBAU¾*ao(`XB% fz{^RH8"vA2 !Ck<$6[uL:[;\L7AA*v8,:޵U?(`!+"Іwa~yRd]zEG3O*`qz LOgY5M$f XiKBk5偕OVf $Id|`zGvֶ*ABh -&pW;8N˖&RE(K32Æ w0 Poאּ@y$|ݵ`xV^B? G{? 9le{Oz{tttd"{<6w ]՜o>dJ68A/%w:'ӱ6P{:%m,A3eH&VU+0b/͎@"f Y!* K_|"u`^j XdAq_Ezʑygl.tӁ鄔: nV(%S 63{Zʔi1 ?yZ8@2 cu;ΌTvG#ڒ$ɽE^[$~_%qi|o- 6{ǞJGӴ1e ٩Dꈅ;v,/v," ?A?CCC} C^X èB4a|zJ?z5#9S*x5Z5X$3ִ2 X\A~ү ɕqux]G/xԤd?H Н ;q..g~ _!UR XXl[›A Cm(]xԴ- %|u6a3$8mUZ娈! XȊ`} m+`A tfaKZ-I&''#vɶFfnD(Mr=(d[ 2}!>9%q$ک[B8K AMJI\ *]U؉x5jkmdc&6lqp9K͛]c8RoCiWQzh,|YHL),íw v];@:jg+:= A:Ĉq*rʛ믅R/^w6M$~A"<3F$ #x+>9t@ff`׍]g`;,9Ck]YOɫ" rBz襳WvͼWW}] ZgVR{>95dG~ldcS,L FŐm dL Lh/Nr] ܍ X,U̽kGFٽ:wr+Tf^P(S% X "Ư,եV r,xE9ks#tlzwv7aMܩEz`!VʸF<3J6q7X\fq$,L[>wUL߀Y 2@eՇUZHS7YĞ,. d`er0kGWf4$`"hnn^[X6xeŸҌpnɾ+ ĤMO|^;FLv ,ZY3X PSS=bә˲V5 ā*DQg`Qil\#ccZ0Moʶ \A !(!<#J7Yn~er ,=4)Ң'q3Xyz.X#_pwtDʊo~6y``>"I(ױ;(h  &[׬ IF;vhiK( XZF4 *+xxt `̫S5,hBVL4z!%K3"{G=Qi20G8F7YVZ MA)v,tGCg[3A|C=X+( KGÂz,voP2~"`%{^7kX(g|o#;[pZ㸆UiNA 4qGVTAƪFV85R%չ:' ]qyFFFT$)eDb)bw0ӳ 2 Ϲlo~3_/?С0hqσ̫ npmrdUydhB_2nf`iQENjg0<_8{{^|3 t38x`au4\HN\Xluv, xĐϽ rzOM?k2:0IGnxl766:,a!f`-솁h"(R*!$_ki+sLj$TWWmVQKG ӯ3CVm'ٖƋ}A g`mLш0qi[IM,˪G/ODžq y3.4x1piTxzsocccuuٳgU%`9QB)NE;֗~ڗʑ8X]V(ňe6v~dwJXn>gs=O X%E{k2253Ci}D|ytĂάd{][;(PBV,٬{iԸ®JLlZ\.gY >w.G~';M2 &Μ9o>-`l6E\It:-'7ִ95"LR}qCރ\.zigWdwvKWWp-`Y3(`E) 8+β}o0'xKι4Çg4"`t2ud[*)+BUBAdOg=298Nk }i>w,aJ9kQCm;v9:{ \›T;w[Ԭu.n-7p͹9-hl6sG$QuRk[$Gd$S|%QS Xt"|Km@DU#B?<5䞦RMD9߹<&Fd2:QiǓcL>}hN NARENjg0z`|82y;"L+cV@awyA#X/8JO=0"ȁ)D`sxm +`^Fo~%`dS ЮԷnڤ1~*Nԛ9vWo& p%MdY*wϱہLzef-5V.n"ħμG=SQJfz`)ˌ=#3TZddʅb܈yL :F2T> mTȶng5+ȰW&AW:{T G`s_g[b HR@ Uv9:-  .!Te`:f+W:Ĥ<7cW7Mm3,[ժ=;Ӗ5./}%9qBRٳdy[sRBu+DdkQ;q`ʛߕPmwiO:skt+(% şg-!<+} zgE X lǝvpwQ:^T> &>6S gaw]iͨ,cFAXYhn-lj).*ٻ`+ ,XXEX"6X le#s+,`qx4W*Yim'#ub \_Y7 L!wzdo?t52jq:uퟯ{?vצ31ztdWQ=*9xdki*E`,K/ ,=3zzz6mt. tL/ Np&mO{P~XgǿOr\;kP$P54?gG4Apb AZ4$vp BSk{o rns^{ eH*) _K0}7eyX,6==MUUUp8, >>OSbbvTns_ׇߺqz_>"`je0Q1<}ZB@ gBsdEzo'wEgz`]cVg`N!h DN8Q___]]MBvv:a?iDMe2ʲ,z6>5+'hQlz.׉Qιr*?::BWm7ZI= PBVyyOGIJ,ip82,ݿsxHTckl{Sc;?DZ&U L]<⯙]`"E#uȅy!Ǩ ,k(׮]Ie`eBbt#!6y`q8ݙq^ ,]z(͍(`A8Q`UWe#?Sv~u'obsU~4Y_KK!Kg$+3 KކJQpWACW_!=wzuX(yIn(`!+xgkOe"0?H(4X7yFǺb}3[ ) 쩡wojkI,K"֫5 S3T6+mn0t !t<4,gff2}~swd&>t jF u3! r8Vx3_vd5%;WVVV<A< &Ok,4 WJ"r]A YSAsGG;:uWF|>:b*m0=7ݿ=Nlgsrep8,ruMq66,˭{ Xܺ9fffeZsjѹe`A Lstd} X\J,cSV'*rF:?H+B` IDAT`&v ;bz{f=~}=/J Tl60u|c>Y/!#Ì`AyjȎssssss熎<9ɳe8a*!.C An(`!+待"42S J&$cYV%|d"}[T݇b)ψ_޺, ??55ڵZ;oMILnj?) 7ǝʌ\!MU&k26H69֭w]՚K*@:G9oj@('q3X0/!$mF.{cc |Wj)J)d0qPYg䬕x頑aU"oCmq6>?rzLsSwn0LZ8.F;XS/% lȊ;Md޸0u.͖ 0 C,*1bNv1DrK L&ɒck1 )䕙n+/ktJrlf 6m[N g}T!sAXAR1'l [s`AA&?H`,(!,b(YP>ijkH ,Z*\A0.`C :Y#tb/&v xn<VEކ*KV7wVu>&ݪx0J UR XU*ۯLN%/zX<SQQ166FVdҪ -`YkkQe̱]G觻Y1d[Kv=䷤2rҎYC꼘M)OD}kBEU* AJ%Gw{Pࢲ/\y22GkEkBYeYEݕ}G!9_i5{萵`Bޅz6+++m6 <:O}xg|ԩTJ4B Xjw^_lya 񴵵HXfּNMRf46t*Ws nL.b1!hjAXtA%,dE΄:+P慔ӗخç"ksD:SoQ2e,%Z{ť(o|Ҳ<] ,UZnȶl#r/(!\EwNXye`eOFW .)~){sssY&PXkoּPʒinxh}CsnR htbb2z=ё$I=r}jD՟uXBά3_h4J ݻPx/]D_mnb%>` t Õ%a 0ڣGO{J[su XY)(KdWz͌mTTT-`l2 o~jYXK v@4PW#骼wCly!U YHz(, rЫl3N]ӭ=^D,K@Z]g3zK`Z,@bOlri[W=\XB`7 Dd%?]_؉W X Ð/fYGo\(V{{Ν;%,l |}tt8*I(ɲ,$ImFdl+UExW.>H?J+J,.B__OGԭΖFcF7a H)A.U||?f& |U$圠Uހ6 JKtlskoFg*Kqg/3*ejf.$ЧX^$ǻk;e( 3Ɓ%Ȋ=#T>yfN_}bcӾ (EN{ xb(6vl}4h!\]IE#= "I*1"`q[Kϵ37@^\B2Ql6ѭѨFJ y E'ciu[Wӎ N۷]uKG][;QENjg`&aq%]V8A7Geigfc#'Aꡱȕz{gM&S[[ۅ Wf_Bw5p& |YYV&y9CB kId2׶D<Ϗ˚fzXϑ- )(`!Ȫ,dE^&@ ^;a16]HNK8l㼀#KD~Vfh(e2qg83tBDRe`l6ʪ^$U?]Ce AMWf//lWD7/D*,ݛkݘl]"'q3<"`/TXUFeʇkį}{cʣ'>`8r70+&27 ˒j?kEB;O' L?(Ҳ{<I,UKN!<3R`6ެlӡn@rJ Xꩬ4y|N=:w+KyA Xͮh$Ñ:Ipc652 8P:+xg=g- r>㿓8z:qW*@t18Bvmұ7"/]I #PBA;-cBkK'*2f`)EYW! ~KfbãKuY U0{^0n'x:pf1 ;^T, J&ԊĚnipP\,ϓL,Z֌Fd$q䡓CRr@ ,)5̰Z񹌷n DbRems.$5.EbЮ<,yx X~ #7,3 S"k]!䓁'kffVƤbe3[] -ǯ<4=# %O`BqCRd2)b2RimlvnJՑX X|uZV23axxyRNb"e[6 v;H!^{+GJ&+23x%3=p@<~ PBV~M,m B/fё,8\9pL~lef@4 X>· ?`⎭j5qcch++̩K1J2RBėpXrp>SkR&b.&W 65""'q3hw X&H(W?:JŠϵ6X@{Y,;݂yGO,1vb8\_ɛv|ȼ7Ms U n42,38nB*4,2/xw9H5?+PB XȊ`hhhlmJFXUUUWPEŹXW'ES* (_$g>5`Uőtӽ,8pbQV-6mT!UWeV7+J!9:"S?yiwɱ̖;+VrRu*4K -pW;8yXe˔mAGѨ%Plk˶͝Tvo6NX, %Hq~cCĻO'Ol.M5>XIz=^4+<~/)c)7W+:]Hf%)ɤQ&0聵Ԡ XȊE2Cte2%֧Y, 5ז[j)}?,ZvF0RjAlȊ8pBt +\=X- !O0)FfsK'S;"'q3 玎1E7ĵ`c#ү|8YX,w8._jPB4@ AU41,ک`b0 \ɲ l,{hʣ\Ň}i-~XF,R#B]]ض{bajjj) YF UBh-PRg X&tE1Hq9[T]֐s_;UoqXr&^! AxL1!(QBNYY%6` ߛ΍$ KNb@knqgj1*.`O 乙x,`%֏5Sјk;4 XږX%J`s#Gق[ ,)5+k XX&v af3t G&,^fqM#o+fS{G>-Â4v>Kvd`阸 "%`\I~ߞ\,H=cފ $& ڒXnzxUzy +S%8y|^22UKuoY [mā?ۙz3ȁ)]",!rX)PAcp24@,pҨzv%:7z$HɠN@GtpGV}/0<ܷL`Td~7kkZdӆƅ%x^XA/! :3gaض[/p{` ,J^a:LyܑCCi֪ueWC޴inKåY`I\ .ۻ*Z߯N'Qtj!j499I{gy,5jn!N=o|[Q@_{w;~l-IsBU(B;TnZۄk6Wġg5/-[ݦ{5| 2Z| ,˹NW*tlP23PZv2GJ 크ylmʣl&E TYYa};dgVq/yT7@Q@JPSӈd$Zy8yeYN&Q ׶S<"QwI.865[xKiߛ} iA}m LCAZ$vpî6~Wˤc;a_gnB }D" ~'M$axo<˃1{W_unL&gcg}o /v_ԤTf4M $J|"W-|Q%6bkuCUyUiV&`ldлH+wH$dYK շ2솁h t(ڦ&^iefmy7HN=RDQ4.`)2SQQ1::rx&&&tX;]Bh)!]E P~G'ퟋBOݔR;Mh@ A{ҋ(cjɚa`q*{:p\gU,>+gO؛/(G~~vuP(DeYZ26nsbqiۤoHX6HZ}\ ,C; $fi;Kf"?}e-o,[L^x<^x zh [:@$.~g<$"Dfz`g)TeهƑ/R=灚s fZ+eSѻxH!H|>"`o}vKG.ҾsENjgpi1LuEYdymuNh.4L< rRV4JNGz͵aD$;۶o t>{zt:,AAlFcZY8<{>=F![Ӯ=8? XfZ320wmT?3]-;'1HBVI(!P  e[ e齥m޾R a F؉c'qF/1lĒxΌ`dٮN)Őu/&NCV_)1فN8=/`!Pi6ZwP**[Wr)*brF0ΝS'|hĄP! wm^_p?M)%`![]?nvcK,Yqq}cB3+IwKM{4y89ߘWH#9mA7I"7i3#uuu']`LϜ=Mȑ)82 =CC~/ ۘ'.KK@ ,4Ӽ7xI,`y 8N[~z㖻Wh]ᷯ-zڴЪ-URPBmT`%E@A`J}uyrL&zc>bBԚřiӯ,Ao1SIF';!V"[?k746GM[˔*IK`y54LlUB֑zVgj 24}Lck_b-E ['P RǮeeY/iZLxy a IDATL! q'7F1 ׇcK{鏟y@(ٿN&dN3FKp&+`qG/ 09Ie϶-,ˆ3ԙ|mߍˢZ!X4yKoi:'@iցPp MZt `>lګ>rRϻw5iiΌcK,҄!FׅJbSH7왏^iG9}xzYk+T`Ž!""`iO؆,골g !y> <:q*lo.it6ByvFRҥmЅ?N@ /0{,bd7NMY^T !DQ4^l@DPߡ)Jat:y+ebǎ2g(dm ;{z+0='Al6˽߸*ZF"7o-2_d^u6JbMzDaMP:_xOzI%&V)ܭNV XxկpO޾v*F?vwX*ưpXEiMׁb|#~/;5W} By#ƽ0ąݧ؛~]C*6,Zg]lXGj{*ow>˺3*Z}DzSBy< y$mfR?i ALv Ψ-6H ,=cYvxx|jddDy .4c-cc/R z;wH_> :7:[eGqL_cT4 ]iZ0Y}uqaǘH+RbYrvua!.@S>v1dȗj+ό6wnH*b_KQTX `M< P, !l/kVß~LK xpʹٳgGhv8,\ྷ/vl_^^W`.` .kƲ6}CE1:S6 +BBOBmvWc{ېw9~eO0i|Y*ڇ"rHSbpy`)T`,+ha |Bv=++ ) X˖/*_paöBT҅B9չ2^E%Ni3.N~?⍒7wH>H+Z BTY?a?v{vw@_yy*J *]\}6:y4Zu#hFa%' mz (ca 4]^Sjy| 1fvat7ƅB!&ѩ '&OPV&.k5_Ex`QT`1*O 8&yRjk3VT`(JV`jal6yC[w,^C.0B\::UiZ$Bw"8#p][Fm!TBȲ,䒣YsN`$v`hUe5s4~.i|"j+NB &X |d"8eh qB 8-tA1Clb•;snudL4z4B 8ĝ4Vnna(F !IWCtP1_h|HDžGQ+$58>h4*?{oeݞGn{4`BȬǂ_)F@&OKH$q .< ` d{ɥӭO_?^g< BL3HeX:o1dB8Ejx;B#BEzGkXt7>*.VqA{/ο1üE(rwiہ2}{vgv/*6<3rxYE B={vUv:@gU񗧧?[-Pxi ALv Ma/B(q=vO%SPݙ=e XEY}]/VbU/++kg-ìs SE%u"b0, c.~c@<NQ?#\r gDpNEeQYMGab!ϧhp<edkb}[H}u$0_Xvq1BP(HNH.A'T`M:(J<rOnok'dZw,H._?ͬa}}`(/<',J@ry^ X%}"aYXQR/-"`o#%(E?HF+wi:Tզ*.#{Y,57[}C[ < CE Xn6%1T*$ߝiJ'|B0zƴ6NTff&_׃_b_ٽLSbB(/\=`~y̙bvω\v/ngf&#B ray(=?Oͱ\0{N֗Wg׳*"C+*XIJTx~$XuXi V<|zG!&}鞁w}_ٔ'ikKYCU4ՊZ?0 \ɴ ݯBt6^BO㧔,аࣞyȬY49 gf9I>;RKG|ϨUA\3tsJ,*J BۺB[VN'\ԟ{}P1n², DgGY ;- ,J.j+yc@XS3K+F U{^)U8X48!:t?Lm,˞uյJdlx/^OݑiQVp@&+ksy=|Ic4D%3*l؃o_32(b `y P 8%/q:6Xy_,|Ґ(;?^U[/θ›ɤV2[=#9"jshAX W |d"8jD%W $~>\&)` ^_qo~΋r:?nZ?Ų,&L|>֦ C-QGF5(i/'.C\sk\%@%벵{ p7Ͽ;4C(-Б*< B<m6v$*롵?&B$mmmS= nfʳ;<& Xd)m 3jM`( /ŵPN\AbYɓ:w5%Uit$wI0|I9Y*"Z O?4ANĴA DHSb F5"d7"TdlԂ"UtU =oo{a`.F#rL,9O!|> ޿6_+gߊFwéHi{MLP9_5+ I X瑫s/=؊lT`M uuuS= q , !)cٹ$t\dV޵G>>DyϞ+^(z[U*=$0K. #HlrIJlQQm8&NzaWKV$^'|mߋM}*͹bdlPXVUsD*"M Dp2(0G1T`Qĺ]2dwRe Vgf,k!Hmvt$_13WFrgz4W.⽺pzjfVe)ܐIFF]W|w|uH>lfVFd&)`oeDYgoUc A}EToddd~+kAw}ﮛwט+B}<<̿So+_Y!d/^]1kgx=֤\{NkM7T/-O>QXX@,~QAۅYWgiݧ<ӑCA>yOݍHyxȍAfrX* W0)XᎎrMr#g\lv"zGX@B[V:"6mUl=kf1;g'9._Q1F ^/ڪPeXVt)Bȕ54upA:& {ʒ9x*zb[[rYPDHSb FU`٢{`.!ErX QQkn* >dբV`}^7 L1E:wg:\3 ^_;j\Vy*$%r-ˌ:`$9y!}>n}{;<-ar) }oS\\b]By-nP V-x6+z t\bDm!lgqBm3@VB_)1فNy:QqS%A!JEih̯{l_R]^O+ya ,3AFD E]2&Xy?_'{qkY+!)Ҥ v Ve3>kZ.ia &4⢤$8ը_pÂ{C !aVk2***;s&#'('`!s|-<׋3? Q3ӗdx=iV[ZZM`(τ2DHSb$F;Q+5t$#()ș.Y,eq>`6և$;^NC3 YنW )8(j*x` JkjZqS2)BaN9+###??<ۉd H+MHb>=`b?A@$rRΦ*vRR1u'Kl<ѩg'!P z;|жdFΟDP2FT XGw|/\O3k$EMTXXp-T`%E@$A6"p^ہ%#(.g7/;Y-FR2Kͷ|9_xG!;l!q#KN XbT`͉]]]O0\fФ)]EiBZPmZ̟':& *į"fp$* XW `0^fg‹WMN+cPHuzӴrci v@H֣GCb; P c?b=J%l/!"YDQs#rSfKZo}%S⑫dMB X Kyl9+eZ,RjEa a(+,>y<@ P`2-':\M!ot`P\,&D-f\Xzp8NO-*Y{۾1 MNM25% +pp0^( ]:N')5]X,1˲dMN_R~{kCӯ+b& Ξ0}yPgz{ !%N)rT-X :\mut}6ح=;ZcIKt:2SLOOW(DWE֫ ¢˅ IDATd'EMhiO[C#2ZIXP \XUe=vUu,#^/˲7N՚fI}~E.z_P wOHQltt:}>¬:M΀!!?44~D%(/F@ $ ,~sb :\}VV/ @ ȟ8~gVcۑM~98222{Než.p=(lЉZ+.D$-.A ,,Kgg'Vczzg,GsB|;gϪ Y3 "!֚L&ɻiZE[~i2+k2( EQZkOOBȠJ_Wz_ow57qxlo~Kh8z#@cu/7\L&A\Vp8$m\I䖈z`By^_)1ف&GEh4j4^` B0/N_{֮_KfuZ79lvfP Ble4I* `(p}y !te/v7ZzZ=*eYɭ&Ν+-#!$ ` d{UgÊbt8Eal6 dN#! B]4 Ƣ)[Tg̼)<\lTQywWu!Ǎo^6ZJ70byN%kُo<R*K#y-c%QHLXLT4 &;bVaE@ۼk9܆C=媇4F1i? a;ߦ!4on`?[d@_%P|T`mqˬ59?=/Qf/[7Qiiii~P)t!k1V  se[/iӦ"H,5%IKpRϘ. gljr;X 5K7YɄ?oG V&}һ/.M---L[ XeHf4MGͼ |)-k{Fl6}cB8<V].cE4t$.qcolkׯ۶~_TZ,^CX& /`9/<^aZX!o=''g׮]S=b+@Gp^i(1%,\OD!d6ɓ&}$Zd6|I.ljZA\UbY[D|9Ko@3i鋪MB~0j͗P+Y 7m}#O_F͆>L X ` i ALv IGiaՌl[1Bjfee Nj4]Z?r9-J]ߪ}t1:ZGTtD1]yՊŋ|>0cs2/_V.T((c0 SRR2m49DAR}VQ%_)1ف&#]YLv1o!l6bPnn`\tM}e9^]x2\,{<7œ|{-?m`w"d#ݟ⇗pksLE˲7i7 " =ᨫ) L AmmTO|VFP%Xa6:N!7~F[6C~_Bg^1ONbk!kc삭ųELf2ͭu:Ec Mu7hs-P~i ALv u ,!?ff vnAv{eZ!$ˣB4"[!o*:ײz$0tqP^wk?>dVdnܯu M6ܼAZo 7IKKz*`)O>]!`%(ܒ B\s :iii8Cr݁@@RREfry4 ~ Gx Ý U]ϿwkT:;%X(L,Nq'(N,fqP!2FM_8SU%0A uQ]=Nx-N;JMc|>cGqםn4_>BHOO'|ٌ!je4 p;a8s?I!.y\Tiϸ#WT\Sh,ɕxX;V"EvPRi,///+++++i:33(,*V&/TغW,k]}&fy]S'>I_vlt7aM$I @㉅V;Dp?DJI!)SOIJ1h&$⺉:(Mjp76y9e W566ǕŻvª͒%Kt:ٳgF.]P%<(Q=k֬~aʕ 744g$Xܑ< w)S\\뛛}x$`YYYyy9yo_tؑ onv+8 oJk󐄇=i ALv MطyT"̃k=t9 +jjj"Tٳg9r\o>BCCBtuVL3\tFSU[9!RdU?Eu +UUUEEE|ǏVKb$zw5M 6XjZw~7tm͏ԁnmO.8LD# 9P@+1c+^`0+el!DRQ , :Nܗx02~qzɷ/gYVP7٫l9}?zJ^!Nt[KoT` Pii ALv w.Hk[C#K`w,jG#NNh\y4w~O%($9jZs-9mkQjkjQ57<~mܻa]3H_2ײsVWKK֌]q,a4MG 4޺9.$ WEccl򔔔LqAFp^Æ^Yvff#(RbNXbIW1 l6>SՂm}bNX|GFJWB!rZ²րg;.L_?'j,4 D J4X,A["M D0ٙ^1;?w qKד)J5/qݖҤuG1htYz{{دn={+4-0(2ja a0N tHv+X~-Ա#qXbKF*`,+0`Yl.rZ'Uךߚ\ysCxٹrY;RRDoLܓ"M D0ٙ.(3gi n#rx o6Z1JB輽)` X1V`I)aq [P` ! ]/d$)N XbR1TxG-1` l{NM siD#$%,N'мp{X٧KRbF9d Bd5H}}}mmTHP@AM~9?DG' ӗWeN Nspp? :IP(r8Q<ѷ .6韤=Zo([KY,? A^ogV76_z}XJӪ~έ!0ن3}NtaTw ,A ["M D0ٙd&`< -U`"N'> XxwpGK,WXE}brZ4hA@7 @]Ug폆34R q\Ӯ,B,0!ϲU ,#rՕlngzndƺbnţS3%QG"fa[ހ/Zxbv/`H3zѷ%;kl[Y=,4Ps 6(CS/6wD_ݩUYH3 uv}:V PVX[cT/&;6"W .kgk8u\ B5=`floČm f~[X?BIX@B08}Qm}=NG.GY,eN=H=Ab]s2b*F/m QlVcDES}{9y_o#B9Kopt B"M D0I~j1]ϻgPZS25QWh&mʝ2`s`EU3W_gEX@GGq%%%dL )fiF𙆾Qq-h8SDqjp*LrJ%G8>,]Zց1c9{23sTÙ!zY!B S(*hJ}ZVk~<,`mW(iAQT ,}y *k~T`uawxcc^U`U,DA$~@Htj 늋+k&p2r\1Bd<4"u͎d;"/~XWSADP⬚q!b5=_ qnwujٗsݽ`n>r{Ѵ AhRLv )1 &;d'"hԪMھa/B u ˬ*(o qk^iX*ZPfy;_BH L bP -_<{[UQ*/`n&FcZ X'lsӵ=>=1?qd p`dLDXGՈ_~ϥnG!Ww_27bw  P,XγUձz,z^V5Z6kWg;16';d"@SbLv. Wܒ+rҵ?qvYlb1~9 " Q??:=fZE- & SɓhRA @-t,%@r&O'/v{mP"@Sb ALv D0 @ MqLv )1 &;d"@/ ǎ׾VPPh n喣GFXn㰉_tj%!6B>~ 6nٲ۴iM7ݤpar?pVTx`)_ӧO/]?={6yaժU{쩬aP"H)MTK/ !4{xॗ^Rv|\{Fw+h4Z{rQ y晲2V[]]+/LGy~UU`Xv{&vJ˲gò{ I*_*-3U[|T;d"@SbLv )q>}-[f͚%~nhjjBQuw]v/+VG?ڸq#Bh{yg0zw8ps=w77,++{'oƁ{G _p޽_N òf? a<˲X/tfYӍl6ZBX0z&,˅(_|G_zkmm?zgx Os L&Sgg'6ٳ .0eeec\rOر,|k_o||dɒf<3f0 Eeff;wNyJ3g٩0&&vJ@\@tJJJ"1gΜ).. n200O<Ĕ- g޽_8vAﯬ;}]qPԹM씀PM!kkkz؁&;@`L իz-Izk͚5Zj&wuwwKiٚ͛7۷uo=y}}ٿoN cXb,f2<3I, !()))"@Sb ALv D0 N6?e6l hD+޽;^7x_=ޙnRZvΜ9s̹JKKx6)!fMyHX'2 ` AFFTOd"@SbLv )q޴iիnذ!77o˖-<̦MbɓO>rn!o666;u=/Mӟbq@_r=se +WaJ%<[n?ܽ{… F vڵu[n%;TWWoݺu˖-eee555G}饗Zm\xBf͚>}'b)wzy睹sL+VAqux6)q1Y /$ףIe>#Gz"$ɓh Hz &;@`L u] lٲ[#<2Փ s KP[o/ٳg?vTO*L"-)<&B|I H`zLv )1 &;d"@ Iw`ʁ-$ E|͒OtMEb@߿Up}*8 ` n)"@Sb ALv D0 ^`ޟ炓/}7S ܣ+Yc"@Sb ALv D0 ^H(9ylO,`'Nt:>l}}=B'X~}ssƍ9Bӣ kBE]iӦիWw(*wnvvvcc`HMMoO<;{ly~)))O?uvv6mZ||Ckf{GeTڑ0oWmJ?Hҝy<==,Y"5Z6!!AO/,,0aš5kM&W_}e42sL尟|ɺu DQ;woZTTo&&&JO*//5jAغu#G6oRk֬YG4iҕ+W CXXӧ'MT]]m0f̘a4A8{ȑ#W^=a„W_}uÆ /4G\\ܴiӪ.]c%%%u-ώm)oYw-,K(`Б;񲲲Ν;sssӧL%_vگz۶mEEEӦM;{l.]7o<8##cVlll||<ݻ A󋉉{W\R+==]O PPP0nܸD%??ł O={'uܹsݺu_~W^>|s:ۖPj eAܔ'?~<$$Dz1A啙)weff{e֬Yʗ>lyyt|f""",Lxԩ򱯯o]]ϯB:.(( O8!744{{{w]޽{_p5E[a;t //oȑGZG:@:@ZGZG:@I͍))):thzzѣ555]v/y󦣣cCC x衇~7Afʒ{_.=JR__߽{v`555hEk׮nR^ngg(… ʒ ԣGnݺf-XY Xt$Nd2 2$$$dϞ='Ol7`‹/5ˀ'ŭX";;R9IY2]\\9)wUTTxyyTjno߾'Otuu5G25}B:(Ə>ߵk.e_|w,]499̙3)))˖-SnjleKVV=В1cܹ]=_7n/P|j؜;q`ĉk׮ a߾} ,سgψ#3|||{Y^^ީSf#XT^^'}0''?oӧO'%%M80%%Ez{dd(ݦM=, ;sN&$u$u$u$B=܆ 6n(WAW7hР۷{xx8q"55U- 2d׿<==훐xbk͚5 .--eVCeUMMg둠֑֑֑"Aطo_tttII'bth j !!j j !>&O|ڪ۷Ϟ={ѢE?=]bm۶:uw'jJ?lBl= j !!j j !:K9v`E =EqwzWDQlmc&`y-(`A֑֑֑֑ϟ?߬/^t{G ,Z"U~紴4e;lذ3grOJ4z(P%(VWW999I׮]6lXii|Ok׮SN ;a„;?|'\zuPP4(oNJJZ~}eeh?|ɉ'uңG;ыXWWpœ;;ٳg /nll4 ,`yӬ%ߔMYUkl/x;׺kۯDcO@^Lnݺ%KH-_}ծ]Κ5k͚5&髯2 { 4hg}6sL嘛6mٳرcQQQwuu-**z7+=|ܸq˗/Aغu[oeaѣWZu|ja4]eam>S雲<Ӛ(>Vڏ.Kjjjm= Xuuu["5WTTt8p`^^|O=eʔਨ(µk~۶m+**6mٳgt"uݼysǏWnGGؽ{w|||aa ~~~111rʕ+ccc[ځ.} ƍ(ϟ?X~( Pf:TKV8V$}J4<?z h:BB::Bw˖- dee)O8~xHH%44رc >+33Sݻ㛽ˬY/}rvBEDDXԩSc__ߺ:e_EEU&sJm!QFG}f@]-_|񅿿rҥgΜIIIYlٽi-YYY4M 4ȑ#ʖ 6j22 XP<[OmBZG:@:@ZGZG:@oLswEGG7o_͛7/_\Swƌqqq/_|rFFƙ3*zryK-Zd4>|ƍsRzxz%;vHLLABCC'_Zn[oe>/$:::??[n+W0`􌭻BK+'`4-k׮]z]\\̙[7?o߾蒒[OMh!'O>|pmmmUUgϞh"[O @ p)[OmBZG:@:@ZGZG:@g0bbbWZ8sL[O ڠftIDATBqtt,`=:BB::Blg`YB xPj yyyڄuuu%(N>](m#؊vgg`'(zzzYn]AAv3w\gg7xյ7LLLU^^>jԨ˗ u#Gl޼֬YF=iҤ+W ӧON4`0̘1h4J{xxM6jҥ=XRR W\:t]*Bqq/|GyDcթow=nn[qk5%,k 뮥e ,$=rYYYpppEEEΝ幹wSL /\v_m۶iӦ={K.R͛71~xe&666>>^a񅅅 DFFȽ+Wm.Wy ƍ(ϟ?ګW>ܹs]vsӟp^{M'sow3Qj x{{nٲE777 Ǐ Q;vLÇ{yyeff]{?~|w5k>[^^.8pٗ!FDDXԩSc__ߺ:e_EEtݽ{wQ{}̐__ߴTze} a;ȹ111%%%CMOO=zk׮7otttlhha=o&ճ„?n>jlll,ң$ݻwoiVSS([k.\XVV4hР=z444tM9Kjjj<8p@kMMM:ub V,qtt,`=:BB::B&iȐ!!!!{9yd^ww^xqԨQϟ^L81..nŊ٧O2*;F#Gxzz]^^^-[h߿ѣG eC Ql4njSUUuԩիWpOo׫W^~ Ν{ǭAGs?6!A#A D D#A#A fDQ4}evR|˥K&''9s&%%eٲe-ElʺZR__صqFeϝ;7eʔ9s攔߿o7hР#G([6l1a=TZ&XG{ &Nv`A۷`={1B:ǧgϞ:uj6X偁qqqsrr >E?۴iѣGsrrWݻK҉';vW^gne˖-6l6lXee뫫׭[;bo{ 6mܸQ^ `gg]UU#WZoРA۷o9qDjj[V[f C \[[[UU}ٳg/Z֓Va;Pm۶:uw',܊+l= j !!j j !MXXX~~~mmm]]ѣGZ"AXKB::BB::B:m:~xTT(w=Y43juD`0/??]yHff36!j j !!j j !j ꀶ?BXM,Ν;FFFz:)Sjۅ:tŋ+..TCjNuj&33sΝ4%}.`(lEҥK^^^ׯ_~.>!SCܕy[6sw`YA y9O>?cVVVjj޽{m;CPGٱ;ݻw5jTYYY^^LԡB+? 8 XP5 XP5 XP5 XP5 XP5=~ᇰ={3,,ŋN4%S:~xTTS$##P"R:4}}:::>3;vhvP"P ̙٥KG}_ܶm5A֠/QU PS[B|cǎp… nܸayL$: ~wY@BV=_ݱcGee5kVX~ze C h4>ӹׯ_,Yrʸ8e~d2͜93>>^2Ԑ;&(w ϺIRRR"##-鶚Z=2U9,GF*tȪT/MMM'Nxyy/Y`9DP:99I,C-R&hb jJrr`0151AJ$V5_3f޽{-{;vV7LU<;ˑ kUK.K5 2Ԡ .G:fj2AkP;kkkMLe-%hR X_-...ZIGy%""̙3rV##PjŪԐ%Phbjʵk׾gy>ZXb57n;rR[ P,$hbj11D:w|-e˭[LPhhC/^گ_bLUμa92U;Xrʕ:tHnajy&F(|me-%hb jo/TV2 XauLm T!##㥗^T(`@kȪT_~%00F1Ds,C5t͛}ѿoR P[4T;v5JYv-42Ԅ5-zV\rw޶3uԼSNweͱ 511D r eɓ'x [1)sX@5UB?甔f],C9 >1P c йs<<g8p)Scoo߿PVV3nkk93|ׯ_~cƌiooW bx /_~E}WI&?_q#G6|+!ķm9Ip̙W]ujƌʛE}N8bŊaÆ8餓V\v3@Pd׮]G}y޽{www˟ӧvzq)pE`Ҵ|Zm۶'|3rS===Z] b ܃81 !A cPę3gnݺ .8Cn؃p R[)7o> ڽ{ʮ]\j|l͚5^7B+֖-[~=cƌѽu/[L~ewL&_P/`m߾Ͽ9\p)SWL2n8 @uOlu]'{msς Z @t̙hѢ#8#Xx|0` @*)W 8#x  UQ^^up81 q ʃHU@-!AqałN@6lg̘=,PR `2 `@ڇ7׿W_]PPiӦ\*x1 !A b8@C Bt {Q[*g5? .\hQMOs@8裿⋩Sz5 vK/M4+SC⋻we,ph X/o/9sϥb1G?:S^y\H D |Sx≓O>y'|bҥ/?paMӬo]vٜ9sn&ߚ;wܹsU>;>>Ԍ=% q b@GsC\ 3g]`N[ z#x=ؔrʟ'_M8/6+8q׭ :tƍSL+n j`Eˁ% O#hv!z%رcd#~?Ɉ@(A ,p XB̘1sqWSNqbÆ ^7(q c@C<<1 h X_/!D,{ꩧ~466һcƌ:uwyyW9ܴ94x^7(q c@C<<1 h X7x_^\\L=.o;~ |~{߾}c֎?>-z @Z[Q5\pE~}ĈFEaaaKK?O :'Dˁ']nM7T__?q6*$x1 !A b8@C "C ~曽n )g~~^r%^j`lXdIeeuC@H!)I$/!@ @c8@Cp8A $]Y0 "=@:tM @ 1("R=!XN8t+ @9& q b@Q4^ErL:#,SD{ `x5XX X Gx1 !A o..cPDX^ΈBSD{\,Yr7pXǹm~c^7(q c@C@5B(6"X1"Wt VAqE+[}@7 R̛7[n!u۽nHݘ D X tm^7 FWXf+vY[[;x`\kywf̘1n8쀿D֭؀+$X G 9 q#AtHhꆄ>= } 9V VgDwSD{9޽{2/_z'm9q #Ms :$4HY9q#rL`qUUUٳgѢE#F8묳>쳔2~b'N5ںfwsss]][-` B@@Sݻwz/'[MQ=Hw/l!-R؂[1v ^` ĉM1Wsc'g̘{eQ^<̏>w93jjj\~^1y믿~ȑ .-۷B~^7Ҫ6KPpuE+ BФ9$AtHhj`>I } "+C3%XA{ ֪a8P1"L(Јbh"eOW3) "= XӦM;ӽnpO<& qȭ2 :$4beH8FAL VA3n=ziӦW^yeҤI~ dM2@Hh<$`CD$~K.>+D?a„_~N߿gzꚚÇ $"ф @6е1{2s[ou^7W, zsΙ>}Ν;MLrG7P? q`tw2 'A M } 9R9&X1"Wt`Gyd k`0zh8P1jP!uH8FAG)rL:#A${ Dt@" '{JH d `UJM `'Dģ X Gy12QUeX>= } B`uF"1"H X G :& qZP!ц> } 9!'3MlDF `QXXup8FV eX>=cPD8"X,S " ƕRXD DX p`0 @< @NğX,#jjjnPBǨMCDF }#+C(6[ip %xcDF `1zh8P14Cr+Vwfʞ(^8FAd+'VgQL4'2r#,a "_7`FB#5H!NQ I+2s`ZwMk `4݂{ `t`|LJ~_r;QrDAvuuwu)W= ,B(6lΐ"} ,X/Y~}mm͛" =kA@4A !pB .AtOԞhF X&p3H!TzDā8FA+!ۥQtP<,v)QU !QYYS `Q@mQ+} ͬ,7p{zzhPRK8rСCnP9i-ghclˆLPrD>>q` оn`8FAd*:{Pg " ٳKKK'O̯X+"`-Yo<b 6\|8p_qF7FaaM @='-S?<-xDL0QKn^8FA+Q ~UUU .W 7XW^y?c[sׯ_~Ç3ݍf@P"` Uf0_U$`JMP ķ)dSCw6L쮢'LZ&ߍXꭧ~zԨQ&LN0aժU<7FK d0_ P^+LWdBh"Ho,XBj| %$G\9sUW]%rUW͘1#& ā8UM}} LW= ,B(6"@QU 뮻dҥ*a ,C]<g,p`WX6Xbذa+'tʕ+s {FuGQ"`*)k`aBSrDRzDW>Q@m3߇3UWWW[[k.,Bj1(AX Ƣ"}Pºu&OzL>]1x`;N1l0[?υ|ߠqmѢE4MӮz:?͘9s&5㨣  `͚5;{1:;8|~^x;49s]tEBC=T3 8ccǎW.-[n*0`bwកk֠At~]v#Kcp'AeC5"@QU ,c ,<*BD"A_D>)r-`˖-_Y|9) ()U_{ *߲RD*)W!t8-ĉoz} r| L!qj+UBHzBZ%+ˉgQYYuC%\0e)S7.ӧWTT,^X*@S)n)I n߾]o޼yVrQiJ%Ё`hÐ:|O'c !^PPD$-YkO{g^{mT܍f|(yX>+*Aw`P)t^xlܹ4+}|"`:@U/PYbe{d8FA9sTVV~W Pgo߾" %()ĴRM.ECSUbiSXXuRqΝ5˽"b*q`)JXYEX;vȸjO0"}+8FAɓ'}' PgT"`)t`UWWϞ=sQ5 "1Mӌҁ弼DSn Tޮpԁӓ?hР;we@Xf58PdZq3om۶m۶mv؁S o{%nK93G*X_c͛WQQѫW/,ݯ),lVs`@ÞH$[p`9s`5Qɯ87% KGdXU'M4lذi}K5\S\\qܫFq)P63оiݻwoذ!~b)q ?CooE ʩusBn:ug:S} D DXʡՄS3/c\йSnXN5M357]0]Mh}dSĽ @C!`sN %Ã_1} N)wM=1X۴2:{iIq߳gf9,y},|.WdD)q`x>75XدBˇVf)t5M   %sTĝ.9(.R14u+X)CsVQQHd4dt,o.&_OG0Eʞp1" uF90+"FX爵A4}+\x/W>%:)='\YY.)%V^v"%@PR:>dBttt()Su]K.K5Zk` XFM;7k{/ 9E3-F6H8l^cDpPW! PgTR]*rX5xYd[oU[[klQʦ1pڵ˖-ۺukڻlV!իW>},V2Q9{|BxZo߾r\r`оN2d0s`AoF}}}UUUKK )ʲУ9կ_D"H$ȍ{ :С "%,:rSTڱcK(Ru`lI!d˫RZZzR TwWXn߾}B~qҤI%%%/I:TVV8nVck`nr aj`r`,jF~~&V+)Yd )Jp rw:lXZxqiiߟ寛b:,y6bZKrxzzz(R޾qj XwqGYY_|B3]^7(> ^~%%%+Vp9k4+n޼YJNPR;voڴ) ,EM 6/|5kdD,v a޽=&VfCG0Eʞp1" ! 0XJR=w`_j޼yY Q:q`qw8;jmmIyX|(2%h_qPrĆ nP}e^WWW[[GX:tP tۜY ! 7!,BڎnDQ?5qTgS!"hjj,))wr"_j XԘl,d2)}H&0-ZhDep8er.B,Ӎ9/˓?JJJ.WdQ2u`;B(u`A G @qljjB 2D)`,\TV s X X}(mMȌXVOym$iČqt.`uYEEE j4a A$hmmu#O/...>s>@UU+,,[p[܁E,QTХF{1j_򗒒^{8Bmg!H.JXK,ɦ=2,Uc_|Q[[ۿWL,nK.N)q78M1o@9D5//LIVR5QF?<[6 ^r`+\rih"m۶ <};wlllԕ{VVQQQ^^^GG7縈;`CC\T,!~s?OPLC2SNtĸi !bV)Y$(= kSq n8ZZZ̮o\\r`ַ%f~s`eS VzhIjiii4Zvb!PwX(..~j6bZSLj~ti a,UE56s(9.bH*((0`i,;Ҫ0wpŊ677g93Қ*?m޼9vLXY$(@jI&ԉ" b;|^K>!#ctXN*:)vH X<jlltW:tQU"j`[oMwSi X]6OOB '5LX6)\$)TUUU]]ͳDc ״,Syʥ7!һw!C\~W P ctl,Ҫe#`7C3t,q`Rq4ԁM !7Gz]ӴF"}x{J+Da ysw]IIܹs`VAh;N;|u$'Rۄ4xG0E'qjkkHN-K=XM6k8L6-X­[:i=%;ti3.ե3E%f@7n\UU՞={-Z4bĈ:>K-cX,6qDsi俛e)-` J@;K4M (555d믿~駺EN7m1;(..8q^RbW_}%oMjjjxp]v-oaȑvSXj͚5rd9y4YLon6l<~aA`%`X9izl -[fztnVq VmhhB<w؆ Jw477Ӕ5J9NFj :Y9{j e/_ܽHk ^dýǎK,۠\ ZHfف:vx 6:/2E(*mEoYfڵ|>`:5WH2UWW'/fJ]{+W_5͢@|6{aY,'[*i<[t)lĉM<wgN==⪫zGo[o׭[WoYZSO9rb…V w+7n׿UqW4sϥ"y'7pIoC/!~3wy'ěo/BzI'$~ 'O=|u֙~SN_~S4=#w'|bԩ566Ni73rz^ַE9rB檪*!_lӀ_~Y ljllt;.>oKB.n܈?Py;k5."YaQ6q2g-$[rw%c !j`}! yOP;mxJRu5q9LCe =5lӦMeeegzTrXmG;,Bj`٬}c oA[a "mo߾$Pe0Xv|kVy "1j)]M!lmm+S^zt*)w}wii);^t[pYy'QӴ*,BHdpq0BovfkV=K.2H!TJcw'p^ĝఈʕ+vV>.Dh>ğuѣG{8j`^m,rU,ns6qCzP'`mm۶rݨ۷7KpDx=3uuuիW^6^xXݩYyjY XU,{ƌk544{FUI }{}ݹsX|,O+Ƀz6V~{zzaсD2%)F:6o!,h8\j( 7i9fΜ9v؇~شVߘ(2l3[n 50,`qc+9tJ :ԬYExܹzW\LnXt!J&W_}<{,؁w͚5lڴiZ脞Z]! +v?+tEC@u`ѯ_-u)r< Eލ4oIBW_ /4l) .,++˓e8@@g„ / 'п38c555 J+}D8Z\7)=c"naJJ XFQʲ;\we˖-<<-l\+X XFKM ô2:VSi X˖-WYwݪVݷe/`ɛ6F'o/`с\}=g2ƑroJjhhXdŋ]kfNY !a*1j;c,&K!t8C}p…s1~]477|{3}вʁE dgBŸjBVXA,]d2IkAЬN0;c9R܌)FFYn]OOQGu'M=%`ZR^G[o{9;>jo?\@sΙ>}Ν;MLrG ]#:đXEFu͚5}9o C!qw4iRQQQyy9Mz20r`,]H IDATi!ʁ5|;G*t`ȪBn%;2u`ePNP,c a,nfl08i5sR^+p"`3=2ܾ=UϹE}mƍ(KzX\ӟD"A Kˁqʃl{{{WW2~ $X|p,顣Jۧ[+ CVFxO+k'IUQQQRRSOK/я~'lDF>ǎkX. %z./u< ,]4Lx}nu sdBh)Eاʁ+amPF?r`ɫD"L&mV!T2I(z%u;X]RwRy ,WXAMQJB7;P|=>ž]k[[_U X|8t`Q4M,XmmmO?tAAu]ǟ jnj]wݍ7(h}!AG4U)t ֯_dJ4йFyC-HTTT$CLX:t`?ݻw744ȷ+W֮[fNsҎ;Tڤr#~.+|!,.P^̘I^[[+8SEvā OlR8LS:oEֲt`5M$a ,l̨)q"e2,y{1),jX,Fj'x4M,}=+Xi9싸ۯBht`)/eY$X8LJrC0[$5~³v[vQ^^i'I%kF,>y',dIW,qO↙zhľ3IP|puu>qv%;P;%?6:tzr"` 4HajN'/}2~JlX| +`9|PR]],@UqM16q q7,Y25X)x?RԠ+,,<蠃nM:8]#MMMeeeeeeVBk4hLVJuzqdBd۷ 5lѪ3 6obki%lԓ={zi%XCCCEE? X$` j`Qc3X4W$oXθ!`eKNav̍XGz?Yfy6Bǁ,`ÉK78,ZxGPrm\>ѷZ0-?;vu+ pLȀMفeBqebc@6*at`iFV{{v5LXT[Q;2.Y X,m$C{VZ)|$r`Ȑ!0v ,o =VYf޽{ĈBJBh쌙:t`UĝW5l 1 X;wdeCXnVWJlX[n~ь‰EgHջAu1uYB,>5r` X0PrhL&)w,Yd4: d4FY9B~*;NիW|I+BPߺu}م/]X GЂ Xű-״+}X:t`6+%]777i뙥Җi!O;W!̠Ш$PG%\@;}q(`Z9oi HqC |H)`X,+,/uESiX] aX4ˁ_OG0Ec3%2M!\~=I uzB.,cwpPTiQ>X,R;i ve_(XReI aGGwqM7^w.`F!HDe2N2HEOYĝ^Ӥ=ckҥw1nR#0{ږիW;܅,Pۯ}ի7UWWL&O8و} a"b٩s`:)XUUU_~BᆀeL!hllf>V2*PXr %[bJ a)7S,S"2L0⵱mUSL8LRƳKޔͺr*eRO XÆ b ,@X&ʑq #<;O}YW;UkԩX'? ]vƍ'Md>C0`@<W(``5Ŝ=eR] X<흽x't + 'aXfO!4-ZoDnUVY n´gDEE!WsXp,EHDU[X 3ꩧ*//):{ػZp `M!eޢ{w>*P V!d!ajwrJpB*(`N`W,BZE' alțsC9$ިӡyBKzJ(x^JrBH=,LFꪯ_f]]]tTiD/ Xk׮~-A'`-^.xS2X6,a{ӞrB"}vQQQK΁yꘟmS|} A-KX۶m3V΁e i "Nv+VElR'tA-[Os6oLlܸuuU 䈚`Gف%.*GWFBa_ˉ5́E#nm HaB XTe@rK/b=qhH'rk F mʟ(%{Z!ZE'-[Fz$nM,:8˓u)6֎;Ν+lϦQW>PVMwFXVROw5]&e+'[p UgRG3(4ӳXK.-.. Mߥk-ç=ts,ȄhܹӦ=jjjz-'r!_鏍7(~%exhoo7>iohhh_⩀@~~>M\ž(6mؘ2%t%}ݛ[]'6i ~K/T3uJt#>s,q^ ~BSu@.qwXPUl׿߲I!̠ X .?~ĉm(`ѠC7p`1zh`Gƪ]i)XЁ5R7`Cd2 X<,$O/t7SdlcT1h.8IiZw V ^;)Vu5NQ+`-[ƁeNXYVftE]:{MT69{g`tl.{dNwiUUUUUU65R:xZ >FVl: 2xT4>?^HIIoQhxfpq7X\Tm۶mMXqϋs~'x,ᚢs`k::q`۷Ϙ1cԩ),Qjê.0HT_~mt`X,FY?Dѥf&`|嗱Xlp/***z)L!ԭBEi7ucFkٲeBs9G@ S]FTv^# 6СT XK8Tʾ΁e#`ѯNwNpQB(LX}Xt$֊},Xro9ӁKHSEy$τl,\ݨ14VEu,mۤիUv`e&`٤}s L?@t3;ůC+.Cƫk9]J!dL3y+jjj***ϟq y"4W,_B3Qv`!`l^Ө-?{w8qI"VЅZD #if,FnܬZlRqXXLBht`u //OrBh_tͬ8e_yS:I]ɴzUفElhhH0X{riAD҂!˚ B"{r*CyFKU lXtH6By Xt3..O24ׄ܁eSKn2/A(z"W,SxR X׸d2ښGXcc#k#`Y4MC05niӦyoN !p>K,Iwi#F[EnX.W,կ_tXn[oԁ%,2IiA[Xn]O*ml^嵴CB(5̯4qؼys}}A1DФ&03/0H$L5 sMaV5tϫhj~&9F X|xnBL&8DJ!44:{,L,ˉ+]ÚH$:$`}o:::2, u @,))Y|#]S XB.] X&L(**zSOGVS)܁E#nU ,fYJ~~K~+&0qtiF?>u֭Yy{DbQ3o޼|g+++͛W]]mp-g؁EdBf#ھ}{cccuZ+KWo+4M+//{LS3Yz:X2vuuuvv:сH$ϯ|6؊5)5mFOe˖uvvs1p@Eu)mP~)q`J'`qiN).?fr2CV^ȁ%ldRk+V2ԝNRecTCCCyy_BnI"l]=^v6lػFCC͡Py%Pȁr/b%`Zdaa "UC#GʛbhT[k`̄i]]]X*P͍et`qkBO,~D5-N5u`ѯ XB]Sk{#K"Uf-#)۶mʶ+VP>8Ƈ)Tk[lٶm?5Zq'/ŢqGg]aa΁eBDrXitlݺ[n;v3T4ʄY n/lj` !G~~~߾}eF԰r`L#*k .UNXEեXjEmvRK{;I!䓄cv9^d"o.fuB]ފڌ,:/ I[nRMX|@pyyyXM˸Y <5U, c@rN|&L(--;w.Ο?Mk֭iM l,J6o޼҇z!vQ_____AuDBfO 8\RD +CXNRSqgA Xш ,y#HB(ﲍs`%`;t5t3 iiig:_~%ۗrƁ{L8S{?_̞͛7WUU9jMFȨ:RI 0ۉDƤȃi׮X< ;^ 6ZjF́e/`1x/kϞ=q8qرc̙#XJhLBRҁit=q8J65nxxG:::>쳔VmmmyyIľ`Hb,~D8O!4P[[#,Yu/Xޓ[hr/0U2Bx饗>ߦWdKdVB_͠H$ X&JpHS54MU5ZbCyBHW] no3fnV\)鉴R;;;GRCkŊ>o)c4իW~ɤ|Y9$\f,w,BX2={F8rAkk+3_}qq񫯾|t?)V9sf~/TЁ%2t&LlXtۧwȐ!B\W]uɓi>a,Nсvҧz틸4zbŊ.>J*ӹn6ЁERXr6M U__O%>}P8y*oBv!Ɓe|F?dP!niiwFmhϞ=6+*/.))a)3f?>b,.^b XcƏ?nܸ%Kkƍg~GB˪:Wcƌݻwf,fPK!ܳgE]T\\K/gϮ&El£>Zt` i'=WZ!Ă ˚C`),&'9D@GMd:k i X;v} !eeeeo-Bف;,]Wa&`E#UeUJqe]OjnʝY a^^^OOjץRCd[[[,+;n٭2}42ĸ>o&ݑGIoeRwȬWb{W4 X===---Ӕ)&?eΤI ʛ~fҥpQ az@C]77K+-[?PeSkȑXwmjjJu{td%`u]E,Sr,'E&X6} ,Sqq9X 6?fD =ا~ZVV ,?Ʌ~￟"c &Ew&C!$BS.Μ?H$W>剩08`Cg8lj`r|K,:\Y9c}/,//'ug|.Ү={455x㍿ׇ~X]]|u`9>ztn(;(B~ydBUF>,aehΝ.XhԨQ XxX,_NhyKMMͳSR'NI 4CDr EP7WkEED:E:DH!I)?'Ysd~<>ߵ_dggx\$ڵs`YԩSsoV5jqq룣x^XEEEiiioR !X \)|JY׻$q'\Xיӓ3$?B6oZ{M4I5Db`u4FR ^61Tu]KEk9?%EK &``VXP:t OpxyyBWN ,e 1<LNID^zurr2}}}0OBCC壏> ={X4vJ8էO|BN-U^^.1x!_s& OWK.X@\fh9PC.]:}m۶&R+}`!cT;k3}_5k| X,-Zp!,ʋ/3Ei`]tiӦMKmVɩquLÁ.))A"z~-0?t萪g0XRwBg ,CBt sodz~ &ّ#GVAAmvAg8RN֌9r zrrJPP!5Id`cN{ ķ\ vȑV ڱcĉcccCBB\*QÇN_`Qr7rȠJ'̞=YZjjjX\' J ,Z7n"t٭ĻJl *~RmJu8{'Mȣ%/9'y ž\%Z_"T0ܤ+e˖![pr E+@wyp1VVV7|r:F?0UUUCQQ*F+I8|$+VPX~[U`&Ap8^Uť*+ ,h1E QrڊwSI+ŕB.A!e,bu:ݖ-[] 6BCC|mm-rQ*S_CPPPǎGϦ_^`HٕXBcbbFcAA{[e`ĝ:~ (Cee%Xh7d222o+p8չX GM `U@WUU}%+?n!l-(󫯾5kٳ?(Z<撒 q.R!iiiGiwT{,/_&.]b "!`JSe`a>+**( X|3ʑI 7RLd`|ԩ;wn%oood\tޫ?z*&Ξ= xu pҊf`L&777&%mt:`-XBR^jP E*--^ӟr`mڴiҤI<*\)X={LLL<iD[X\J,Aoihhh5%JoS!퍍v^!{[?#*UX)))qqqwqEPh"rr=PRj (aB᫯)++Nꫯ&''ݻWRN X畸^RR҂ UVbt:eȟh"OE`:t(++#ݎK.\(())9s̩SڑhӦMɸI[9!yrV5??ݺuͱcغugpzE={+%?XjN$̓%xB˗_xY&Xuu1co$ דEPQQ83t+W̙3gÆ XoY!>bw?DJ,a|-4i҆YzL 6772%E Ț…,ҡCɤ UX&L0`me` )^J#‡ &ٳgժUCCL%4>$"2EW52P1ɆI!I!Xd>BwA#{eeejjǢExVXʓUJ9$O~H ,˶[񽷷7HXUvGTh4t:Պ(++``Ĵ:ܪ*U?wy'm_}]r/t$me``ehcn6^OTm:ZKNYFC_EpA^?j(Zjgw/l N/_"H]p 99;oFC5k]hɚt> W\//3PPBIR\\ %s`ՄN#rĉ4וS0!:ujjjB@`qgT5::*(44;|0??mȐ!7pOOVA5M*)$Pb`yxx%z[hǏ߸qcmmRv+qx+DJNù"m6nHB#GL6?opv۷o_^z_m+i)M!`` m (gN!`zVO$` ,C !`I9#3gz'AAAXSJ<p8\R !$:,tNE  vڿ,>}NJL8$J2-CWjs ETV!χ$޽{wIΓw1|m/gǎvHBqiZ1M ,.YYY˖-k5⬡:tvv 2dHPPз~+@ϩU9Il-[VNuu2L7 E!6ԄÇ/^x۶mr&ޅ&Om۶5k֬Xgv;w %#Z `ADEEۏ=Ѐ-4r+Սp +h4(`j½CMéP^N'Of贋/Z,=zBIfee=sAh?Ϸz 3lT B}I! , <}I q%ub2eʬY>L_(}!2:x3g`akkk5.3p׷o_$,e9%1P>jj)/+ͧbZ^O_nnn`H!PAEEEjtt4@heXG`` ?ځH ,. ,<=D^ ,)pܹXA5՗l6P)U} HBnۭV^'?PJ.1}?~? &z!dΜ9k׮1c`!PG'tG}T2IX) Rm"TtWB._̙SZZf???Bɥ9% st8uuu g3 81!iii[nEg[ JΒ2Xewp,UgyW_0`V655QU666bX'n̙3!$XLZW^-41?p_F`acdXD 9L~7X7o^lZ*XA?~f^4wy'33U  ;EK`"vtO?DH'z^tѣf)eU垐`+1GX:.0p$#Ckkk <==o&lٲ__j껜 zjΜ9MMM'OτUUUOVc `FP}._\SSXĉ,GzP?|+!4 aaawubyׄ"_ `yxxGGʈ< p8Qyi94XJ(P\[z}@@),:Aet틋ÂLYwKa)Ef͚gy"T,$ȭ;g`]Kʟ* ,.+EHu;E L+))1:Bi_-dy:xf:t5o߾m۶;wnƍJ ]v?~ٲe‰pM333KؓS$*p8tꐑqVVVL&))ư `uuuƍx"J(fLX⮻ZlYuu5.}Oe((( sKjkksrrt:ݑ#Gh2>쳻~Ⅴw9 v;F.XPUUzB^z),l+nH`]ҫ1mxyϏK 1+..ƈ6b`:h4bėLʎnX\'E;X۶mb!$)-- &`զXBoY#sss3 l/ѯDkI!4h'* n)`~=B`#p ؁}QbmZe`]T[rh@`2`v|}}FNłCߩS欬,U6 §~Vtv !Xx;o ,e`%Q B&MxbP3, B!^2̒a?E95Y, "E;X35554,H_͝0a߄ \`*CKX$pakkkl٢pϙ3gh/|*6 r)SѣG?3m2"sz&l/ ܐMQN4hRI&y@m;Xft䨡%%%;J!$ē*))Yv^<~3oϝ;GQ`6/]p8uAzFok׮˗/-ۺu+ÖPRR%:<*sa]>?)+BHdd$ .%E[nɦr`=zT#߯=Ii-޽{ !(HIIyWrF\k.#Rw)_Br9W#R)-+M `}>صkW,Vٳ:h4 _HcǎuС*33sӦMv}ƍ7nre ); L_b7nرcGJJʕ+WpǍΟ?ϻEf4{9 Qx8^Ч*9eKD"F.O>dҥ"(@{ݱc!Vk\\\\\}!P|!'O8p 't}„ زj'q ,!`O @v; /B-ňqKI" :KBQ=I0L:}KFc߾}19@̓+I9X;ᄁxŋ 9)Ƶ_~4eȵR,[oBĵ `I[_)18L_r4$ʔ4e:%xxyyBBCu dl& A#bҤIRElr~ SWW(kLu7//OsBw}e߿}v^g"Ǘ _~=tߞXXX"77a|LzLHOzBٳg}]`Ю/???{ǎK>ɱcǰݥt8=י &++k̙~;RsBi-KcccUUʕ+I|h N~I9BSUbD61&M4drA+" HǤX8qbbb"6\XJ-^[ `555)ĉ#ebhk0y)(uV~~fsww'o֠N9#XJK.H}Q ) 2`0".FNqU(Xժ*%… &M.9jjjF#n MWB%%U,J?%KXm ? I!.Mjw斻GGG$kk Z>HpK:xs Y#t;m 5!4LxӀ\_ `}駃^pa`````…  Ve̙J)..o5h f{@_| jܹ;hjjڷoիW7n 0cǎPJsӗ7|3}.((xGxC.t ה)S{_oVo!"$Vq+.]{,K\\\TT(((ؾ}{VVVdd`njj" >nGd{jjjNNΤI&Mtر~wI2ԩS!ٳcccWZ/cEӧOǎ- 'OQ9| tVlee%|^؈@?;BK}}}SRRGRTT$;t`bb_xCgR[[-X%%%+XuaPG0;wfeeeeeA: !T(!xLRh%Hr%h DʁEJ|޽}2 H"[A$3C/q% `{CܮË***u ,,A``555^] ]07W:tY N+IZyO֗ &yIII?e8X ,8dXaz`z ,-r`UVV:u x_7tpnn.9|pTTԊ+݁B`Q,o)))nnn:@Xh~*d?~ o 8J ?Lw`9s/8}2:otww?}tuu?ڽ{7=Й}􉉉yz#߇'|0'OJsl6Ϟ=Y=uX)#!AZ3U% !t86ٳ^/-- B@K0Bs4X!gϞBrXWW낺W3ءuk:$ ٳt>=X]BBVzz3KqWxs8) W>)#yTT~$EL-% ~ #R7Xrh.Y!)v0XK#<i`ڝKCDx3'デLիW'&&x]M0|0x3j FPFvv6l ,d*EП,:u*fԩHsڴiիWT5 ~uuueed"ݝF=q_А>(-- - ***P6qDGbʹ*((|I(P/?Bk>'ND !DXX`X,k׮凇 IߢzmdsV5332ѣ6l8t Xxch +, :33~~~cǎ7nĉʕ+(yr%%%ؽ2._LzfiL&r7훚3R`¡C .!Ē%Kbcc͛uM:=߱cG(Hz^_\\܌\XXXee%*++v;R !@Y `BzTL3I655I  ,^!̙3B/_>|M6I"سgM|SJ^rJtl5x`8z2##bvw۷oxl+>]޽{1aL|);D9oRU| u/Ri<8~5kvڅաd`yyy;,/͆EЀv8c`)C贒'e,Re`Q0` ,Y]]^r)znZ !"%(M98&B[6jգG!Dzz ,gfhOxǺ`SRB{%3.\HKK-v$%Ez :] ,NbΝ_XdJ!XϟSӧvL>~ĕ+W:7$$n$P;vĴ-Qa-h"3@\x1''*vBqƉkXǏxȘr`l,r{PTAA ?~$ tXiiiXB7ٳ~9k׮=rHhh?N=9O>$;;… 466 LBb9w8wuW@@@JJ nCl. ,((ZPSS~4(XZeee3..`0TWWcr𕙙ܬK)]ڵ+dٓ}}}:K~ NL>l?O>Y__?|0%N>[LbόFcXXnOKK ;v`tRw:t3\Ze`q w,R<ÑhГ%HOO$'jXv NDZ,X:s FAX!ZY!UpUXqFWn>;f3Xt%JA8 !ԸZy*4XJ%$ g`!ddXNt ,h AJK >mH%r]ױcG Aqdo̙ЊbqJKK|@]Аe6KKKd~Wݎْݻ7===::H#%%V7nQDqG0Xpgy!(`a3ym vӧovq-,l8+D `*T'N_%%%;wڵ`)XB(Bwؑ`ǣ~5 8%E5Й#Fhll >\Q)ԕ+W z]|l2d2ܯt,]!= С0`eX*ELב=R !%i`]3\Jv@dd^ohhzjE9?>3 ;G IDATϘ 6R/+0y䑉'3F( 7XJʧ܁ǏrZnݬY/Xs e!fXhZCCz2**j|*Kȁ%Z*E ,h r8xl6'9܎kPDFwww'F!xT+!C\uȀNHV3O!tE*#`"y!vT&``!XCJ&`XG?`2:88Xvd:8=1a܊裏>_|A6l>>G%iӦq ֭sss7nܘ0tcMM V1NQ}vLnݺՔ!Ą bbb }n@j28L`剱322=www'7&66j2|9; !,,,z {ϣ0:+Ŧ&hXڪ* 1bDbb"ѱ_x:jrw{zzrXܮ憻JUX={,JMM!-ٳ@ &LszX:43D[◂edd`+%"Ξ=+.bj{x<όv)ʴ T 'Z H KKK۾}Q;v[DzСCss3tQee%7UUU'n 6=a„͛7B{ s@V$=++ eޙϢEp}EY]])6 ?? cSÇC}]tj& ~wTTTTTTCCB",&HU 2NBFs׮]a322h> ݽ[n]vU#E{J^g555|⒓E iR!e\ƈLf:|𨨨g"+gd̙ÇC4+F)1AH.0Ÿ` b;c` -;"X1$I.W`^I[9"i9Lmq/55IMMgt8E]E?DޅeȐ!:ptTn B+U,ϮK.A3DGG8YM+P=I+++@SQR 4!Lf8RSS|"""׷ :JV !TfKaa!9~7|c/\@ CSNB50+241L i93=z8s shhqOHsHL@zh|{<<<&LwR2/UVTh4feeKµu@|C7b N-Zdgß=p?p ap8[bknn{AZ_ >2[n_fo2.]٥K+YYYP XBќ{/\/?z111/8Pth, KHH_~˖-ѣ࿊y0&Ѳ~ꊡC^t .òwVBBҫWFhxxf#$$d =Ct?B!wqdjll+i2⺨LwwwT+>l6`A߿9/ȑp,:tJ]v3fWmm-Lvڵdwww̨b^%KΝ; 'lIII眜͛ܣG]Rby22cƌ7|dEE`ׯtRXXXuw܁؉;izmhP| ,%VhxF !GOObbbAQ`/#Fظq?/1h󐓓};l#""v; PRsq477cK 3\hޓ"~bL!4`ګ?MB%߸_~T8JΠ&VRR?{TX|S@c-%%%ѩ;`\trBB;ZVe2@e=cAG'$$$tᑔXB>0EDDZ"7]#)0t6içb=ǰX&)DG۷oVb`V෰!47QP$O?7@ F+8p8;,<^"`kjj:N'Lpر.]<Ӽ'%$$?;vlyy~~@"""x㍌_=66޽{GEE%&&555]z5)) Q.]PhGF9 Ӊ&MB"쬬 VԷo_/&.\}:)[n۶mxꩧĵݝ'~7RtD* $͉`7P8al6Ks݈2444PMn&FچbX4Pg ,!Dtt4>W>pynKv@`` J.G۷2+6jhh:>X\_QR$Ğ!&%%uB@- .t%(зp)vh766@:`JNJJ"+)),z2LC 8p &-~ȝH !s5'YQQQ=nE+K$%-Mжŋw}o tpfJ }.nN(D@ s=30 C&:>$xRRXY LRaa! wTY T7<00dZL^ªUN8m FYnQ3JHH_^^iӦX dѡ|-Pq-X%ɰ}dѢE@fPj@\L$cN:SN;wԩzYfB7|b|2V`FFgKa D|p㎒Ǐ[&)&&ǞNMM _|gϞ'OHp%=!cC+V{BOUݾ}ի7l@ZX,ݺu ={l,<(#Gl@h:f B(0`* ($55f 4Hy27l0պb C롇#p"۲2:t Ix"4>w&iϝ;^[n=۟_Ýv*.. gN`$ӴgF|*W^&)((hĈGF``xx8m8&Z8ݺuӦMB ={X4[,wҝ/ $xFb`Jr`A)h8ˁE#+]LbXL+!I7J5s`9 !(K|x^,IpgZ9ˁuM7%9o!S뚚&`!XMMM 7ph[xgr`)qCjF>dwźBqTMFA3!X槟~7oq&q=qg6 V2B 跎;,z* 7fGݻ7tbi2l"% &!(uZ@@}]ss3.N5j\U>*:|0";ًE4}QFشiSxxxLLO?~:mdSSSNNĀ78wܹs}˗ϙ3`0zBݻwSg """tb4q5\={2y\qzŋl6(шD K\f ݉+\ !XɦK5ia2Vk׮^^^_}P !W Ewx=- :,ҫp'|}}ą!R7jZ46$D ,!읏%=R,F.5Sݺu{饗<==́%1h{RRh,,,ljj"PekB漗סCN8(m$$nnn <66644tҤI8u ;ѣGϝ;n*++{JJJ:wc%''r A<9pIơ+W !v+UX _?:u*hQQQ;'22>$$Ζv`,(h.].X@B([ V8,- XȒ,^`0,[ ^51zV^ @P$rBH[Q>>Áe,_%_B!qGӧBXTT4zhL1?Us`IRjtlXV"&v9P?sAEGGK.q\UyNjz'V^ f%u# _ByE- X_NU*% is4hмypq%rXenh7o9 5{gIܩ&J,|$$X8!"E!ғ bijjRތ$ =z|o63v ,>}zmmmbb" 08%r 6S8O\HdV)WXƍdǏw 7L<_=-[sOMMMZZܹsu6v=""C3 6>gffjKk֬YlҥKk׮-ԭ3fő&,յGgoGeeu_yѢ`3[nv}M"D-tGᆄ@4'f4dpOOHr&1_AAAF nXC7of% !6oĜtH/ BL81**7둢"X/"TDDD׮] aCBB3/^ęp^^Q䣏> wfUVVR <׷nSСdvssi:uyB͛7'QQQp?EThDHoyJI܏;zg"l-pQ=% E))>R2݉HVX!Jha4X$<-ʙ&Xq*2IElْqxCQE ,23(>߄s4ĉJ`)$d<<Bk38My&O|O:ĉV9RHBҽ;w.֎EZ `yxxh'q_r3gjkkՙB"P'@ 2 ,)P1`nd2!k `o̙K 1-%GftJn20ot,X!߀, +W\/]/9oWFIleT2P TJhBUXK;X<`0|K.壚ĝ, WCv(PYs^[USB9˩QnI댁?HR `Դ);?$& 5cƌÇ[fl68rҔ"*/////njׯx pIF:1ڌF+00 kոyA8B[ouĈcƌA, ŋU'`mذl6+[nB|w0 ~FC; IDAT22 SV+oIHH{ݥKNG'cTX:.$$KFrܕO2eѢE\!:u:~8Z+###1^{"?#wt:qmrDKv&:vh2\J'>r =j1&MjZ8x13l:=ҮpΝz=vJ-J[E׻r7] `Ԑ%Զj3x!VDI#D&;``YG}j #Gc$R2<== Jt:|5XeFө2"Nd.=^!* VV}}=fD( ~!Xi^oX ]vшHJ5P5B:zw Z63Гme`Z`IϐeՍo˗/'(BϜ9!hS;ŋϞ=S#66j^tiǎcĈ@(DDDqxd`$2WX `ѓ <;6-44t &":sppo}}b8 <> f?~…G;v,..#EDT;vAeee>x ^PPFFjP(h--Ht2o<$(Xfi~4шXB"4,J$1Xuuuuuud SCEķbn|͛GUZ]v777^d`aJHpO?),OEэ`vZiTڻwo,Z,g ,L` K#ϕݳg;uԩS'N޽[^ &NDyɓ'w>xCiiiŇיEKLWPP\M6s=J?/OUKRQQ/ )Zd2uܹ֭s"">#b4v`9URvp GEK122XjJKX{c=vmu?OݺuUwk]5d8q  qBBR) X\A}';w taҥQ;%zK8CUs`9 !,--u8>>>g XznK_B424g`삙 lO%wZa eje4%n@@L5033s׮]5gdaޟ+ڔdԨQrE,~VX؆`+;g*[lijj"z,L{<<<<0a<==W@$B(HIIȀzR2E,UnN,`>R455 C9U) KBHp8˙Ry5BBty˖-[lᧈ &&%3 77w6mԨQoDWXO>un)SpSp Qn?q8 >gc(Ι}fX}ل2hq :ƨD'FqWhTzuo6cD|~&qh"N 0~UusÙ>v> |& %%%c&棴tĉ\r/~W^y邏NǴdH 譙]p0mK#̘1#_ve .A2هB!@;hhhSC*XBnn+OBݲ(+O>GvA3,@`͝;G'=208_&WUU۱v&]eϞ=)D«D"+t ,F.H`T[[[SSpB\lqRCCM> ,  0#6XF)X fM~a]aF)3Kׯ__ZZ  *B>@IJ {MB  HW`XB 았B̻74K`i2ā&Pf=p+ OMO!>}zee+B1  1卍(Xgy׿uL/v .GȔt` 0}tzfjhhJiYK ' ~Q`Ibҥp/첔[5999` Jw555޽{w,!暛N!8(MF}GL !XtBR]KdXF)@` cG.))aZxz)x'+AC 5\rZZZZZZX2B9ȐyGP휜xV>4d᪡n.e(sϭgu]=ڵkWwb/ ¡ة+:t(H8qbJ*qeD`-EBQ`a4e- :t=Bx] 'R1< ;Wjp8G7>BZd,XB8 vۭʤx`nٲYt !y0JB ,MӆNB(A W]9fO_.끅S/BhH$ vUI!U2X0̂i+v.EEE ,| `CT݉'_uUI!)4| > ,+siuuuuuuYN:ug}E7o^>u~xG"Ȑt˯t~=N;/mj`ҙuN8a۶m-5k֬YԘ>^`)F_B H`͘1N?OK/Lsԩ9-E `b,xf(60N7d-0Xuuu^xa"SM)n?HvbˤJB ͛7C[%ciև.^_&H(,BhXSSSSSCwx ~\@U]]h"Xx~Cʖ-[fp/YfG*;*v{?@o۶ Wk1R`}_=x {WYS` u+#C]ر&mI&XDnڵ6m1cFyywڥK`p Fe B]Y]eѕjmm%F% WtiCg*&72رcÅ| ,似<77 b1X&\L˺ ,.b(PO7x9Ot恥ߊyyyyh&DBNWuxFyy޽{^+Xj#PLLUN:`y`p8իW[&˖-5^73f̹kʣ&FKb``@LX#tСo~6mbPZH#̚5 fѫVzggP<HdܸqSUUwvuuY[7O` ]-b"d$4i_θiD靕fS^ N!F4E;jLz`Ѡ4i xd2 "(:pS#ϟ?~[[K/$V`!P GH$t]wZ}}}t WDH$M]yTY//´ȑ#+X3&BHF88"B\8薖644NjX;4e&YPP `{FI.1k_p׾SLyw`BRVV)n=ڔ)Sjjjͮ@8sLMӒ'x5ט*/shuvvafǍvh~Ex2ǴiuEg;w,--7n .T5Mfٲe`Rxikw ^}k8iҤ3gݻK7^z4흝p7 =XIuu5&'vO7'4אdO磀E7.OLB!Zn}+p9sLp.'7ٳgpXiiW|+tGR`P%$z%XD~TWWر^m]O<<;h.OK`1 &phLM Jr6hfnŲr|۶mGb۶m<2<2$МT"; B(ћa ֊׿WWW{0UQ@ ڵ;KyqB\0H${zzeeeI!+%!HF(3bBH$ ,XÇGQ;%Kᡡ!.P(ijWĆD"0BJ$g}vWWׂ 0,]"ag~zߎ@^W/'BPee޽{uS%Ӄ1c8p_c=6k֬ /X6c 071% #1vطznԓO>ib3 ك=B$CC{FYw23.tX6Gyy94%W)FHHkKӛ *XKB(W_}?CK7@H%x,Zua_~=IC 5CSsssMXqfxW𡢢BӴ.8H%B8Rl̬O!Me,M ,(F;I~s?~ĉKKKŎI&ы /zs=@J`tE}BHAAJKKŶ Γ\+((;v}t;P JJJ_;C#%:6+())aذ~xŪpc999}K`X4w8 ,0/**O^{sVWWkn?H8٫O` .C1^RRrQT`3^z}@XB]n{ fgqSny~:''窫MEFvꂖG(o)Voo/PdE+x+??ǫ0 d e:::hR?뒆Vz_z%z<,H$v&{`\4+ v!4vrb':.2)bp%=dƈ;; @~` O`I.HËL9| )V,C|ʈ,zzz? d Ϸv &Φ< BⱵBDyyO?|9f̘'6".pFfQ^^^PP``ܸqH`/Y*͛w^xaxx{]fMOOϨQlVy+q a8Yx&ƌsEE"`?ĩ24ʂBRN *݅X,&&;LB"6ba+x1q ?BTGZDTw@Bp >0";d贷3V85 ? , + SkpŘ700vL*S2sWWeJ#+9C`h`Ǚ=/eXΝ;2mXP覛n H$rUW޽L ;::K2.9|K0շN>݈Znrp8Ā  ` OFtFXLwڊo/g̘qB[Fe$# S JKK IDATo|3/_X8s!ki:.%yuB9|Pea1i$]!LƎk.&#O`vi[n ,IJ#3,B ީzI'dЭ֯k2MxueΑBT"0&xR=d7~xHB4]y_gIpl !X+`+XP. b^F0CƏoD`CP" i{`2V)0`!N+E)'ӦM};K{i/b\% >Xb^7OS40ZL+| )w)FO` ,vBVJbt^"KFz~b^Fm$G|,P`Czwy^5 a)}I!aՇ'U`%}SNq#Bp8,#wI' aw'@Y1w\Sۆ\vhfʧ ƍ?=nܸP(GVP#pp'J!,,, DFŤ=v`0chJ+Hື} RYY2ZCsj] (XSm 0qދ=ʧn(P""B%\IP=SM)d,^E]vfĽL ]Q$gt^N!p|LK.B^qB1S`o4]wݴi^xT`;HձuFBX\ˎ {p8B{o,i)*++?X#sCSXt !g,ݻw; d,kkkq{k{[)b<5qg,T ,eMkQQQuP(d@KKK?I7P([w &τnZ !C`gֈ22&tvvZN!ej ZYY DB ,]"RWu)*e+**ڿ?ͅ˄ ?/7XCCC >~FQ H$" ƌ;︪)KS ,$ppT`6cǎȪU~3%`aM̤}?^ǑAKT +YƑ-ZH9&n ma'0fzH3 k9c]]]Sx8B(H!Kf<  ˤ.#w]رca/*h8 VptMS" &>|T`ac5gw'C`I+**>C tƍp<=1“|%C`Nw_:6U$L:,j\طoiؖ(x#G|߿   #5McdNn6po,l9xi7, ,M`ɷ~^Y6偅@ GFQ(VUxjf+H!U!///''Q ,ɀGI *|VOOO2dB ߑ룭hW^M_c1ڻwB "K2jcƌs DU f" m)Yď;lxA0$>Q`”Xm_ 9X8\&z!txxLchAN ,y h)@%O`1XLrL֪̎UhZS`4)'x Bv4-$I(JbC ,X`}=Q=#P ,tRbn ̼Ŧ˔lm跸w.WdG8r [0c aQ Z(Dpi LR:聅ɩ*)) iBUAa.{`хo(|9p/ N9KA !Tt ?ڊk"dܘv;S ^)o\ћ.Sc6R ,YKbAbR[GGMwB Bx~?X)2Bխ]R)%K,Yf!)`򫔻h4}{j㪂 , g,} ,*MpobF)x<&ѣG=WQQti(a:)ڔQ`M1X˾u #ͯ+h RX۔VBp 3)~PTzR|WUUL`kѣG;%aj;.GS־}w[T b~~>#;vleee[[[oo/*HAVJԮNy`=nL]FDFrrrk7]VQQʙUVVB*C`A-[lbx#8L1gLy`=z4! ,A q@`e*X---mmm@`r)׫[1uҷ XX =H:⫆t93vXΝ;1U`*͝J!K[[[___4M$+H0Z KE5:B)S-+Q ^_L$S]e^!pwLI+bne >y` Fx8(.r x=R*!8/=~r웸ɤ2 ٳg=D@ER0SʩS644|ߧ.N!7Ԛ_OK&'UVVˆ6q$vBiR`fX [S`;h FvB Bx^MFAm)KubAXYY|i1ضmG}x@`u"O!O`b8ՇN&)Sx'= ,̙3[[[wAhːQ`)Z ,d9rXF v,XUUՖ-[Z_h \9sEbǔI!,))1X W,J!͍D"NGdddX999|ƌ f,`SYx+e .V" LWQqGK&M{ǜZ(LsB"G`]w&V`1]> ,,P`.)6Xpޜk)8X``kƍ`HdA;kEB2&F袋p'4 ,˔;! _yE{8EEEbe0q$ABA' l~~>a\W,))9묳fΜiV%Nia=zT878Snp8FA;~kҥk֬B0--zipƏ_XX.BمGdU`ER21 m BرcҥKAh)P`n.F)PXY[W4Ə{>*xZ6*Mo.h ?cEp?BB 9^o~#D%¶q,qGw1Aδi^u~HݱB$|EByx뭷 */ZjՖ-[0K/=|ĉ+**;GL! B`2ye 5N SIFA0ׇД Mfھ};$͹Bh䁕IpQ`LYBlJE)((hkk͔B%I8"̛7W^!\ ! ,BHQQ7 +mXlE ;&dO$}}}Qs<aLy` ,Yh4`z#>+2+ eGūRrp7LX2,)0Kϟ?>6|7oޮ]oߞ2D GX9ŏx,FU@`#ə;w.m7R2@`2*,,ܿ?p+o"?yww73R/y]F)*2V$Ǭ͂ Q&=S$ %t=tg;L*^ZJ#X[f % 77w…R@Ľl``ߴ<}Q̬ )+K ̙O}TtbK<,/Ξ={ ,p诿zBr#XښbDpS֜9s@%%;)4cJ 퀑Hw@+Ҳe֬Yːp~l !C5zkB|ĸqjjjg.+((6mHKF%v%?%%z衡! &iR ,o[ K<5-Zlٲd1j.i+''wSV`b1`7գ{\~$K`!- IDAT@q}9nAF&|$Mm*JSz`+2rKJJjjj_{e8cdž<(~cxM NK@6) *a !-.K Mi ]4ŧ&MH|7n\b_E5jTUU'| %iUWoMJ5R !Xlpp0e !n +e iviB) ^{O'f,# #4gX20R`X&''7ū6W`O`hY\U`EQ'p饗BAAo) MҥKѱ=iXHAw;|7SE-X)wL !/9sٳ*pXJ!RNX- ,ֈXH` 3gJ_=K7)W\Р;ZX0'O>묳tp[[[( ĝ l"#Cx<.xPUM!;uuuw~c PI),,IH)T 0q\r-[ƊM`I&XDZD+ :Bk)>.BqҠ_… #Hss3]e4Ms+M^ŏ5FUXp>PBnn..B* j$l*t=k( h prU%4Ek_sh!5MÌrT`< >FG4RXLo'//ORBln FW 2Vaa!x3d !*Mܙˡ$ћA0.A 2a݉9K+))illχʤZV`%Z#X]ŋqb̀>^^8 O` ,|7>%/GF%؅9C`ٳ…M:Ш΄F&=VO]ѩ5sssVz`TctH`\U`1K)5/ R*\z#_L | 3`vuVnnܹsw&ЦXbK~܍HdH$zzzRX2)2/#{bs9gcǎÌXŸ qcǖ %^%Mte ,4  ,SFX߅`&.s-Xj\ BY{hW5x82zhp :biBM``Y!@!M`.)4M##[GɤZV`iA u֭[g\ zXJ1~Xpj]bѢEGᯀQ c#O` !}%[ X+FUXXiZX ىrIknY500pرH$J$@1ز JۮJ` hcǧ=e?dɒ;vܹ$ B({qPl-|b9~&MK *~p!sݶm]‡PMӌ,ݻ=)+j *6X)gXgϦt"mq),:X` ޜ_A-V`XXB#VX,w2 ,~!Xh. RQ` Xb%`Վ VC4(_*C+Ї5L՗HӴܮ. 9s {E)Frh!SX%K< ܅ \,((e,MIX<ֽ\sQ i| O7xg~5 Skp3MXO$ײ *XRd$>wuu5駟2eͳXH!đ) ݜ-I=-XԤr%,k+#X>W`vg-iH!A`C="ReB2J!455A1¾+h:pغ;\cVww7 }̘])?)F ,X[0q'#7GT`_.\xAX3fm64X%%% {E+g , (C{`BN9,Bрp$18;vi{{{^y鴸D"e)"X")Lo~ ,Y}v]| +fJe?.d̘1?ԂOGA5M`e*K2u+R(8>S*E`Y !ynK< م`' Bcܸq0ˊD"g `MlAHW` cǎd2yI' ,Sn R !gyL5s]@6 %JK} $LpBaY&,(0,%V`BȬx R`J588h74XXF5,BH<bf2[=EX 4鯃gBk;fSMy`2 ,BH(#&z pi566~k_W`Z H$N$4,Aݾ=˔+aFX 2'F xny`)_ x+HE`)d38?hlm+KŠ1uw444J!$%B0,IIJ(9#ڍ &]c/&YvXLJL`o]wݵuSO=U\U-SMy`9BNVv!$]+3aT`V{{; 8B )M ". B̘1nFE )8m+.*5}c#;W`\[jw)!$CjS\w[=ʯ ,e44S#)(**R*N8aݺuV9K8z`N|BhiT #% $'(Vw !DwށpX l{`хPIXwB£G%H`Xv&[N쿿7>(|sm%?i{/!k)))!r-o=LXm6'tH/O_= .0{hllSiÆ {ҵOPHNw5qwd o.8"2 ,BH(g5Q` VD|A: ,S ,8kޔ)SMiUD{{{ ,X)Oڅ#b,)뮻 +cN$,z@X6qGSW$w;ov: Y X !m` 7`-tŝv)yJW`&v,g(xt q+b$N(ҐB(:{YgetA- [ѧԨQ"恵r{,g |G ,BHaa!BF2w!t*d͚5'|2/}3 wiB.g%-)d@>HXJo~իW755M>=,,0QSO8ՖW`a Xpp+:;;4d"t ^|2Bڜ-8H`aRd 2ۃi:0 )p=3mEFP` ĉ7l0a[5ӃU麇[J,2:K`Y#yL<_ץ_O( F yiH!R6+XX N<Xi]U .Xy1}L&5M5e-X555j ,&;y'\޻4Xx|ź(!HdhhHr|s˦L ! K8B4KA OQ A B:-òOXϠ3)D- BiZAAѣGrdʁ3OS8;?cXOOCwM!49" 9 ,Bɓ[[[: X7xeɎDg!=y+=XL2K`1]G zJEijjھ}`CeL۲|"܊SW]a6L!W耙3g.\z;)<)xU@kc+Vd ~hδJK<6lp'UT aWW9>P`.N!8 XH$baN]@4+̚5N!|VD ͂ IDAT+V Q`)Be/#< J# ~(= ˫x\ᲯRVv!ex)x:4XĜ9s;S)Ǥ=zRZZ"(1eMB# >iXBo]+=X<h`,b( lH!$9r;5x;);zu7sr+":QY8P202B:2I!ҐYWѨidRk'q̝rXV`1WXB:qꩧ:;/ K---ćN*0P) , SWṾ/8U]dKh+|xj~e- ,諰T i؅vww [; {%H!ΖO۷o_fŋU (,Ȇ8;ˈ bQQb<8Bwjqa6,mThPM)V`!;eK40G򈉻i؅ cu/$XB8W\uVS?Ǧ;Lǎ{PX q4fdppxcblL3awRXΦΘ1C>lKK˼y- m ,( x\ 4͂ x`y ^F|l|R=xdU=c0 q1"ҫfC2qT) {Iև#[)5YÊ+2]S8BfVuwy睺EnoB)d.*P!K2S6+ȅ7Cp{X z|>x`)di؅Е_\^^/\z >?pnTçB2 OBh9SN]p){`9r)Ls=Q ,w+b=HU dy1p q0aœ9s˛@,_7)Y BsN?G?Zt7 {Gykq&~DPexBʞB8f)Ny`B"HXU><XF10Pq VXo/"*!X<%\Bs% ]2utG622!{v pᚦy*{%0OW$q*};SnliY[:r̖*,[6裏2^U~,/}ܹ gu"{Jؼy3g?#_ˏF7Xl9ƬY 4/3]'og ~ŝw e]x"=ܐm۶9UfUU!'?^uUOOSi&(yGO>li2q !V2[x00zhBȄ 2]CX{_cs㗰ӏcj>8?L;Z]}?ZT8N:^~udy@׸k !?cWEm2Ǘ0z#G0,GPSΝ*{!ٜBio$d!P&I+,oneM!=gB`YGOR,#˃8*Ri2Lٳg[7o6jHP By`1pb1\-&"dT(I3hiB+( ]AAAA,:묟7?94WK27]]%}.mAH^UVzXx E`)( %RPPPP]#@)/W^;=z;^\ /#N bŊLW#8z˽)2qĝ-x2fV'R ,ZT8zjbY@1PA5@`2ZaM8w T ` { ,)$po =HXր-*PA!xKAAAA>`)tiI"n5}:U%;)-jmmur+Y~rO$*(؄b`B;89U+<XF10Pq T} F5p񙮂_ᩡ.6 zȩM@&A IX^F]+<쳧NL|6^hQ#,b` ~RO(U+I qtCCutt̘1é8*v;le > -}dy1p * lD0 B= ,YTQ.aժU餓̙S__{x_e lj`l" ,PV6BG$iiC$)))IW\rtS17S~6BzF) ;E\755e ~/1H:8zW`Y b(D)mOԛ dyA`ey@H"exjh8S- q8Bh9`߮X̚718cA TD_#H444s=BM<|f8I'G ,A|g&Ml}|̶'M <XF10Pq TP,]uC+,cΜ9PWA<`,d)8H0P7D! KDA&K6(s?`Q홮_ᩡR q8RAtm`U,c0XY@1PATCM<ObϞ=_G qTB=?f* b0q(2W18CA TD195P2iZ"*8*(D0,_ G_1D"%%%yyyB}#PF 6F) iy8Bhjjt O ֽ{f">q@SvXd6G[18CA TD19u5xŊ_),`@1%RAt]!PA T`P`)((((R 5RPH?{@5 6^"AQ$CP͙_GB1PqL +TAfX`  V10Pq TP)A?>U+ؽ{wyu]iYٳ'U1T8* S` dy * X+u7򗿜3gޝ7QO&iEK)Wܗ!T`]\Z\]WVP_ׯr WAU@PC((mNfԘmKˑdz>|Lfͫ 黟Lpp/]7lذ(#@u֠A|]BijjRվ.9r-%%%QzxU@v!r)u:jɓ'O Mf*+4 Bh`^B 8 G@"š(I{xE!BN. uzŁrss[TTZjݺuO<9\r#a>"K c4X/!>2 Ϯ/|_^9B(=q_zԨQ ,J$ |Q8 G@"9B(Q¿"GGݱcq޽;''p;vm.\2 Pݩ_~rsq|"@׺W՚5kƏB ǺKkjjM?yҤI###<466FEEd V7Bڻkٲem>w8&$?o9y[7zٸq3^饆 K/=nmii=aopoEbCݳgd*((x饗^ŋ [c`y7k!#@1WFqÆ 6lpoBog!E}˗/Z|G}h"a+r |ʢI&͚5n [?;ofٲe|!ϧ:N(89sǛ3g@a6l\nݺk ! $p544̚5k͚5Ǐu-pwO?pҥÎ; ?Y;v?~RLIIYhђ%K?(ǽۏ?xlllllo۷zW_u]pV\9|LB?}mۚmve˖.K,y6nܨt:G}/J$hJ Ȧ&5QQQnL9"eRSS3mڴ?ϓ&M\Q\\C='o( /K"u 1 DGG}ݞk~_?~\XFEm۶mܹ+bXf͆ fΜ9s 6V&Ou֏>(===-->Xzubb! zc Vvvs<ל?~nL9"eQ[[{]w-[,77&FheJJJD^@9η"vͯF1PԌ1s͈#jjje(&NxdXǎ+lBfXuwoܸsƍg̘zt#R?o9y[b:zhe:qb ۲e~3a9YfڵsΝ;G),#t:׬Yp6bHKK;uǏ 1@^'b;֮=јtRj_=33d2.LosD~bС}ն"@1u۷7448u%''ڵK؊*B 'OGiiҥKcbbN:%lEj~6ljZv"駟N2z(VZիWY+%%9ӧ>}p̝;roB_oyl̙jZVϜ9A:ov#R&!{2,11q1g͚%0&''ϙ3ҥK; ǀP[[#DFF*c۷s+B G޹sgbزe˘1c""""""Fyfϭ1 lڴiAAA_b˲[+Vj z24~ ,kh`_C X54~ ,kh`_C X. 1@ ;Ю&h`t}]+G+2wܨ_~y:o޼興g}rvQF)?9~ ,/[?jO?}|?1QF]rɓ'O\zgQQ}si4-[,]ᄏ_ a0+'+aV\`aѣGNo9rg9s =裃~M;vxߺϠ7RRRF1<<͚T@D}ٽ{wVVyРAշ+3h`xG ,}W*P ;ٳ`ReS_Yp|ٳg?\1cOͽU_A .!54~ ,kh`_C X54~ ,kh`_C X54ɼ~Daگ~6kVXq z}ɻ8ڴiȑ#D J>Ν;ѽ +V,\bսO>T&d[to_iʕϿL&cY[nM#qNׯߕ+W@9 D)Qh Jq@}QvXk׮{p5s:|t[Qr(R48 Gq@(9Fںu{p5Zr… s =  D)Qh J@9(w !X?K/7oK/@(EQr(R#t_z*f!G@(9r D)Q4/m#4.! ,k"l`1W۪|xv땗 h J@9]򗙧"IZ*+{pcz\aǻ/>ϕ5jRLOOv𖖖^z)+++888<<|ʔ);wlsM:5$$$&&橧X,X,sFEEļ<[yEGGGDD<.}gyFVgddK6&^/׵ݲKyǧL2}N^YTT4nܸwyg.]z׭[ww?ݽޛp¤GZj޽G|?w}D;vO?2 cM8{ill3gٳ 'Lp=455͙3硇Z`pŋ:_ݻN^ZGqF^'I*yyyƍuph J@9(w aOl`-[>_xa;OVkjj}# 4{믿ꫯX+Wt=:u7xýȑ#<̙3gڟyĈ%%% {O|sF}]xX^;,0eee]ݽO>w7774F=xŋ'''_h ǎpo*--t7RRRMF1<<͚T@D6O+++V+IR ,&h`y 8\nIRaBp8[% ˲OWVVٳ'==}̘13gΜ1c02d2)JVkppqYv^hѥK7$$fT*? z܅Лt(""B{)++s/:^QFFƶmzMƎtwm\a;c>>`С!!!DTZZn7@9 D)Qh Jq@Хjo߾ǎ\n:IvqGS(;wݻ7ofknn-[<|g_2jɵ~;@{.9 D)Qh Jq@%4{ >|b+:νuůچ fOq&L'TWW\e˖M0>/^|5k4FYzŋokѢE.//7h _^EQ(Q48 GXDD>… x≈I&TիWfggڵkK.};|h4t/'x|]u Q4h Jq@EQr.˸5/XlY~~>˲999>k_pS/m\B=XЁ|_^EQ(Q48 GX0<@~_1 f`aYq ">>~ĉ_h|]xr D)R8 G@Kh`R'N(//o~aUU_|~<[,/---Cϻf}]xr D)R8 G@K2uzOĝa]b >7+q\~/9zhΞ=;eʔ.;;$"OnڴI׻;w𫯾ə6mZ>vXG2ds=l2/W kh`Rfzk֮]*6{\rѢEDO_c[j֬YbГ(R48 Gq@(9B½r !.]2eJii\.w:YYYyyy))){ӧOqYYYOOO۷o;:?5Fpƍ*f!64|*cѲ:+d2 D)Qh Jq@%ԣF`{7o޼kΝ;sL_XV0r":zO8 Gq@(9B5k֮]<ܹsȑ^?hbw~8)))((())顇:w\ѣG[ 7Vk"zk -s`KVJDTixj5&ߖ >!6ɉցrFND峲XO<ڵk7nܨt:G}/.^'-[L2e?l>~رcMe\tʕ+}U3\w8!#6J>3\ODUz"kzgٺd )=XJr֭|M߾}SRR͛7O;Iqq3< 򔔔 ۷g)))i{gƍέ/s>Pk:dql}aό#"=Jb49[X5^xgKFDJ|Sx~*9r D)$뎃&&&~'qd[|O?f}NNO?bŊUVuWUUuSafNv;}Qc: {̐ ∈{b]qzKP#HNDQ>) ?9],:4{}]퉧ONNN u i],dsEZ": ^z|oF6n`>aDTRt[U\{m1(m{49A ?9]Xp*++333;ܔYYY~N;|?+ty| _Z|Uzӻ$#UTǑ? -ѐ~D4wFDI)#^AD%zss`qM+[-B<ε.TZb1^Or:Ԙ z44 ܻps|i1{`+QRfXJeZ&)Eز~{I}ÕD4(+f!)OD]* fmDT\%߅o/ |;UXvW0"͘G&XУ_JJJo*))ILLt?y^ss~;_5.&DAg/QP6sZ]!$eTDνpuR\(ǝD; /n@D0IbP" 5sN@\z)SyjYSSjժ &<G`1 dɒ%Kpw+ K 68`td6m[DD4쯵}fZzϰa-Â}iUL"R9g &T%Ib!{l>[Zm "y־tb4-vxsZLDPɘ" 5 ,gt:_W ,3{}X"-Y}8;b&b\k+//o}5-SvjXb1*J"iKYYY߾}}[pV3rbC%"Rh0F<r(2pYVaAѩSnΧu 0o޼iӦ}w]?_KstS%"8cos+W.HFdNb -KΒߨ J42-DDP ѝ,eَwDXħ4%θϑj_#fKBDu݈AQq8 `t1 L.<Аn _UΕT2|(OD|ybIb$ ب2a4}])\B?={+ӰXhV2 $"'QHVWBkrGJ͐N!s"5DW'"Y(Q)/^~j~@]J<1uR 3id*X KkZdC6y"rLIe rՂ< 3.K./htUdQ%q*a;FVn| @'f 54"|X 48Lv3ߔg;['j[9IlH#UH@DOabH"trqgINDH$f; az|%19ŭh[d:dj}|'nY|=|eY"J sT Fk=]N 72Đ(B8Q+ry!KO@*Qh oч/r/ ,XЁJ_c-GW>=c~ml]Q$&/ 40*$E ,ɘ8^]8zTB)Ӆ[BPY/QaYAk "8' n[7wU-,~x}q+ߝڼHbs\DEDU[9ڧLAD]KDۤwuDϵ66*Qh RU|ɃR"DTo*Y,Oa,A|]9x'nrH- 6lD juE٢qLUA H%: ׼AUd#$r琤"ڄP)QP3.&f_ƞ/Ӥ1񼳅QDq ln"令KM#:-,."L(7.^}`Nwګ֝ &t:}+F}s%U\CIF&5˧ۉ(]2uMKD\&4; *UJ#"e>|Z9sDч58&Z#g >TYFhcJۈHfB"IA w 1^m6sIDD.siLXxj9JfNqyg9&}qye4t- C2zxH":vV:mS` X2,225QQQ*p444t׉m6"dd%"{KAD*8}!䲐TD$ # q#{i/f<.K[.,jɑȌIqJ1 SZZz)\Kmx{o͚5 dwyzq0ʷ +GKęe4]Ce\l3"QZr(pJˤޑp Վ -EEEELdDRdx&F2gb1#Mx{-0eXUX+RcsҸi؀~QD<I% ʼuB !܅P&JR$<<<==\bnvIn.4лd+É\% 2Xa$44TS*e &egeĻDŽ+xr(28:OȵD쌏 #0N^l8pB0sh`w}wƍF ޺uŋ}]߸q|uj&\ \_&lF`5q(J% krHc[gdl KDj`]vJD ITrH2jx_x.AmVI?]} ETx\$ cYiVGsu4H?M0̤!Ni!Du%G˯eY`_~;jO8QPP`tRa*WédDBD 111.رc6JX)PyKR[눵 $D$ZHDDz&/. -@hÇEQh bmѺf354;b#(;+kMqqqÇgFvR7h`;^fɒ%>VpX,^㸲dd$%v! b\F9ƌVOED<={!L"wf.3Js.GI\K3vF`m9 &!YCD$a^B>KhEKM-N)#-<<ܢr 9t`QKKKUUFinn" pBlcz"JQ=ۘz6"ҶYV6SWs`iRUDJvueyiee/D'(z%% pygj?FcjNg&k{+e3LTm<ϻ\.ahqqqv0((hĈDPk7mV"bJFx5mEr.gQ8x"b Nh`ɂc$DMD!V9x2q{)Ez&^_XX(dvcFd?Nѩ˦X5âbBYӚHQSSSUUu)a¬6NgHb2_]Xz޻aÆSfggO0W^7|4xo)by7Qe @~~nH,#$e]Tv4T/NucG,l6RyOtXQpm]3%EK(JL8lkJpa%K$0XMDq\SS$IbBBEu}}=`jӳR JPIK !" F`\\#g%r?T\*M"hԓ9^96;oHϕm K9j""{t"Rlm&|Jmln r:.\o},|*R*Iu:Q$3 *]j̱. d}`+G`Lf8XE.X§:u,yZoYwOwW"(Q4_1.\BczjىMF4R" "*5dD۵-Cr\pb0 P(fsdddcccee`ξZ1jtBh`1 |'s6+ ,w~j***?} Th`uv|o!A Úd)O7oӑ$Hd.W4_uҸIυya,Nh:YWl3;x<Xݡ;]CEQtYj]QSTW[EDqãbң/)1lh2T*Tz嚚K.,k333KKKOk:r]SbCCjZ'OLHHP111CC+d\"l .|ꩧo~b}wyǨOO#RΕMKz0+"<+Fz*,,ɹޓzF#, bqS\^5WV:h`o>~V%KZ"TˉHED3+…dRU}3~9`la m^8>@1D +j5 6'l4v~D4gQGC<95LTDh)T|$'`$7n1o;)!&Ng>wY3__}WreKni?0l@JxYX)Qg1? N*̚EDrZsNblFY<'5 , Pw_(vQ(yQ,ȏ*] I[ IB{#a1,K-nJqTWcٹ,m;UyfHDO˳!2Wego;Qh J_9wjpu6RZ?g]%iZ۫!^o4Zm}}}߾}a-gk;=X%FCDRQoUja~v|\.W*.P^8yk(Dӑtdyp IDATUM۝4Ue1}LI.Op'!ZVE+;i2]ʖaV-{&e. yֶDOxNkR fj}^AqK=X߂-K'# KY63|#ߛkl` Obtr'>l\\5r,|\0[MDvgU IV<;\Dd2D;QSI-AvkTe2w*qr]6w}We꒭lcLlI'` 8`  xJȃI0O~tc˽*{jW딝o=wHZU2C;w=g>~|wcDޑSv`6qvtEHvNΕevώ3TIgi Ȑ iQ znhTx<>YREebt&'=Ji__kT'3^Q BI/rg_wvF,cw06 zRO_T#DAbkdS}]1c})˫;B$$Uj@(7 %'shm*Uy*QD%JɈc~hl,*k۶m;v.E)#P Rr4 k0q^ٳϟ?k֬y,I${rVa~R_khh04lbL^bГ'- X<˗/gd*ڲe=~r 6H;TۯTS\YXBW@m1(&#>nH~ .n8urYVŢ뺱&$I2qKff0LF*TաOnOY!>N:E05dv֗jϏϸ3ιR5)zU5n#{Ig2ԧE;hNKiuf$CPH\w;@eO!y@M}݊zY{X=\Ϧl+ Fek<~o^NP9ʳ^OX"APxc/4g$&+1Ç !$9^;ll<p۪=z@N%j6%7d2 C2)ÌMnSϥ,m+'Q#G{4P鵮XP%SO-]C#xo/WTLo`ݑ#/*ŎI-/(w>Uf*bB15 kb`X--- ,hhh| xi9eN7aehXx'.ʴ2 &*3_Ȏ;\bi2r3d"0- `͢/}Su65ni03'RE +QD%JQP?P8x1v~k׮]jUss3òG{^c~I1~v1՟:kzg4FaɁueЕڤL$1%D3S 1JYkwH_=H8p;5# z1OC皬kX|>!`R)Y+dfhM©gy4v\<.^B6AҤX5b@Zt`s XNj5cccCCCHϨ&D<2,jF(S#ӛ*z!3.?&D P-^ǻ#",Sp[Fn qiu&;'Z+*Tvʪk2%JHBp!A/^ o<҄R8S=4n! 'Ntvvjgc螪Nw` R1xyʆXh*#:.YP, E:F;!dΜ9(2 c t^f!SbQT΢X7Y%s ŌWJ! |(=vXϞ#jZ3R7崉RY#<@bjDJ(j9c|hq0 G4r6`~H*+n X[F(E",C;[vYfq{uQT&`{px4VOOi&0J뇒m~K3=mDD"q#tn% 6 %`NȄU(b"5"[஛p4^{U lRf_F@+PԣO 5U6t: k<. Ӯɞh_V7yVsg~\VR$+de,Fѫf* XnΨ1K:,4 l8K$MtM4a, ׉c0-/ V ,B&=LNP( ;=Գ!4*D8&59\;Oxjkk .{-fh@y9% '7tIrӣ aB *„ Z 4V$[om{xx8TI2J::0L$jcӬFZ妜SƜdV D"cwVC4S@}teZ*2aE^@DŚ94Jyܯl6x"q!p/"`x;RD.+Pbur1&!4~'" eTSMD sXҾ>Mz{{ݫ gX1!`BzF F!gXBA# -&fh8_ṩ2R2 @x(&lDIinP=dga9rPLt)P1&Fm2m&m릡p{L"HXeʁ!P^^^QQr7Y:zn;Ds0 =n3F 1UUev Rݝth<;Q`FC4Xw")b) S9цiK\e8^4G4; MX  T^RK* ϮxcP\6"F`$N2k-.)+R+D8H r`yrs{J~Gy;U⏂3\* UXr2b98@Bh(S=RJI8*Ys ld2fxr `2dp`3X`Zs Q E5$&Ex'=; qDQ$ R׸gxf|g~|~6>uJ, 1ɨx ygЏ6.9{n۶mNïܴl^C7|GuE+_gaufzhۤ=  ,+*ӁP,Y0V|)b6hxM-'C5#[ɾwϤch;׵*qoڠ4 #,h:w9 CrDp`Cy€$:M%U0L+  kfJ01sm?r/Gېߵ!O5G Q)SϽcؿU~(T!`퉜MP[y>[j1z~x\~{,/d,Aunɾcykfrc\.7*nH TϞq(QD%u rw2Or%<ߥS9ΐhw@7@?뷩o%7ʴU󛑏{DZ~4R9>C u,9 /:z3Cc `nCr`:cXJ>ݯ<]F>/7J@ZaY@E˦"z[n̙6Z塇>~}s?я~wc%}KpڷB]4MRhPPl9<@Xnn qZ(I‘~dz1#L?P&XDv4sz/ZN ݡD9/Ԕ9~%0Vm4i=4Q `S|X-^gt8e fv:/zEt^ZuYԱ٩qBl2_ ee@䓣ephB($pTI Bp r f2ywcSp1tt4>5XӖCq*B0[&.@ .w^1"3zDSvTƂR}V#hfDr2 UΖ:5!v*i.BD"a(b=U@y`(TUe߿(;G{[ F^PF:sI)h9GEO$wrTi˴[K69^ gspx|$×Y4 FM|< '@t2,[e3|+U6 3 vR+T ќ ~{ @-|lѭP=]k"wU.u.HcXqf޺%J(Q`o@S $-#܌Ťf56A3:› !$h)WamU4Mx%ռPiVmMbhD9-v3T@$?n~hvwXr/|bTgfMGz:iX0 A5 S\dU!2̦OlQҞt l=tEL!FS #;:TY GCjJAmphou]X+:0|eܶX!['/'x},J-Ϣ/~yEc;wY+29?rTl"`tҩx|Sb1S CVfP@RsS+BˋJٕE~i 'pf啧FMԐPx\23ĒgDYcmVK"aדHl6Jq*ljbcWx.xvNcK5.ߚF.:1*eӬϊX,?oyr2?#=ܫz~ѓwf9X$+{˫kܻ+Ɗ+Vӽ(q&KoWV6M7߷@M c5/eߟ]g{ˬPg@ "j<#ٽֵw-?d:G5M{o7> _πp!BzzFϲz8uyE@ʷ-ݾ2ĕ(QD0Wdr~T?xm ܊J<ֺ-r@;*KG^9 ^n{SCUc'ɰi{22R3:}u)*g&5ZM r#GS_Mu޳;y5sz{ ztKSSw[pǍu ϟ]5S߼rVKS:(f]b2)IFA,~He-"5}cJ3&*d)NB='k7ʄIyB~+_U83.G[?$`SSkzϒH]$#ߴc ]MUtNKfhF|0mmm 8|XfQ~NE{q۞#M PWb\:**Zfբoc')YxB_̮Ǹ N;vFZ5 'T]6:f;u]yu蘻}(us-CZVUxґguMqvea;}W [w zSXpUpjlG,P˟ ( .R`FI `Ѵ޳KZ$vɆ&OcPJjlnRop|io굕홼s,H[Y$]nJAXp 6:_y4vpƣ[f)kxB/>DІF6m-F1±Bd3/gݹpd$Ӵ`NDhѱ-Ί)5'cK J 5$%[99 UDP{}t]e:J{N K]Ho RW Ëph߸{m9Q ڂ,kV,yWt϶b?4kid``@kCCcc%\Z*QD%fL] o~6[9rܔ u uչi:]`7Fkw>XH*}Qa6,?utP0е+1ѾrBXdMsz]7Tm~fO$p vS?W]RSD*%レ'>igʙr$A%1/Fl zW#}\7Y* |sgR'94@ZiVDMݥgs527ooVV^r *cKZ׮$+\扔x[1^L \H:p^VyLݰ'ځ죟\B4 y{GsYxl}m?mMD$DƋI41,|" @2-pX4*?8pITnЬf[w۝k:hGl>vuXz0*@rϴբ g$7؂W\+JBl YS@cep9RGx<T!5 2,cimmV;_?Dn\@N' $8Z* j2i=m!.%Ntӗ*`1 vgϞ=1|6HBH⬷,q1}IkoSGT$Wg`xLY#DX]V_4ݹ°JP\6oQ9 T% @, iݚ\HT(Q-ĕrCWLg:s-"W(XFƥ*GU͇+̪ciunJF3?2@*#&Ma;n^  dwcSD%JR\伫b6^Q<<^Y ж *#` &[l.w26 cn_6s]z\LZoL V~V@}-=ƾt# !,Cϫ gtE ٳ!UӷPg<LJ~zpg?ȘLN] ֠IƦf*w;v `ddtN9kVVVfBIOPhBdBF֓O>z Wbvg֯_vkvªu a.SJr4UXf__p @lX%;DyOOO(>OQcB@2k"EbQ xS De'dcccySSP(z#(tap0AP(öӷ{󞧞z* *|w{tm?>~ۏ?'? !?Ofʕ+޿DyyՉW~fPC7z>vC T}k7x=";F}ґT*jBi@ ϵ~vQF%gt`'bǺ#%2E[B=h\NB rX[9 a)RmhE@,rCu[\95:^y,T.^L6YgMb0} ˉ F;Yb!"[xMKJ"-p5G!HKA UN5e2r؊ ' 5>Ʃ.kWl R%'O=ՕWfIa },&M+J2 K&DŽKٰzbzky&@gDSςnn"XAz*v$S#ؙpT&cI*&w ``XZG 8-,P"ő.ڠ4 Pkr>88k׮T*?G-IQG]]]s*8J)~ TIBOϨY`TU B+pMRq,2 4, ʤyZ3TRۺ)0H#a0"E ?y?y7>[ZTUㇷpuJs<{0='s<k}w\u >wΣۃ,*E[X͍ccџ>0~ ILDeYlosD.p`exXW^7c[,kvvvn߾}ɒ%W@6?OnQett>ONw`mذ7ވD"wq}5[ !ųt6YlU) yW, fͤ=ᾨϝK!Zz6j'qkҐryI0+]DULIi 0h_l>TTJJ7`Y&Bh( THe,D'EIj\dEcEU$:E&]4s*d:QP'E#ÄjʁbBf_NE'AhMM0_1>hyg@hlWA4BMýhJలo{!`A1XD8;NCEc=$;kS9NOONM4Fx$ #0國9ۇ`χQ@9&IcwOʵ{?ꞞF&F>uWڵkݵ֣>Tw~]Qm! W.j @og c Ifhc 42* N??R_Kl4-N{_%Vx^x%}u\Ł:^4ly:.JO~٬,5;cq>wK;><<;zſIM=Knj3[N|6~?뭿} =QrJ tO?x>yuu~eEGfg?uo(Hǻڶ\34GԵDQ|2욯B8Yx9L`d"72<^캵:C'́yH֖S3N !w x|8:2B}~1W7_ޛo[Y|Ʈ?͝a@(IfDX#S```$|Ŋο$L/kzX㜣n^3먣:cA,XK)3 ZYhHp.Vi ÷l7~\{hV{,etL q\FBFz߹Z*_ KRͽ}R}hP}nEU x]>4liFO[7iP@­_kcV>Q7LJv8O500pرCxwYkTN;mɬ'~iH H%[Ep۲GJ){zz>'wP̜aRJ55k}ݧOm[Jy]ws=6`0X(MuUo({sUk#+ 8<qe&=aͻ~,_|bbh 9#aqisToph,9~:L M6`wdbb i[j}KZ'#Yڣc%ͰQRʬlcO d`մ) roH0nD9KH+DmqCA#44t!.OagXcA TX2H鈕9Ebi@j7ڝLYVw&``$-ߨ#Sym[?}>3X.Kgf VI̻J(@_߻hYol+aP_^hTJ1憠i9#9TizzzTUJg*%|"ו:ꨣ: lq`0lٲjޅ_}-͆_ºlh"wLAi MڗOM%54*8@2#Bݸ>&GŒG!g(>@agbMdzeѓtGԿt$m_$S&ܩcMC^Ģho_{}]:w%@;X j |>_,7d)P~ٟxd&l"씲#©S!mۉDbɒ%^"O.)gÔsjz`5U/wqǻ[n%J.˴l3;;ݸ)('O7G 0)'&>6O5?ҒH$F'2@C|zE%jm I%T:oTdW҈v):66:V[)>Aw^?bQ*SЌ]xq0 |i:`+ )ͥPh^McY7 L@E< .ٔxL~)o>cǁX恖՝xYZa81EYK`=쀔\%_wnz}g!&5^r,‹TYj&TNo8"TUso9+ۅΞHPt\'xS`I &tMx 5~i[( Ԃ`խe21dZXPdzz.ª˔a|+qP'^W 'xmu\ȨŁ:^4r*F(B8#Aknkn}TJwuw#/xׯGL)d=/?x*X3)% p')Ԁh 3~~ʝeϒ#h<o8GT,Ҝ"z l5EBƹN {ڽ}Kv-uaub,M=r8?l愢>/O !׭zRyU@jj;-S|.o{ KE]UG->ٳ'RX݇/`3 r}[oʫcȷ6ݶ_WWײe˨j ;0:2Y!U:8-/:Jqr}q讲xb:?:ZKn/G3R*-}%3U<KEQL3\RWN_5#=*'@Pj5`P2+ ѐs%*X'n,}=sO1lƲ@cn6F$UUӯ/u|K;K`=L?-AʹcC|5|7cl*C8ϊZҸ $.5 *P-{kx4%9aFuVOe ˕J0M{oG(蟷'ȒŅ6oZV 55*| j ,&jBܽ0,OyP8@7uE`mݺW}uP_Njuhp/ sǓ ۮN\*"쎤SʲUsͱ ?~8Ү\h/齵FE 5P"}v2 hkno5pvъ+bi^ opɦ*PJX_I`ܩ+QIr`Rzn{R)0EI&Gol }6.ʿqm: dȑQ'g~]{Rkk auZw:/V.+&% C)dQ8bN@԰VSZai=aS 1=%au-o_y<HMa46aQ6źܙC`zg5YR e,ŋb]]]`*g`Ku "P ⺸06NXҊ )1pIl`Q:xR w;D7:k54Ul^֙>>'s:Ng]i'f3EP3{BZy1 =}YLDqCl!i jEx֑"h B.cErJTˡl<; a%i]zɚ/|}㰐tKY\p?zot#-[#=N y 9WxĜ8RJUUG:ꨣ:8 Ź뺅BW<ּs[_הÅچ8l\e߻yIL?$h<$g2? NC!|> z;j$ZHiJ@PUqm7Ȍ ʝ+Öo p.[%4n{U4 4?U^{၁ZD,"wv>N;P%1Ha߉X֎B?J 7LwuV:EK(X^X[]U0/g;W/+y]ܽ{7GvYI3-T7:PEZ MyO7Kf\5: /i}jh5% *!t#"-X'vY>\L+w++$  ka˔VZM![h , ,Nj?94GeJ4Ma۶WG`y_ꨣ:cATl63 qMOޫ&?Ѝ=i詼#TZ̊kWoAh *VPÝBr3.PIׅV|߁k "K东i.py,۴zۖ:~@ZH Һ aX1 RQ`( Jv~lk7ωjVUE 4h H<Y,Yh_-uS`8{#h<*tgUU%۫NpNP_Njuhp/e8ZDRJh4*^Dz~۶'''9~GL_B X^;/l@yv[zު:NȯvwO<,%OeijHzߩ䕎+ t ,:Hu2ɤ"Q'P{C7){ $\ZpiLgʷ]]= ŮK/t3ϟゆ4]bbhާzq󲆩Ѐ}|ܗ:SGRS{{ˊ%hW,Q)+|_:UGu' ލkcc7Y(K# |t2(5iBUPJ5K~ G}BO`5ofįɱӮ$-.Er3n(!pes&r) D_c 8FBv'>yDͭTJ`QVXs쇹B@u-= a *~@GlDD⋻/0S4)#6%%gЂruoNu>hcv6G`X%0ԛ]r;/} K"4UڧӶ>'Os|kfDZKeWv@c> c`A) 嫔uuD G`ZbBy!Yє8scoXB8L`oW@)\UqLy1U:rqgLӔS}S>*6eYLrRq?;. xq .+r˖-V:sutt_rgS?|j꺍-@AE  rRAh|8 C] bS\]LЫD0$  K%ںu/K ; ̫9u^{EbI&@(p=<xBr]W\ ~@ZYgh@"^-F\[@iәN.YSNOD2Х"MB|vB/sE%Au!{6xWGMGӪ"<H-u"Hhb'}B4HZ88v͞5ʛJ"f,C$4] b:01WA'F F#fUƆg49P=$.,XM+ej@z|(f`a-^5қ⋺@0c9Lf`U+ +}yuYopdk(tl ش\ +/Rt)GfN%,i\rã[o~)XFwv':rz}oQYUb5'&DmG{_X:Zsλ=4aQNI@T:gn)8.̙rQa4t'~CQ @ʞ20LMXV[S1Y IDATΫÓEc@pmZ%A2m1x??43;aWWE^UBo{lQ8:T̛Jȯx{ۈ.n2 .`ͰB-mU8K>*Z Ȋp%r}G8hdP6.4Yqڔ{:GVSa$l7' n5kˆ `ZaUM3;3XY۰drV\2 nZc,ˆ}+s l! 3/tLVe3C2|AAa^k Un58a=UK 8Iܝ;]M^/xg_ +OKoRUUuuWz{uQGu#k1/}|"44Oy[,+UO'UI*(o@xC60<8j!fl Xz*A @UtrS.8#;܉g,g~g^9~s'v3nGvOy.FV2_?Q?XxFiܼu y|9N+ZoZW9K.5u+2?~K=۹s u뗄zz!WwX?2G`(nOvca Tɔ G|>ٟ_?Thnw޹D~He@wsW>7oZ68F$M \X ,/逩-RU`Bl!rXfNCRѐPd6P .k[;XEմe H*8VfJ Z*DXeqZG}/EXrgvlߺ!Mnqs9(sdpi5NϜ N?.p_rI\K`98+>T2B"ШCJlG`%e`ĚZRq-g^7p=JCUʣw3v6;BH,i ;1JP%.y;;Tu6uęFI%q銮r) ̤bEM5}THwzvGPYy"|\lY0b7tCUܻw7 >B|>?H455}SR ;1*144twF"ŋ<:XoKc}G,ۍ\,.HsBk ,M;&A?]@Gs) wMu:Y:})yrHQ q\-,j-js^j4P" noa6f +P` gt!(wrgNG,JL'S3e1&YM<^WG?"L^{JUJr\PH/{_Q:F ~ՇPu8P_NjRVW.ͦi*cm㺮 =(˻7+&Xßol2?4:l^AX%i>WzT$ k- >a-9`9GQԋA$vJ vC;n ,;/K(y~y؈kG>nHtdn; ([xֲ#IdRUf+_VfJ֜kؙ&i[5V]ރmsgM.4aCﮙTD΃N`tUW?~ܛ|_~ѝ;wܹn|WoڴiddG>u\p'˻:8Ts2X&=g\IrSѥP*[S֥]k={_g>i9ӽRyuEWޮ4nڲ8i/|O>ﶶ %)uWq|G]Q qG7 &G)[K! TpkS5;R @Hi)M' JBSu?Jm5# E]Uޮvު-} 9uKnrk("5<=:0m9rQcie[S^1XV&U3Ke\.3iTG -iC FH杷_.$k>АwH$7o>}cЇ_T*U w _Wn??{_w|ԩSp6o8T*5==} ~hhh/]\zW<d*iKvPQVfSe@"d؀1s,vVl\>{޶^'q'Gv4,>_2)6/wwUqSDU! 39@Scx:jN-k.J !wm9bێ:.(:N =J9R%W3 BM!)B g`cit˶- 5ƽ ?zr䑃u)ƱClX&M+ˆK++t{ocR5RD}%˛cL+kwSk!̸ :c29)zWizZ]{b@x`@l\)f9!%`e}5DVNMDjbu]W--5]SiL!@;k>PoSXUV|{ X'ch<[(bw Ϲ1|>+ v6oGF4L-x:jO߀C'᫖3%ey')b^ܰ_$.{8V^O|ⳟlٗ?_Ȼ?g׷՟׮]jYn݉'j bzzy] X ^E4xh/&+(4Ҹe{t0y-Uqsы) GZZ[<d:=#W_4CO} pۥ3$H3 V D.%uWTL/j))GuAPZ@#x]s.d` E5q̲R؎wE{aٷic#znb/v0 ];MK`79 A=S)ti:qd?|2[2%X%{$t!z9qɑ~+- E:ea[H?p' rep ŰyҎEhѢ?2,ҲOY=DhPqDTvѧK$`uƎk^.0ṶiǏH&QGuQ^yX) S%l):SwJwʼn`f> T>f ڪbMMPS|Ma4kR`Ni pTS1^x!B85 Ȝ^5#9H \f",Ac ,pG'#9`U[ћE?:'S:uĉ-~XV4Zdؙ7[#+z3?;Z,KsC!K2QTblkʦܟ/.{8o_tioo-[n۷0loo}dޯ'H:]ɟɡCo-_< +>/ UX' US@z7ăfCc~ Ӓy OK6B mYY^<0+=rP Klk~ r9u v5JxV) XZ٧fI[VoY۱mSzN}~`qKm/< !ECHG:B o=p6},kJ'cJvS`ųM-rr}ʮZ̸}/q:iqd_0ՙ<67׈g|WɁ1BfFemq1Ui=|*Y2o|̿ٲih<+%>S[?,O>h Yzg=3X966~榯ؓc֊R5=܍}A/= mͮ?E/X$--. /^T*:tgp?c6MMM###ϚV ,;=_t7XT}<\=x!Ue`yfG`S9 0"O lGzgcLO-yغu3ֹ2dǂks5Q=ؚKT"eiBթ_,}Ë_R4@'|`4sYì.H`b1UU٬ig˪.s9Yt: :^E~)JvQdzjQ`ٶ-4%I@> ' Jt0NEA yM¾Z_bP'HgH.6K`sx?Y< +F季$BN*JS -rGdi Du<1it+1Az@M``430ִ#`"d'sT< vvvð<:+(grѨ\Bᑎr]*O8̩Umofy褽gsv(4T,CR 9 )]|ׯ;ߙ{o}[ B7W:ꘇr+zX4ʊ-_ӭf]qxԧ*dF 8Aջ%v]hvrΓҰz5zj0pv[ӊKw,qU SX5Et:ȯT&5Gu;ϊt(P/'1|RUts (gv.cdg,@Y\*iqsPW"LiYҾq0Q@0PW鋣A]ཽN?JH%5\j\nw<̰]uM]>n eQ]sP*Z77G Iǟ2T *5m7nTD< ´JY9K`@\'Rw:MDlҸID 0?.-д𫎌WMi gG2i8 YRyȑ|XGuQGe)*WH`Yu!Eȓ#žF@'J0ޭCׯf^Owާ YmضcF㹰_|RS*usZvpU}KK92DWRݨ,cS<ȗ@]F,"l?87ThΘ<>ə] 9bc$%ʬVu@ e˖%K477RCi~iyJNjV| K#dl޾E}5WR6 Ve5h5\ лxՇdFJNp덺05aM)@1).(cي#ٱXNq2`wL]ݵ==+$@pgΜV߮~MR6aYj~G-Se S VZf%k> ] 񂐥U>^I%|"f^6&J"d5JFVqpKH Ue.\SuW-jOMBxR*\<;X==4v\@ :U^̲\2{"fJ@rQ0Y>7C| l,C(xNn*llPPəD{kZ{}s-\`:xx`UݻfW]FomqUlKs Ü#rELYPD2L˂D*PȐ=cXQo)@}yOu~sPw~tg.D T|>] ,XlH/pӐdTOT`ZdhW++ YK @C DmlDžguXxNXqaGau4y?1V}rJ$҉Ё0.Nqp`E&)-o*!Z]PN0-n_a.cӱܐ0ODЅD\jEw6zC[Tn7V3%j""S[  Ϛ\/#j+0khj{v_Q lmW Dk"j[qK+$#ȩS&''cXww(c"6#455MOOONNׯy[*Q~mptd Y* "h[~LK_K.`bDJNK\ȰLBam$4IuDp";;=.Y^ RZj$@`ae$, "5t 13RcX!)%.ram*}miP#l͚6M᫗f3}ǙՂPE/}7p~/̳i3j+H+Y`̜XWYԷd8 (MyȍC]Qg(./!k6^P%|A0^}/~~7* R7#ưLf/JB[LӀԄ@@$@xBm[:_KKGʛm啕sEp2@PS]% WAuk|DaX!K{Vf*DWD-b yC|qy*}g{X:/qSVR{Z(VX]|:d6[E_īX;?kpx```||Y#8Xv[B`4|]u4)cU a% ߏ`kcpYLf>%$53S#lIC 6|D?:-xlrh`dF)б(&=aQQS[UݪŤCi'm_ ϟ^.-}?ӹ{ɧEWjj{e$qk9i(f٢Y@iJ9ݺY!ρs \Ip~*7g~wOO'|UEK&wn Sa(< ʛg+%hÂA c k ,2@WͿm-~O>A}%11<4(UڰW&aIx2݊97Ϭ= KL+X~ h ңӽt2#HkpAX>f/B$]ܲr)wh% 1} ]I<KPBADȐj=L`רc@ik;4Bވ`=}e R龇iϪ֮`㻰'm([:FX/ٯ<dzpa\sǿzrOne)\&PQ/I?7IZQn>ȚΞ=J۸**niyMt]|rk)s j5=-wZ/\\Fm_>2=K>eVRX+:&Kta:IwSmU"\ZbpQ<;XNp(Ӳ㋼r !"H^A`!#lag' )Gr~X,?=VܿYc-]w/pF#;GrsbC`3@1sڒCEtpe̊\,h O?߭u! &rK%:({gy+<}u6X"C;)`ppQth<Ӏr?hZRx@ 禰%&PYsinj7XyvqE!)[hy: +:Z\?k3iceD+ o[dy#YNd[).7ǬWe _;N5FSI~ƹڔ&w4X T]$[H:{Ϋl .7PrX瀍qTSǤC0`dHR@N: ,F!ô xLBUYDkUU)K #K6]קϞ={wMG*[eq1NMM i@Xs&"|e[6v||1]lt-DW-7eK|"}MPPX!VE  &єb~ W|⴦ܦŎ;ATFT@@LH) KH@MĹy U&:JjBw^ط_L`氄rX%Fn1K_ASf&S`Ub7s=P@8,HMKMw[Bv8oI)Ѽ>Ď줓Z9x6S`QW:aui *4 1rPe+|; !c1FtՖ-[|>_X=ܫj?m[+˕˲m۞-V?:\1[W<x[B HD5 G /+R#fAZ9K꯮r^,9낪"$qYC f4OW>ăD9BL ,,h.[ΜjRWDy~z x1ye*lt]Lَ!a nf`g$΍8>"li \Vq+WߨהBX#Aio$yLe wp3 ,W`Re'p-BʕX|I%=*_}Qf& 6s= +K*zǥ $rϤJ (y)r\IP ,Tj~:E=w//|s|.3-vPXL46WHNP%w5!+eX,Q`m ʕ ,c!gx) ӫx`ZĄ5bYGE\cg75!XXeUi-ikk B[Q@oT-ݕk&ݻ}vI)MӦi V`upnj9=`:8Uǯxd{O `$JbPʅԲD]N RL`Bt6H2KE@XN?6 ]lA`iKzrQÎv=<8[޹tq7rӟH|#DYg"SV_O}驎Fm7uc&' r<@Zsd9(T@Mqa:/1Km7Ru?UQED yD`عa< #R}Ҷ|}Rȧ'H-ݶ֯u[ymIj`ZT 5Lǯ6>$IڶI`U744f2cǎl6Nq*Ri]].&QTO tz||nYkkkM l333jkkn={p8H$DraUp-k/-$U&ş{hdq_OMkž;ZRM笑vkㆅ04#S=s✐p)ȗHŬEaV $Zkʔ>3uUnssmHE%Za j~kU!=`u|v&]-!ᑅz勿7B|֥$ܸX3K#/{ZÅ 1_hܽOb2MٻڷF-֥iO~F˿tD~ByGlnœ\mh dm&2bM#D-D9.r3 {Ec^ЏY]n_mDC\cOn`_5[= l:uDڂEYRwQWo=I0pUJcZz' OO,0peZu~N%6s.F3 (nRuBKDXo9,Z@`7ئȋ%Xۥ¹BX /˯F]Oh5V;G}\z Ž0>^'>/O.raWZzo,XĵȯDW:)03<hN<$S</@Bоzi6v 5/xZé\6ibg5ycS0.R]|z)]]]ػwo[[磔r (y{ڏ:t]r$uvv||>ܹiUܸKRJiWWWKKJRCCCT*]r(!H\tiqqQߤR#G;vs .DL&5snf$T?g^˟w<^-\RӃi*L8<5 +d N4`f!W2vɧҶH2#u XX]Dz((X)cn %rc6/_o[~j^ P0Zgfno HLŴh_Exn%w8S # /=1׳K]5>7mU 7Ƅ1PSpNOuWr,L[&'6? ,pޟz}7H ri/~Bv# P%SЫ`b5A IDATb}KL&3>>^A`v(wא‚\@%hI69uX"ijai49!)GZ܎-;Prņ2i"o^ڔ-R E|gy^m]Iy|Z6C{E$SW>zAqWDz0a=KY|OX"'YKt2Lz6X<Plnhy\%޻'>IA\|%ՠ]5M9+}*x:(mmq&g闱)UkX z{{܊Vu=P[i&IB޽{瞮h4w^UUSQMwINMMq:;;٣j:>yٳg/_H$8|~pGGGs={oKK{<|nw":߿fpe4IIcco#_X6fz4eRG˻ @72EbHD#I Y\c{n} f?(i ɭyۉZ Nc\{k;!$sGxw`l]La4NTtK5U͆/. K2 J8[8;[~' djCWLc2 W8P_497X3sI19U, > rLN$8! !ӿDJS¾v]OY1$s*mDBU*x?x`#bA)mkkkll<7a$V$buYlK3{ѣޗ*mLyG O|t^[^@&y8( !NT2s ۶&H!$҇?y-p_}Ԉ4h0Cf6keXFiwX92tdHxI[NjBiiy{Wy؀[=T`%M%h)fL2fp(@=V̲ , l\@!@UH3aL$?y0/p#uM0q|,'w ([h4 ,˽FGG5R'Ah:U<;::EȩSN8ޜi.\8qΩinvw}_skoolsVJgo~} _x??9wYf΋Ł~AQ\*˅Bu^*mTe][k raReLIft9|YPE)@8ǔ_x&7j[yn l J; R<3 VnS5@6 C)ۚMZ60_x155Klkߙtf)ǒ??ώH6yE5]lsj񈤻hN  nNa9~(Zo;VUT .w``௞Oiv$B]1煰ׇ$6{~K1|_}s5] \[W #c(į\ՈM%x0 iSBZW4ҹXTJ&N!H=,|h{A/#O6/~:jN1-pd!,gRXQP@ P|H> C{[H?K}mP(Abc{i 1zSWe8eJ ,X(݄s؃F޼¯n/ٟ+*i]C +AoV!'\hv,KSxUT*(ZA`݊ *}G<P__byCCC45MGΜ9cvSSSY @Q۷뺞JK Dȑ#333L@ww7EU5C_7:s“w/ڒѕN!UKI ,@ m nAt8yX78c4JrK"D^}@gDp3C9w=ʽ 'B<橵Use`2p|t6-=X~&UYUCCkr$U;~uEVtnB!L@#5cUϠUV=Ƌ-$}}N  ȩtӂZI˼s{%8ݭrXBH2xާJGnVɉCBJ]{M^P"P¨9U2,_N;(DφO?}k5Q`ḟ6um@"^ GCօjϾ^) ZX+]@25cӡ/ul$ ,dJzE މ"Jz#/@&~ ̕>$J&XΪUW%j?޺CeJl&47}?}pJ GekiEDŹsI++)LΞf w^p B%n`CI% vm>;͓HY&o],SÇϜ9344T,cjJN:[oR<Ϻ/^8|pc~=܈KR FFPP;ܶm[OOj"l޲eK4D6᛾ 'm-KSDo37UC|+S45&XLAd\1 $Lܡ",˶HQ|'֚"L~TCbm00xNД6xe͟w-UA/Jn.p;У V>`KGU;wlkyx{Ktn0aˌ/dBFw.0+&iY*xCӧm9յ੡@MSS+k|6P/E<9m܈  rD"Íq;tХKD79v~7w 8%F(FUn<nu.on9}Ki?v,:@>af|4ԷG ;̷^<ǵT3<'d!DR6ϑ.6XQʩ4| |q)Ii&"@jbף @6!<1_ oN(rcʊˍhQ]n#py_e`hV)L^:)F Z/`'~m t5>^@HQJU`R@Qr4rwq|0wWZnjЭH`UG~|d2T}U x*kcWWiD@8noou4D"Q(!>|1rutt8NC sBHX޻w:!x6`Džd1&ZUj܈KRtƃFFX.Fp>eq) 42X!h`T,'˲ x^ԍ I8 ,XkWz~NXƒk>uo2 I$* ҆v\.`L/o@ʳ"`q\;Z~ﳼg_hL V`AEVv`>eT7X皁QM4s}@  ')C00ve&5 @VHcs}1 2R,Sf^-r:sRo}sO~+_?}>*L kb."A/̃YdGQBW e5Eԧ<ӟ|1c}cڅuIsi':oreD1lR-#-xrXV2(]iT* R&Lr* ?ea'vQ6R^C% !\so.g5'K/KнC:\G@P2S#vezv"`: B'8s]XMA [R;tDȯꥨB;,)J`gJ0=[/p*QgX(k`$b RbewϫbY ! MoE*0 UU3лcVb=!jΝúر.q ]׽^o f|ҥKuuu$ #G`ddD8zhOOOmmHSSSmBp%飣e֬b6eJ%n$IaYS,UFp̉ u(/XZ{F7ABf W[ ,Ɇ0qX)Z}wPWN7&Yk1 ;ET탧s1ة6.v7[XS#X#[y"\P9m!%[;˩Z# RL`2Rbl6Z[t zӧ;;l4u'yjȠx_p}i V&V 9s+$.ʲmHD Fc4 B_jCCç>*UE6N!uiS[#"~ f@`q撰v}0dC`޵sK,mЇ%A`"l\~ \Kyy$67 VDrk6n)&XOcjvةFq'Z4Hfy2F@g$yX{e l*+Xk!"Gh@LK vj1XNXPc>YUHRHdBFnǿMw&eY =U▀asssr\,xb###.]b 쬢(jfF0lii&ؤ +P_a,dfS %hk\f9Dg/69Z ŋ`Y)aod$Ik){sb{B0r/OW[o zf8؏ŹSYh0ǾX8mj< Xyr{РxmFXpQ=wvĢ2W~ǝu_[ռ->g5vm(J9ۑnIp XA'F,O7gЄk~4i-)B|-U3;!lXb7MӶb( ÈFUz5)P%%בr Y1T]cE H(ǔ@Q+ sYm̺V׏T- 1a/\ .H,ogK\\Dmj i!c  n,[ΧD蘟6s:i7J$|i*'^'%{I Jt !@AwO_Gdc@zq%tua%Ү-V8Y@VuollzWmMbc̶Mɬ8""h)3.]SW ,mL ʲҕ8槉%`SoS6,egX$ɲlYeYkn6TGS?2c7:r) 0AӴl6+y߿q/* ҏP(Rz]ݲgBq,y0.\prM [n-i6449[ٷn%XXnu}Xw #f3rt`=[`YE`(e5RH!r"b$x1K&҆Q:Xe.7N.;;WLͤ58#C-RǍsQ29<{Q?r8s4tmh뇌W0x>G>)dڌMR`H .;x+-jBM{~x'O#A% lJ;,xZmu;$&UHH8/!@}yKy^(`9 ,)$>9Q! '>qW׭Y _+⚕*_5WUP=BW=Be#>}sZ0 .@D\D|\ MW 3iͽʯ2Y7_{OO,2DUYe z$JgG΢dS193t:I`Թ Yz !.@[ܼIW IDAT?~"0x`a@{89g HSISF#387u;N׹yD͛b8˵.r$K("E`Ftlߝ~.@3{03gy~op˖֝;_9d15e S乆{*͞{e,ہEܧOVNj=k; o<$~v UD;X,ƨ@dP3֟B)џwlc7P*jjb1VٖDWj8Z6ȍ}ΞX,f%t%V魞[f#ӧOov5:[L 8ha4:H'zO_0z ^+V._asSwa%z#񻃉'dIKMy4Z;lj([ɕ"l̟OX; d1+fX/6YA_s=ُ<)P8)߆'O*ϟdb.ֲ8dZ(翭/ž}xw};kU3G}@ 9!GIYO~u#Q͑F$;Q2iȓa}ogG_{t^+}2ϸq䗩:hVj;ۿeUsciє7 wws*~U] Po8up_[PqP9sF|,ib~]cŎ6 n#wo_{뉧[ißLX`u]̯>1X%?ѣGge?~<nݺ@(rD" &c98篾j2]fʹ\tG_2O:U\\y/^QQA)=sؘصkw/iwyʲ\:]PW^ypR;mƍSLyy9f0=F^鏈uhS/wիo^w<Ztr(?y~8WCo7o7-;w4O%u}t [-X>}[zE3~ 20uk~'8<;ݖb,$2۽53Ύ^IG:0teۇ+@HI%TI1Pj ?$8N6֯_\< 1XӲC9 ,E)4mddd||̳&|Gu߽Qx0!ή2tL6DpD6S68) E&Y2`<%J(q- r0f:Ps]wI0i+JcmjŲa%KihQ#]j?YfSUYsC M:ڙW7SG۶ >u@ٞ;*ܚyOI)R -LxL@ 94 pm#︧a ,S|f`uuuOy1;7-xn~$+0AhWb;|߆Lc&82쪒+ C~fKaTg,d1JiTp) $ٮuR $յ$ʴ=X +'?ou4np@"*iXui$ @X`zKqb!X%DY̮@"H `{h:\FAea3?4mxxxXJi0m۶M696SN NwquiD"H$'WWuuu3f 6 l޼Z7>e1rX˕JA,jg\Ztw~Ew0!tuu XJ7:i,7Yj {%D+\C29wʷdGR]g74;vxS8pu$[A>}dfb\_NᡷBmz.StnSSD(F TGOʹ8Q+ & X+7_EVeHql d2N:Uʊ2%0D?nʛ#D}:>sԅІ`'|ldP s%djrS ej=}/%' D@?azg/]+! s(|<@| YUOvgڐ38WL PRτ~Sgh@ 祊ǣXPnwT􆥔NPo=ng~{UV%)`޶(\%oV8Z59&Ji&%^o߱cG0usM؍N:500`GFFᨬ& &,}#e8,_K4,4"Zgx<]vy<ۦ yS>V=Kis!ycmP)$Hfl=A !z͞{y)LѿD[B-cQ{  k.`G^xfQ(NY\u3AJjE֒n< +Kn2^FسW?xE@BSe2! 8f"maFsѿ|sWƣG똎(\ P NH`@ڡۦ߲&,s{_[I*vnZbD @0R,hHUbYp<_Γ8wT.!̩eX:& ELW$j&a֧ŽA꣠wO)8YτK9I r81[EӉO2dJ;%J28z~ F1Bj2;#`9-|>T%ퟷ~叾ɴOOQ_#[?=-E""+]h?})v#,\jKBs6$T$/OjW]s{a~|i_AG$7sZhLd'9* :uȑ#vˋh\g~4H8?RRd4 Ka^9uig/Eo}g/mjOY.sCWy c1P*d6UF͢rά9wѻP`^Lwt:9da"?88@b\_e";[sծKH<ru;v`kDq`L(J9̜U%$M.%%9s<`$fLe@A?ss`MRZRW18>cAS~Knkmc;nv`q B!bb0My;q2yF6M0Qz@ĊρD-q# ]b~+bF32>>>JnCs@bM3?:įfJ/z(xڹGǙ@x /?K*}&t9H$몛Ya^YہU׮sJ}7z/ M`:-.B"M:.-ee'[w5'|G~GlؒE9yM)/Ydצ;+!.KdsvCJݺf JooĒ֫jSS͛)iZ0 q>Q-Mg'<64^`l0`:}quu5qU?3FI&FR&g!nM T+ۅЗ,{\Ilgm'H]+e T Eg؟~ á(iOU%+ZKh@,W6E+*Ѣ.}8q{B#06[ہաw~JġDW޹2ge {^dSO@51Ԅt6vӼG@ȇJTݡw5{R:0 0f !jv`&RaSV Fri,s$\6Z XW\;?sJRR{ u C/šq.<_F*!@TJKg𶡡AH$q)ODG}^]]= !d֭$iƍsD B9Kbʭ B v(zt&;2ȓQ:l=; `JڳŸ.]6ܲ?$">pףL g羕y9'Gő+ {))~|;eQj)I.o{Ͱ:J|(pT5Lp઎5nc[ٱ6`QWUCI^lUHxݓ=1PXZy'OGf1tB" bf,I#‚ \=-r]uktlIӲ;0jENI%c&-+ RLj:t&q֊7Dd hUqQhi\$t˙ ,de\Cw5:!<UuX<۩x}(;*;_<}:֞_윝e32ñnݺX,z8bvrscEBY[ !9/F*8f`Ci>,0Ɂ"_@pТmbûfUw5]ѧv=*# Xp=5_u};+t/pFxecZ!myM+\l+U+K%ML^1n^Ң IDATK*]U,Czk*eO ؏OW{vjcg`KppmTwoѳquEtQqW.>PW*$`_?ij*W2I Uk8niKPQ (pMSB9e^>5`KBC[h`ɾdyf e>)__ $S;dQRI M\K< R4Ix 7Xf@>"):WX&c;lǞx 8ο n2`Z[[{{{}>JL)P`AXr*` k`s,|c.ڽ ,#F3_->NO#Hfǥ(M؆pP@v^q#79'bd̴{Qie_wIBH$02̴,;k{utƢS0]}~m8"˽kUD&S%2 ttͦ&tZ5+D'>ip(j([cDJM@@Js%D8]7UP8T*kXu`-Eʻ(P`Q6]4˲$IO]VCAW8Op3 K¹𧬟_x1vzh (!NEQSȴxadlҜua]XIti,]]y*'p`0? `.|}Yj jZ'cs1ϖ J(lO3eᱱ1P.2, E SJ>׮"a x+v[#' 锭h2\QSC~g<Hzw edvϬ<I0Gy4\n8*,Ն?چ{ߵ3ۧ>̞7B466H$4M;uT}}=,**,ٳsILӤʲ\__ z/g e9"q*5j5}-Vp䞉kUB藒t]Y/%?$-[*,|Y.TfCp?Bs_jdl ҥ7ݻ9[*D AjK8 8}iB@ڈ9  i*ͳ.!5m{vmӜ:ʊܯ:Q U ^x %>BJca+Ls6)jKɗǔg\)m.H!k{HDo_T/9l1B!g*Ԩ1z͞ ʻX](0/kiϜ9344FM[j-`)N& K"^q7nP*{;[%K@dGnD30>Rs`][E"2@,Y-{<WHAq,S=(,U=ک~cwxW]ȹ9RWeyӦM;wwuuuuu=z㪪jL&UUMh.^P+bW\ A[/mblq Â}-ֳ㤺Nسl3%L/g{Hrmܼup* 8HD3(m漟Ͼ `?0wi^/sމŤ< S$^ݟ[`>P70aŁ%`crlAP5j7XvV["xdn؄* K{/ |ֻKFn'3oH^nārO ϾnL0z|TȔsS.@Ji2-i޶XM6](0/lG݄nq&Mܵ3e;H8O&쓾Q[t  $ۅI(:jHa^gi–۩~\G^P*l"xK`aնb!ԇUܶ?ZU1 YSvxjiDpR"ݾ& 3rXDߏ(EeNAWB%BzzfA*P39+'`B! NpLXSl G"x,')OX )xd&gV\^ KH \$J~$&.-B<-4^SOƁuPMek Ǻ{Oey˖-655i=.BW7)+WZVqq }U;{V:2oK-*x&G`%<J2&><[r_b)#:MCA*PpY˾$zMH/1H;?vϡ$t8y"3,u>M&Nd,²fp2 ?%@VX!Bmދ;Ke]S~1}yVfOʗtzBW75+WZVP$[-vZit :ï^՚o۠w{jZ.+r 9rX>#$I~nĹ%r?=j{~kߛWٮqݰZFq J~9= a^ sc|2>(Ԍ"BE|o^u`f^|l9@dHIBcaH>c! IQʅ;^)MQ2s`EDT8E0 !)?ц -.Yy~ bW,ZRaqCEW%2祗^ѻP`^yRɄiʲl[ۇR& lQȺ žqvNgI&.-`ADs,;@&"{撘a] MrJY؊R?n[B6o(O|0g d2fQӲ܆XhaUn1@z2?^B~}n f\;fBBX&k=aoxš ܰ__|>J>0SޘzX ,QM_=#';Gɳ]ZJRXc;JUeq[B 7\ ԓqJj^MB83 8"`IXYk9vj%ݸfeRMH߳9;IU: NJ+xR?{!",F <%1@5"8r&g*$w<Jb!fP'*G.ͣZm `X`v}w'v߶_y<鱳*=ў&͕`vl??9ε@/u'],+3 8fPT$ŸVp<4,e.%ȅnnWw>pz<ŋ3ڠ^ZvCY`NqӁXf7E=0y [y*aL౽GSblqX`+< Mb q!y' ݏ1Tpp돟Ƅ+>卹 ZG*;K %3i,rq]ч-yOJ|EqqheG5yl a> %Ͷa uXg;7 D^ħ;K+Éb G4L4n\ Z !P 5=RVցX)LHn,g׿b y+|mפ'C%888;d^`-ަ Ve;N+`ݲ*MOEc?oFi2l9p"/]}*8z3יc|?u^y2aqyW[Zch \VO*/O^a4q`\BhCp!&`6UJ̷u;6V&&`\vw֕9B>hDjJEð-!4ӒH[;Cm)ݳI^ { K1Ҳ8v;.ަ X ~eńcj@- L8,]dk~Ggvg× $nPē+0ȯkvS<~7!!+`7mzB=^9=ovm./vOY pZzVKFjeW\WXRE#CCݕ64Ob#LMe'TGŶu81WG/gg( D[ok?&T4xq*T)JIjECx2ZOa9wW FX$JEl$=N SӜ3_zt`$/#hpA*99LIvG 7֕"aˍU>-LF}0@gfRV)?_NT))_/aM .jŊVU`9}ޅ¶CSd2 'cS"%S,@h\0ɁH2iw|9JfǛe8!T%dP\ĥQO'?/>Mử~_}iV5 X㘗K|!')?Gv?ŗs Bg`HN%ʱ/=$;{wn߷u;jGݗۑgZq,{S}#N';l j /ͬ JNhYMӠ$ (T evOi`CV'ԅ0ۅ`1+:nBjZ]Ty=,n2?R:eEpf90i]U%*  aZ2gO+*0 /2YV9]E8ł: `W(8 ,8uuu_4Mιt=/*Gyo_օO, @Xl;u^1g9j Xa9 ;MF%Nƹ!kMn>/>Wq Xq( ̞1d`q= <L~uuNm$86\Pr{x|xd"/ \6Q^mY@D\asW.k@;z n.9qvƪ]'OB=xo,MHdd Z q"^ycg?_uH@ !3Dm]c֗ J0bˈ!^Sŕ)W)6!.HL%% Z:Is I 9^V`]êm@@[Cm#A7gκZ\Eܤ6PZ<1q|ǎ˼v; v@Κb nFv[Ԛ `X`ezcɓ'+`qԓqqΫ)g+a]pH=r@KD3s)Q/K"rGw%" M2J+Y{S$(dC;=ǟ=?E7NZ e8Hǁ:Xy2_>6">e9dt_hO R_t],o8\_2@ W%09_%T]9gipcF4}* n&' mK3'%9S<yl][vcD ⤽WckhCm/@K8*oz'TnI%%``\V4)A 5_o%83S?8k  HyׁO.7=׋.h.HGj>)F@;^LcJ=B|@ =)T9%% @dB|9o[n~4MkmmM$Lz8ê`WWW777f޳{;W4@xc.?| &/㚚34[ѕ&`(ҩɯS(k$mp/:^#% ,yu!Գǣ:1tzavS ~LY['4h“,PpqJН-d5|aob(rk:t˗N?gΜo"oxo3/2,ƷEEv.|Dosl T9;Gp ѴC9! `Ɗxzt$lN Iw_W]bIOpKy  +Tmr: b)4ӸG檚3aX@zdXg`XZ9Sۄ4w!.P XC'uo*xC A8NkX_u2Α٧H)!\+{b^.S_"X 䨪zqUU\вRO U }6WqZW@sJ v. IDATT`v2Ԍj*K&V5.pL@SS,RR~Xp? ] `71y9l MB"nlJ;l=KRnXHl\;SxHa^|c1jz)}^X^) ;?tl274Mu}ڵ6X8aJ񹅱1MӞyMPf ;*^8޸Aah! n/`mmKJҁc")XnX[9-➈f/8?[J @E޶僻鮟|51kuB8ym1uזݵG9@%%'@2i L0ͥ󬀕j>QD bAYl> 4na_s_2 m36˭qH??Jww=J6MnqhǨ at{ u*(2q\}loX,zH^LJ"%JEKlYcI%JƱ-c;cَmٖ[Q/I%6$@T b lrA$H߅KZΜ9gg=p47-t_ 5 d6{._y ;R)-)K~ұ5~_fcXT6Fd._yUVjb{40}R(9WҌI$YQ/eCh3=~`g㮍U, Xxyí9KkG=姗ͭϥݰCDZ-rpf6_2,oK|hczf(Pu`#O)AI. {}䦯0Nz"QPc%/xnXZ(50t즭X wȶ,+9DreN}څ5e%=Uf ѤS?,Y\=h z{{q7i$!Ijز е=PWBSMadw0F^VU?V;XYLQn3lRµsGeáSklaK*iHq0< 8b<)UBcQBL{.e(!@G)쁓<{"W;)(r+^޻ k].0 ecSl"~h Xh4 zC/wx_n,5_H̳=_߾7;yT\ ܄{ }$6mb?&t"_"t_m-٬[ ]?ưf_-sϋ݌G}hGNlppr˚yx%$:߮_ˀ*~XP@;U95so!Ձ0>(1%N@,R @oP4st:]8!f1VG*'gT(+|KnB8#v`e,YLJi*" ˜PE V XhzQ(ӭB GX=&h*(GpkBW3΁%Ap< NCv . XF/\J ;Fqq)2!4(hG:!`]ՈƢ-ܽ˵lyكD[DrH-쿵hj wYL}VB `iǍ[PMD<@e_3kΩxW I%ҟ}*08ҁ FjaL z!YT@_k섷ڴ(r̶/W/ȹ̖)r+3od_}tmCSSg:T>,7?tC2jZBA0qa*Q41fWvH~ 30F~%@;ځ5d CgZx0aH^>( D׮ϱE[/c˫fs`e,3b/R3MNBWD0O - Ujxԙc|-t,*GݔbuBOF*yfcY2<1ɐ1>}tR =\O?}Ξ^o37$wCgc/g9CBqò_XK.g]'Ҍ(|=c4h]ecW6DE䞗ijTduZN/񳋷l`1 `Glٓu=c7~K49~-̭m4]WMgv!!)ٽS==a5 sQIĕV!>̀S" ANOjXȩ '/ou505n4. Ȅ ʉSCց3B?0t:.c.H)miieك rP_` ҐVbE ɟ1zOЍq`!ʁ5[3슒=oP"vRo?)1}Ns^m~4>]\(`Nuw#+˕1#QU:.&`Q֮(M3CU9FdpBI yXٖn^JiٟkyNOCaWкj{nӯN10|^̎w;z}$р #%7% _;ܸyXlxttH'f+Y۞~^}/Wkwǒ<4oZґ_2hOHjo5Ru[*dszju%y(~k1kD3jQ mܿ* / r1nS+/WԧKVT݄y|Ve0U H 7P $NSqEZ0QpJc[ }g#El,Y\(NS$YAIBg .JUYJL3lLI Ha!4X~Yu`LeW &,+>!K3XYL)$#R 'RIO1^4ubBR2F-p=mP]ʆfy؁N+&G@=(EALS WDq`ŕ0 k !ꝁTg7oN#[<y|r |5_ {(iO#Źx Y;̔k(sLa:lU+0pC^Orkjl68pGVrΈѨcJsEf'=TYZ w#-)*~) ԢLޱ?,Z{daZ H ~odf~9t2r^ra(Plա706QXwC{#d2(`0cNvĝdu=#]WYV,YK XD} ,\IB2K) )B X@-`Ad2(`B%˔r@taӄ/\Ec.O6=Cy'3\,Y X4,%*:@p*Hi4"OsbT@tXN4 ֚,W ,@B٤Hi=K]'X7t[﷜ SSwNFj+x~}Y{ vJsXxq~]XeE^Bp0r,a`*.+kCd1U; F.Orkք|Q]~bֵcԭk+޾dܵ]b'_ЙJXDP [Z5 ʘZ|S+)yE1NYT[PT}uۑW%xފ_ LcP1WRʸuŋ_@t:<6A i٪dB׻tk;?(1[gΒ.+FU.Jg+;y$ Hd@8U$LH׵̆"҄K 5ؐm*8LF;VC8ZZ庣 X;zXjBTPP@)5LVUq $1fp/.ok*͉* $8κc,#0 ΁=oPf,O7 DFLItmuCK5BnhCeLqRJ !U-㟒LS+ *:D;PKJu}A&oݵUYZcX41`c(H%Tp{JLU1䆸 s>1CRA]%'sBm͹"Q#+C=nh@˅JM,);¯%Y1(KO~hI3%<~\EBh_<g 6_ti[V5IA[φn0μ瘿}dAOϒL&u:(5 -շFi;d3#[spШD$J[Sc债(XR#NԱRhMz)Clua ?)`1>Lh:YɴѪE^[u;[!jZy1\Tjjya%R,0͗iOj;f봋( 60O*V4`EO> ,(3q 3!Mh2E3F;h9E4).M)d(a`)"+`ë Cu`ͣ\5pwCtÉKutӆY|,~dET|tLnK3}>x0MaH^>u;fnらX2αL?&է7.p8Pw[CeLqD`*E$kyp%&p`tԛy 3u 6 $_$sxw}. >c*w!PBѕvˆZ\F>2Im0/mcS:#?Ug'uOqWW^,{VbӁKIzYI$IjhhBv]iNcH: CmQ,4Qd7)b<pPzC T $hIT&ekPs.?HRil)(Tb4 ib0{<{2$X1-S XT VȁjW:c4+mNhDퟻC)Ei:Jh'Ou[QMavJ~yny<tOOOUL~r=ik:7Id^{NVF:hj@v,'OȒ%ՠ(J:&hZ 2FM}"!ȄD+\\Lǩ;# +prZI6{,!sCXZѠ_\dhCƲNs*+Mɥ`y]APx@nVc%V:OmMxa篁kDMRP=Dr#u7DG8[ŮLoPgo@)*.}\TI o:{Ջ; M.'<\Ψ\ɥkw)z"Q/'('NBNI:iΑZ[e@ KCk#G:uaUÑQLBLKmտ6~(%T{_š&gcY~N/)/-(( Xy%@6LmH !b_/L/8J3U%c*Pw'}peނ@@ilӯBoPZSGo\Mg0FyP<ӰBulEKB&2ѓ~›B(hք12lp*Kb*Ç?UUUx֭/5J,Y&&JQJZ¹`2EQh`b.fu n IDATXV,S `)se#p*ղ;Q;Q甼NɫޝP:`K]:p#`er d\^9!4 XjƖޣItPk+w`) EA1 O]Jjt`L[fh6W-[}"Έ]d"X .)e¾7^o{"z\S}}7m=r-]Zj9OwU?S3K[bt*d&1<|:ri" :xFGb4!\U6+R8444ͱ3g;8]nޠ_QH1 \rT1Ǝ%)a٢آlV26ʘPT:ϟl2Bs I>[ITDi`%CjWژPt e0D,76$eg6^rG&F=ƻ3VvHnm;v$CQi esۙ|g&@Xq4V7a ao(eqlf&gɔw}`4`x`j3c*'xbٲevb_Wo}߸2=9pB`t ƻC>fEu>go7 Ȓr`%i 8,64`YO;7x0mz[ܐ t/=n:nR_@$;=JQ VPf+3{}K L$ФǩD;0c(8aE*O+i, JɌʝ*:&gEzwcp > `WN61RT aa?qlhHl9H5ᙺW;Kל*t(yR, VǿUxdד䖯:mI۰RvI(ŠhB&DW|ߌ1Y2`aB|Ev5d&2NpI^+;[wwpV!'#`emGD)(K3I\&cX GF^H~H=n?feP>~pZUՒ^"EjD(h{V(.œhT01B`] gD:<ĝyvdI~`ɧH ws# 1*2dr5e4RO<6_15o|rЯx\>9c}efzCs`eCd\N!^9PRg4+JL }Bc1#;zV--N9^Gl9̚];a 8xr_)bV?jӦ;4`],<\}eݒ̒@رߋcᔼ# ]D,7 {p(>ޘqq j;^%|jA;vJxgFa7,}sg]{ @9-'Rʆ,áҕLƘ̀Άr$KJ (ª}kS}(CyܕH+ƶP 5*Q֠Kg˴t8\./$k{2KtO}k_?)P,YD0B3 BXLc+*ݽ}$ Ս``2bJʒ%E |vҭVN$x7qW$jeXS{ y ȭS,uFaNwFI軧bc>\+Fdh6xXDGuQE@bbʕB ,TJMw*@"vڣ{㚱l % Kv~\́^ ) $>~n6R~0]Yg^mdTy}o݇zuZyW_R4$7IPXy/2$"ZL$G=N%0wd'O/62WRazlʑ 3+7֤Hf('Nv$w;F,X%` E@׎러0a&b} 8CN-.b;fgM^NZP!WS< ){vhJ5ǖDV1WKTgߩaG_s\}dodb"5_f #pPD:YKr4EZtz#X=#|%ꍛ$^6-lY}o<: jv׸ Ä,:{Hof- ~n~D=c01{K\\3LҞ_ (Ptu`P?Yʡ꽚q9T!ͶyfSO]*cxꩧF644hp80Gއl $% aό, 5X@@qq*llR sϘdX{ȶ0x{mA}qp-{.:ݶֹ/o6( |9sDc]SΡv Du&>maZR;D3տI{%V.dc7oƑXz ->c ~hdǑR | Xg0=l8l`qߘK㍕ *v9ēH6d@˿+8S5vvrJ+՛5ucr WVYźB~ol<(+44Gў8c=7԰H\L4ٛzvoݱs,ѭ)9RZ `?{/?_;Ow$H ~\yR) !:E$8zQfm'L;fzlr;,'nS+ lVWSO=5$<~'6ً_&)}zy睯|+q~IF8Zz -ˊ+wdY޷o˲6mJӇnݺ1%:wj 1U~2h;Yx0CwGKnDz]A@,JگMW$3Eޮ{^L(X9MX֦M`ȏP*Oέ-H͝%?O+ϒvT*uDh_R<5l"yQ?sy5Qa;ݏ%36֜#ey}frwu}ڢTłGFnQZFV˙:lV7?}hyw.b@^|^ɯsB XYnfIfeL,!RjZ/Ph&|yp,R, @4^*;˴!{<4С, tqRD_ZjK3ξy<79uˁ5C2Hd_eJH%ISƟY O] 7q,lg}ђA..CIi)WHw[Z2 l[=7ESqy 1EED?n2-e}{>eA[.D>h6rϖH6 aud˚JY {!c򂵛fBx_:!?UnYwlU⽢L؊ &XQٽG=/` tP 8&wYP r=;;~Wݛ+4/hKր\z$DD]<) @EZI >3hrՓ!&ĝ"k}!SP/)J\ 2z 7%1Τ.z%93?JI-H_(=%lA+ӼD ?ypJ7A9 IG4w-h=g_xz_@8| `Y &KH) W]OG䳛|;_t1oKОt9 &IN'ꊊ UgYf)ڌ>Zm=<<@ T ɮ. Z%ۺ\82 kRzW1$E,hc^%|TJ-ʖ~_Mb(@x3c_ XUn+ٲd0NE hp%^eg[KK7קY f=2C!f 35eO!SR9tܹs/\,Y ((J:? DTJKb6De4=K,G!{"'y>N S(2V a"\x={hOG>6ޛ8lRUTJwLɐf*(Gor*d*8E;{Rng"oh$l-0 ku2ԝ\ 'S Z$}\o$3Xc9(Ǚz]0w?%lOB+>1Ь16'BWo1J˫]zd7o:3_=&d-DR@ԯj\a9Ed S[>=E򎞕Moa)ZxN{ 7q]}!]dLl +1l84L4Up<@LMH 9O,k6'ʢl(5;l+FTEG*>rixڊ/[LeyO[ !1-Yޫ{Rl@Y|*hCOgwh Q7Ɋݯ{:ks,D\gapG)h8#I.POү('Ϸ?'w,-~cNejZUr*((QV5z+,?oo5ʻ^ˁn NK@eJ[[ېU$}!q S#+ 6XbjT er'j IDATSO: 1ֱ0{nS؜ @?PS1Ug19V<HjW|j=vutoN1l;ю2yHd"W6BIQȟDkεw`=?{p8~_|q͚5|CY'7n]H$Z[[ 0gΜ1 5YUb,0.2[&yj& 5ʹ0aF%!4ސ-YTl; 3`̢")^{' x`-hyU7أ?FL'-/Y?U<'q_=26TmMz5vv>P87T`n2 i roFw;NŬ_ڶFFi/aaC&`&݉n!9 ÃV #Nʙ:36>Ç&ZGOhA18qB'J9DX: KFͿxL$>Iuʇ~i˜t\,)=3ttgs眩 W HM(Jz$[qnl'v87qI|ݒqm˲dIT )Al:31  RP =gΜϼJD’mlT^7d@|Sc,>C>xW:'\dhX-L"z0cmAtd$uh"?}c oyw˺G۾lC 8hXQn9sxi,KddE _-)OCw:";K wsF\ZV Jh./xa udum?VB;?/[7Vēٖe^+|~eyeo xUZPfjZHB&B-٢6 LM9/`m߾}~L&3>>^TT4[\tR?fL&J)ka&&&N8iw˦)P@3CBU\K$5eNy3 E,$CqZ:O0jLֻ͵sY2ѣGSToonX,EQEeY}U%eD"qS)Ixj4WXga4vϦL]B8SsΧ &Hɖߘ'O9]THt 8],蟟, C4Yty&r SE"t:?\#i!&r/!35zCt\3fQQQ0bEU_RmRO$lF H9q]k &2QbdxBFv p+?:L jC}7tRuw'=ޟpmUHTZa #ϡl3 `D\>G`;CBZέ'\qnz_qI0]h@ڨ0`PqYrZԩSxkY[y?R7G88  l&PB 6DT;Eb` pY:߿. i`klan!65 XGF L>i1S+ߞ]ouMX]lO@cu $$(Ћ="'PG5ߛ,Ȑ"yPR14 `r.gj6l{IXlr o d l6?92O>l :!$d2,dy뻇 ~u@!uOg{HS%s'Z-ĈskHkXS @ ݚ럼5+DСCSd9+//7$ɲEQWfht|||PTJ־]GPRRR[[ I$I < N* ҋ8/`.)CaUʜ9=m[,s_dsYΐ'O:ufMꞗ|i\Qç+nEN#YlըE\a\TDD#'(;gQZq8;JNgbY|OuY6Fsd O~AB6Cqu Z fl^@]`3J-/5?4͵WeDvB2 6!F/Kh{uR[`X&4[kdE#P }椹(xٴP%W>Ac3-PTQVDD6yub71LI8-q&Wr;eB,Hh!c|^ݕ30uTϿWV7誢$@ilmt:^4ɂPМ`Ce.6 +n6? j2yZ7S#ZMF`ѼgnMu ۖykV)d2]v \QmX5Wʂ XHniڱc$ ¹B(mdAƹAՑ "h:)uRJR&fb d, kA:n///7NGt:gZNgiii<fv]*q>6F`-̃,jV('ۺ.A92nECD,+ZQZi7Z]։930*|5&W۔L&~jLcIdŪK"߾(.w^lzl6v ޻J?( 9L6nMA$40=jwL_=cIw &p[j:%y`#8E %Gֵཻ,KTՔ.ft!UUPY?1r_UUuhhHס&&&!\tZqWZZ:222+LK!e4uHiqUvʳh{+Œ NկNGXYnKBt:\. aQFc4m94-NOxbT*522דy^QUUEQԍؘ((OtR"HEEEuuBǂqX_WV8:rmY4U>o}bezX 1Y_KJ-ts*?i>c<qF-_ ߶?}gPtY?w{6vsߩ'GQ~1QeFJ9*}[RK;sچZz<IdX|k Z->lXr+K}pH:F(sD6 ETFVԶ\S3$2zy0$ ȋ8Hƌf*h-~eD5H'`-yus cttTŲ<(DX:7B&p_8Qjrс4Ucԩ嵮Eeee6l_@}@9Ҥ19o)L;mUIz%wب9ڲ]j@eIf&^#?)1V35x^ZPyŘ3I6ϻL^%*`-xu'&iժU3&tttFŢ?|Xlj*++c[RaUUn,i^FUQQ1 8BP202kSI45SvL z!اk]j]=vt_÷nihqϿ5`eβ"XLVhdAyd^:ƖK4PWa)ZrW~BE jQ v!bq L uEԘxŭ$/`-=:J|c_ɽX>z@*vUm:~%ֲ`yME8J$<6;+ bөh `(,|Ot: 3IKRCCC%I{zz<}ka,K4깙yrD"L&D88nX#z>QxO!GxXW!hO }QwWe8 8eyEKax" -Siþ| lmoyG˲Yh*8mXL8+V8Zr}mYW:pԭǓ#/M\u 2r4%̜ܸJ1̦z cbBIkюQމ@V$+܅=/ӸH FLlpʼn#/ z+ZZ C l0tiՍ+ܨ>YcjS_EŅz)J@[[nEQr!иp8Nɹ,"bN%EZɩ?z}5ӒrN恅D@KXD ThGg]CU隍?zG l>2n-=Mqsa.` "ZWF1|l<5+RB,Xj!DnDQjps홞1vm @kiLeq5#0|]إu?;\]I* ˾в=gP":eݿQˉ, ;տޫYKL+l]Ȳ\__i0 xgY?5AA(>ollll6󼞙qe O8b'#;l{y:rڜT# @zrt>jؾGLV8|z|i X ^Ge Ûf=sn%T HUUK`0dR,o.c{.n׆G`=Zw[Wew [ /0eW j䭪S]QYTP“ xhHDPL__Rw|d3ztb1! u7(4ى,hl!*}.$bewX = O&naBBJ1t헋RUc||@0,t+r7 kÙ"nn(i۬_Wu:>@\~YH=/!`U u$|s0^F@y~ݺuD"rl6Y|,>{`WFf27))+ F>pr2 &z O<}gPJ1z::gxg5X,x7lBkvMGT|P'gDjGL74Iwṗ_ɳX XDSqt]^z)+^K,I5ScU:  %VFlq!O^]ނiW6獇Ԅ| k,r0s?-ف$isONb/ȩN&'OL&zp8*E8 O Ӱ. f8ܯw1f#mZ 5ktr Zp[F˪W:$MBqiq"*7ӟ3^Ub@ yeCov NE7iq%j*l[l|D-O5}^(WFZ@WoȭZ|cbٸnتzK;vPuV*ʕ0?OX P.e'Od]K[t/)=: `K XƘpN2= x|p=uH\$@dC`,V{:=Ѝ2[#CW^:pѲx"925ͣ-Z1Ws9&X-6T=i %2Ym.GQ5FCk>H cҝb1p ;q<=\fU$(8y|@ݷGk;O_~/6kTd)(jn7l& 4li T}+7ĽR4 w^''Ldg$iZ8AH]$ ŔŰ۠U^иtRmM5jGfءy/^rv;{gU6CvLI"jGEI$|Io[Q5eD8Bq;C\FlW2j;XK~$?Ol[%X^_m @ؖ#p+ĺs^^d-I莋X";e9vsy]X5(Œ` WTѐy: V s3_7BɁwTOiUM"0".eũ2=_ieڶlJcw6zk2F_.оHXP4OH-PU5'3w1tI N¯Dv`[r2[շT"SІKRE;qX;A6Vv3TE#tfsߑ#J<=rڧńY$l9u(f&m|uooV=z֕/ k M;ll 3ݚ~q$nD *'#x[M)9n7qOmD7BjTX|S!ك))ξ>jg'8_㑔UrerV\Ńr0˔(*@s{7--X˱PI\;!c'k:5S#2SN%m]:kȺFvޫ>ih08ySW e7ȭ"Ώ*X SdEN^%1],  ʟ ųٜJO3 )Lkm+d%_%O<󄓳(uG*}d4B4çƖ%JH,E./jߘjjԆ9HUJ.+@l]w۾S;qE|ʲ"ah;q3k|u-gS2RiVo6lH)0KVkR*. J'ŎWؐ3%y.q׻]XX?͎peP83ZM|X$nUƋG& \ޙii pT8?-]j AU$!)&b|tDruGy:0)OA49_G˓'ϻA^- zeg$ǿZ2{2vJHe»]hN5ඛjq9Pr>[o EY'ި8 ^;1e6߅kh05Qᗟ|#+cvk΃WbX"SUb!&_U>,sBl7VʤzH6v}/ֶ]y}<%/`J^s1K~+&KհL@DÔТ>Hyg %Ej,}\0@ =UF%ẺXmEhPUa0|-]Z9|z(sgNuN%~wN >|˴pFbK' :zw'|Ē܇xao/+֔FYsf2"U ˰;adZa>*,31FNnyG )2+O<֬, d:ȉ~+ Yr@Xqhr &V ⍗ȓ'OFMZ9X0q\%F[p[6-%kM.],1Uc<񅒕^k˲_GjԈf{coc^uU/p)uuP>8i](6T9Ou~J:G|e4.7V'N ~)%ٜR`~{<&7k7N.֧AOuo$:L~ϟ F7/~p2_fpiDS}1TjQ y|\}mEzLq0lhf(k 7y77wB\|֬,]+ti 0j'QP3<]ɯ0 K{_/$o*yDpc\…\-tU<.xz*D!D (c06N Bw +W[ /+.~q_`o!2C#Ţ;cLT^E^=[&nn-Ι@[  `]w4^Rܻb4$~0R\ϓU]Ei]2Ѳ ,{$ B/II9eAR * [aI()HH%CVeiND<8Dᥦ@ `v`4K5Gh摾%H @N!ŤqzBM+W\j!>!\Jsm~`Bu6ƹ{Qh"PJ iFot9&fK:I cҢ0%(ԽCk`\7>$G%d[-7imv9uR6*OJHwK*uwǾ'"TArͤH6;֎L M);%vr2XW~/8\zН 7w8>`(,%ˣWNB$Hlԩ:Ka#U&ַ?iekK[P_gV'kȇ *UtPsJbc0W >(׽SD{W&0Ev7,4C@@Gd0oהTl}$+_YEm~167&˓GcYBM4̽2/_ƇUUBk'r3 z"OH@Bt`,+)HxU|R9#yg{˛u:UDZ}޹?3N)>N$Ǚ;Ld?|SuaZ@eNw$-#n*31rʞ >g,gy{4Q)@"@v@XLyMHrU!b(@e9׀4"rDvf  sH[C8 ,q~wZ {Ǹ5G*/LfZuz*=nXX4CH<áS2dͿ/0#o_8}QbT,ˢ6 ;N))gK`wZ:'\~N qQBN܌T.|^ihNMtoSMA3l@ri3%f DL)O} `}ƌc7`+.!Ǎʽ+FJ ,4`ЭQg<9h ?ާ1&3*RʇLr 8o[ɾ#"xշu3_1ꔁPNwkt `<XAJeQf `cMV-($+1_-\\nBb0 I0c2,}'УLu(!Ǎʽ+Fhp(/4LЯSy3)B:bӀ=M&)HxURp{nzݒNSM6WRWh p"za%dRcYd%В¤L1VOXb<裏~A]]wѯ].핵qUJ Wˆ{,$B4,800г8~i;< TR BR9H HjCL-Ixp^TYX,0-ssշ䵭|f/ QO-kH[[FЫ%>-N3kiJҍ"ӎ;#R'Ii!*0FNaSt---qad&IQlmxnՂB4iԻE\HOuH2T HMv.k9w^ L+V6Dc¯2Z8SU-8mlg1ժ+Zt 9 =G}aLdfVƍ_]v\v9x]`Ѩb@mmm%%%SLI-ɆjmjjϯH-WBG{/dB< 9Ogd͟ѹ_߸2M1 F [i{#UX8ci8M9+4wMǍ?n4OUgɐB)O!VJ-cΝ(XBD8z={vjĦ EB!l{=yyE5/&~CguEjaz|0Z5ʐpz$|aӦX7K[t;x\ e;p O<Ě5k&d (m6ңvFḤwYT?U `ըG+lbŜSV }_Zb/~e$7{_2ݬ!K2%c2(Hzm(RxlVM I[䡃4Kt9\ z|zD[4Жܚc!x2Hɘy8ng֗Z^ޢ^Yd閌G:DǜDD?ToE~~!@CXX Q)hrq2)#cLbuݰaC[3 U$6|7>( Gȩo,v5У*s2d P6sVb eĔWI/et*9UDXZ˥]IrG=G:l~Gp48q'I,%:dΘD3Fn.fuDLziyڍf9ޜrVazDKm=n~z!1E'CT \Tt2)#cLb:rw}w~p~"P{ا&7ʽ+[q'A']R]B(Il !7gXNUߚ`/US,Ʃg^;+ӾpIFqc"T@xy8(~LIb$S[doԧ,uD\{@dD+.yŮNhuDG 1}k2;m zx{V.ʽ+;^N#[l1^[:]]6z7JA b0L-7/RA_(8}_]Ƒ6ʹPc3琔Jxy8VRjXF_ۏټ,O46]wfgdO)YiU H8t_rCġP_^wueIZ5WjXS*S0P?'o'#$wHz)[)~) oMI!, %w>@ekp4_/䯁\qp"Hgg'?A3dS\4~\yęwgoqREb?ȈL=>9(c5&=nQŹ|sg@rBTz)@ YjudĞWI/%Tdnu;IJ8l#AWn~\[z'95}$+z!8R*t 2nE1===55u!G`WWHpj,S?7 7UT* XL1QX"INs|[]7^ pBr;t: !7)lӧEA@K`0 #(} U@ ޳rQP^bԩ 8(97&JqÁ"i@n8.7QCm>RSn'p&rLtR8z}?$kIڌZT>?`0Bar=z'O'+ `t:>'*/~R:^=0r hwaiCm>D=V%XxrN[v kNuoVQQZ>oSNSKE?ς@ b(GF`R&LGƘ(wxܠRJ !J>MVSϐJ8n鈖Z[Pfb$WLǤ!$cW1_GȇGߤ]HR!- _0d[ɘI R31Q&x<`PјLgT#҉.VDȼzDPFHxd &ertd"ݗ88Ejjjr%S4${^0 IߊQ<BHrxtL^ʱW %[JҞOߕV5*nہο4XmkNJF" @@FFƅWy0AyV9KYJhCY$?2b29`:2Ƅ.ݻ_C(qw D2̜.P$u)&~pf+\+|+/y3 3-Y5F <Z<6^I_y8 w8t @MqMxΕ3 0 `%'v&\xc4w8eI5 l__3Mh(P1d`_;\E5UN*pi\wkIiM'{D~>I31#L fsaaaJJʅ;= 2#j%|*{!`0EKPbbzϻvJqo!Un|-0:p)p$uz`:& I/ekUs"[7m6\(==D'Joۡ <.& B222ϻ,m rq*_/83ԍ5z=P$?2b29`:2Ƅ.sﮘ˗'A'ZLS}4@y @£ Ǒ4$d*XsFIq)1<]d@nzݒj Lt¥T39Vfhn?~*d EBI)i`X'+ӑ1&JOM E7Ɖ!CZq.L™%H _4{mg8=Vܤ_ G/E42`%Č0qK5^iΧwl^lf0ȑb!$ /t_sEq7ukդ,3_pQ`_SSڷ D1`0q\\yoq?q r%`Hܼ-O?$9C4sS/83-!l(ƈu >oXlʑTpIAw !I1iJIhS}Ldhݶ0p)7&΅ Jvw`~f`}kNVp%>tUt$&+ӑ1&B 0qQucx|Oj,ti-Q[8#`4b$`0IOY,wemIß_?y?n2U4UmZ8n$vxP@v1p.,`@rZ(ΠP&$C+ CZ+K ` 8̽c\e+j]uNpH3TC'Y.%q5`0b"yP]7{Zk|7v4|[A`oL ~V@vj#D8%/drLh4d0 #(},uڵ+!Ǎ 1^Kj/UE?z:^=02M bDk ۏ %:"..$o,v>cqO`š֠d/t=.A" LMAbܕO##V0)#cL;ړŧ~'&␣>ه`\Hl//4րpի(%%=`Z5sk?|fzB`0"ݗ88ŅL~Y(ưOn|GCu+X #A`dV-D`&.@C'D?ixp=[?Oomkw=2]Xy8pȑ#r2pM2EMTb0 #Q{ưcVȻi4G־hVK](z<+.oK`ہŰ.=)˥Vg͚ `IC߱?1s|[pts#ҶU2VqU &+ӑ1& )!3ItG߲_;d7}^m{۷wdnۼuKJP9)amIze>j`% LǤ!饌mV.eYY_ F?O׫뤶3ŇnI) Q6Hg~ XKh 644:uԅ E7 Hڣ dt]f_Ϋe&6B㗯-][؜#q$?2b29`:2DHEw`?CaӈMrrf` HȑfQMҵ_xn5e@?K[KMs3XJ B}7=ZA~~Wz{ӟ/k?3o4<>ܺdPWMI3҂iWpɿ*vWTT!E?yk ۯ~~ R@̋`0 a#a=cNKJ܊PPg}-LǤ!$X1nί\vUի|k\z rQP:"sVea8Zg+V[+;L2hs|]ƌ$\ʨm p>{#IR08NEߑ6%}fWc//aqd%bg&$:2b1i`R&LGƘXG"VMMM[B51n\Ė#,>kW̥ev(un4 WC!u&.e:x0GirXS19Dj;!s42DtL^ `b8bN:ބ־Oo\QO](g_?%>wίuݵ_~V34gxpk{wM^j  4q)BExIP]e.EF0vLc3yP3 iaմ{" C*R7FL$ xo2 lX(=54Nd_<]N5AހBC+SS @A߇p2kcS#Ksh&uD#TT`3@yD}*b˾港?M$= 2Oɐtidd !`ē跎<.8@UNf ;35H07"#V21JǮsQI޷뽯~7-Nu߿&;t,\3 &Ҹ<*Jp 0#n|FXrW[ B2E0f+圁x8g$`0 X"|(= ]v-_>gXfY늉us+ACvI77?V>h(IIϽtum[.Ķ/TJV^| ϝ: =:X7o"ksZlϿу?+~N Tnom+%sOSwDMFȖS>* mաkiE"TPbo rdw#VkG'tԀQ-˥m%<9$ OA0rj`w>,U&@4u'-, R9f I$6jfi`zx#{zo_t(,__&>xxI.=WQ5K^%0&ertdɄ>SO=s.kc(MBGo4$+`9eOYihI%#2UA}ʿܞݧ-*yh 4F%R6H!  p9'Ԕڿրp3@:<{3U""e:Z*Qi}S[_Ï>zqgż6p}~:a__aMC(K+;)} /~y ɣy.fG!VSpGr}b|MSέB%p[vWP7H ~5&R,3ا0 yE/dwx7Cf%j E"(S§gZ:TUt6l9ž{wVﯲb 5|[Ry y쥯8X׽ #xcǎ͚5+Zz\H?urzN3\:,_f;K Џޙ^ i- AH=E)5 ێ애b؏h@/TgA!PJ)vvaWzd%|ϛ#hLDSeY ,`0DŽo}3f̘Gs t+í}<\Ak{GkC3. Ǣ$5ⓁA?/8W S~FC!u6/JޢvQ y"sysN=-Il:*)@.͢m2tK^CS["&=K_p/՗^ӱn'_Y5|#)ܪ#mdNU֌VJSv}2~~{t 6fύ,w{y{'w]򢔿>lτ˸N0kiEt R3 bIT3g e,/ŢBӈqӄ\uE7I; A8k24 T*dImOx֕v6i ̟Ŀ.G櫖ш'쳈rDЪ[tj`1 @&$U__?͞GAn7x<׶ q*w(衞,M ߬_e 4d퇣{risFו QV ԓv}wSOO)I{K 4$6!bsEe2[vs][M|. /H tʿn]3e7mw[M((t>ɺ@E('M9b{_>n@5hff)'{/SVE]ߩ ymKk-*%o/Wxi!]? ]*40)#cLQG2&N?=_}yKdXU0]u.iJ_?yF RQ߳>bQJ[ݤ_)l4 yiOC*WuﮝY1VmJdw溶οFw}K ȮS!3yDg4HCeZTQFBǗhfqNalFWS}z5iA16i׽[p5P*;"S'}=kѝjhkk+3m`2 ?=_Kī "ۂ';w^_YZXm|Kw[2J/F9k9,ZvMi <wٝޟ}cG\Wl9쯏9{mNҞn–C6&WJg.oܛjK/n_lfKY]ޘ̥Ά "|zFBP(LǤ!Cs&emL{{Aʣ#rCeCZ*%P{^]bywcKueS!d t"퟽jV}-_6o|0g&Laތ6Yw9'{ s7Wh';㛿z|)yAMUk D "ͭ\ge^9b O MŗoVk`%}J`:& LejC C6:S=ڱ?Ҽa wb~c`!߁ h+hGa9#~n͡jʄ™Qe`v{jۉc.Oe5G@z%=xd{ϭy5w󌝡#&#"o? 7}߼/}nF $n?صU4j>ŤѪyxs sSZ6 9u~^QmA__KF45!ɴaĥ-Ϟ3m}_GW>jn=wo|^ 9_Q_P:/(o^>Wj_^7o-Y]LfQ;cgʩQ0b]ظI9Zrβ DJ5v va> IDATmz`8p;j[#ZA ~]̾I 3ޚE\1Rxa hZZk#Nfn5ns4G4s[HI$3#mXgL P^uܩ#TY+!O/٧#C02.E/Ⳗuꥶ 9g<}-P .6gxI-l=WvYtݽ$T r_&+r_>u! P DtZ#eX6<Ԧ^p%4 5 LCGDePk9h{ud2effY}ZsX\k ϛ~zkm-io.;_ Wo^.H 7Yڟm.Sj{{d>bͲ rϺv:7z|B(U\f` |wɫcL1!,Z`{n=m/7Ҥ}{L[G-iFi~O礆>ygʁ잣~ W&En~~Ƈ<^$n,>7ǣ6 2G;r<Dk[UE_}Zu g]UsG<(Jn=ڟJR']oO@uڥ1Gw6#Y;]\q͚־UP]a*U/@E]\JH$]!2 E6?fߒOu=UJ 7!4kkTIy9Uz.v*Lpd9\^F{<~;_ܖy=;νtўmݍV^ܓq.wi Z,FmUN&u92Vs#m29@gU=?'BjM\Y{S2H-A.'Or\zwkP}btPY/8Y=9>Noj1H;f_'vOP5P| ~_:Ҫn"57y?!HoS?'vOYb6|x[Q{X. udyܪ[?FP 80(df!E-3oS~_P[}@ڑ/@//I0S>Rl(}|{)U!H#P ޥ184:77= @ϡ83?=Dj6S̴837>qӪUBO$WS}ǃ2%/ޚb<\^#%n_÷V~a$a[G^ .+n;eZZ(By[Y!,I)=:>ffkf{! ! Б SOC=z+y{Tz7B $^yX0]fg2~f3Ϩ*ipJ?tfCa{N0LFDU5u˚*ZX񾪰W5% *xu9n'Hר&pooW3'Eo?%~jOV7}eiVU$Ou:0#j@PdD; ͕vFJnRs+S nPu9c&.|M9-_"m9kLvpaU[SR[u:ն"%*}NhxJƮ9(6I25EGk:~-6vz*$":lY\*t*;4I(Qʙ/KD$aĻCKyi,/- 'w=ݯ;(fo+L-Z"SMRMv5B”-KTD&dǚNQQD-YKh0&9Eplx\V? J8AdDUv&;`Qw55뾣mWWWuuu=N8I.GpK!"*u:D| EM$3"Է!DtEۏ1̆tb_>FHX`fֿ8fƈShfDL7MQ%1GJD;[FmmOD##ZJ"rGEIpѰ(wgȐ {y\t%tOPVD.Mbe8N/ۛc g[T7Ԝ$9o"}sm1q񧊊ipƽSpn:R@RN9ѩbƻJD4tI'﫶fސMn?~ݞ1xe4l&A!ɉRJ;mTVCۺ Ux}kPmi \EOr9FnGk݁s9C3@/8we8#85;¢E?O+f`:(o+X 茀vrkh!KI " 5֚\Ny5inf)+>0 z~>E["B/15n m|ݔ;jd swؕlDJSw ˲oE<43SlBy⤻q;S%2.f6b:L6`l΀́Q~ۛLDvo< Hm N"jS$MG5D%՚ j(3{ #as>=vШ*>͋-.=xis Ȫr#Eg2ꨮYW5B%oo!bt\n{]iY4wx:9Q,4[:š2L4LC5q1"6Y'!g g9̿͡-̹[UHN|2)]ouJ-x1'*oz9ۼdVJ|8mY{VVٔmbYt@꣒gu)AaQ:\Qec)^r0@Qd$y@iZ%~1LC(Iv6RoNaPsiڊ =?a'O'EXq f[@}XsscwA;=]mYwF DfʖAGs%"S1޷rݥ0eQd6]vy]]GX⹯XDFsSL7GRhwck[P$'"LXzgAN3}^Y{PIDOhgu.ysLk`%So7:͹Ln5:(eg dR<\!ӒUv N+kMLD(OMe:Q"jjiCe o.)LTX>)3v`w%׮*s;)\Ǐ[xM 蒄dD 2b^&=/^لƊO:oD߸v3D虗DD"ϗE̾!6=dN psRuCk=?QGUs1D v#e/Ch벿`33*=AfoҾZܸR*2TrLpaɮљ׿N27; f#!vǍO(:1pQSyk)CD[$~ sy$0AY]|jP>ڥ-[ MID\.nv ܋arkn +);bdd9ȃX0mZ1i<'mn1"#n~ݯ|\>aljqL?% !/Dǯ*brn*/*#IT_3]EbԉDDnM2)WRc ﺪ[cqVtj@ S5]!v˫&TWqO#cYNqi7}HȈ:/[-Dd7-=ۛk5o'8Y7Sņbw񻒁 a[Dɒu?"B[WIh'; 1I"ϫ܄<=DWDE#".6.br/'ښusb%$]^g$J& 5lhWc^Cj2SZ7uqD=@:: >iSlKrܿ#}ъ!gx"0ssںtSmbLuV35Ui\Դ|1Egۇ-%MCMvN-ڶ6)Mm}yc' Q'3l6[nnn@@vrs5.7s8>*--M9#2`d]- WCSK`̔۴\8r% D,8h4-ug*+qr1()ϷJ4)8-!n6J"u:ij}ʩ/@m;YAD&H*?7FaD$A8ef&:Ψ"!g0h*ϧC*$vxH"1ADJ"bP[47L֨mmm6f3˱R0Jc`+9 $p%nhjj2]{ xokkcY688sCsi? ݍϼIKa̠:QTiJE.-YDD';=D6!a6}&$pF#STDtUcӹk {+mf0xF&ڛեrQD]mR[1D[Ui[AJCRX/;@D\F4]c 7 B2ȕ$':tlҙFF,ohQp2"DFNϚJIQ ۩<~X[iD7vVyZzn "Y K2Uq!{ǨF".=uDjrKplҠL'$٦6"b"SO|:Q;_=#6#)Xg,L}LYt 8I]!-ҳN$űmKn1OB;Vs-:&q\ qu/p/3Q[BhEZDr߻l0ے4i۷|* ˚%|y.{JOod=Wt0 *VHL(a£ĎvXUNR $dd~12U.UUOQʙ˽4c_%Ɣ}٨T)Mkjmռ-҈F:WzvG (gt)B?qv㺽eF=#:MDlЈn(Z\%&v* ܚ0rvnPk.ERcN!q:}+2DjT}hCg_~Ϸ.7?T)Rii3x_#ڢ4Q}lu0vX+ 5޽})d2STwL-;?3,CJc ⸀s.!rݭMMMRT2q\h蹏 w8r銊S*ϭ4-9а 9)S t.b$Dfj{,ߕf% 'H"YbI%"&3XTvr:.$GpTkm"KdC1E3??x Y=JbdtZS DeP\Lb"r,^AKUuPSTڪ UEe%HMT5+n #"!<\ءqkOҹEr:p2)Ss mκGNE266)mTU3H%\)7#Vd/QvU5U̜ ,=S\0jr*DJO;V1k7WQ"|`ـ&oKJ3D5[VQIUbSnZgݝ)Kbwx~0Eȷ'tQV9A*ꁡI9#s9<3鱢CD0lj/ v gbC#t|9\W`qp f5nwe~MO7?h"ȞnhF{1) ϖ5X"zhtEODXgⲯ RJ}ظɌdG\a "&,@D z%C$o JᒮXaas-hGeܚ/[Rq,EГ쀔}љj3óS0 &NW ԙD"Y+>( 39B2g?f\,ZEG{Bdu`mdِfh |kTXjD5Pp Y5GqJ Vġ%.sƊ>",0!FZ5F?6]R(/cXŅT=-7gϙ::a]w˷'X)ӹWx>;\ldlwn4fWFTu JNqKt?#޹tY1|dƃk-IDAT;ST* y{bU˄G.ҡP7O ңC06ہγOfumZܹy{pݹoWtyvIh20 1_މm-|`~;9Tch W)EvI½(C!"،=œP^WbwQEcsƒK8sHd3G0!aDtW2 ȷ&)gH<@nMr aYf~tU-`_Xvb]9bY3+ˉ)14=VvtL/M97h`Mcc#锌)ֺ'e\JY;Aw0Xv{b)Lv[yEKu!ZpQ'Ld4Wadrv!/eToWA㢾w;;Fr<`Iҩ&]Zƨ_2Fb42lm"bAؔ4&~ $.YR#9DͅUZZv'Qh~u7Vu }eZtQCKTu{)LL|C=M?qTcdQqG"R^jސQU_F5(Ri]pMH:E>؞U' ˌѰ*"Pf}-}.7`o+Yy c"tu~ ÿs~ G(rK-.sk—[V=. :""68oـFUbGB ew6/Tq=ORfp?(#dְLEǪ9څ2Bd >i4U~b `u feT8JD\g.|;Mm$([ hlZ&kU|"f΃ #LJɼMh!eEgT@VPCGY(tgdՏ>r? G$(`"茻"\T k3O1DTS?0 5&qCIS/Qa`u]0XЍъ!rFֲsPpu4~-ar"e?㴤W8\Wn&HIyJ#SB.bYi8F!zRp3wMwv&`#p3y;+?Jv[EӖ=4N!Z#e DDߠxEΊYǜ%7(Kf,h˩ yE6kTkS j?N1LJMֽ{T{So{+C*۳y.~L7LH7uf⸩3ź,y]1RŹ75dL~Cڅ*w}1Q XP+p?X<VGD wX-1{_J]h\ a`46^h$*AEDyyyc;G?ro\/Q,7&EzOF[0&:XC~QĈ,/ӫu7HO#mrŠW[K8GG C<߃+C>ro Jr? G$Xĝ ͍|q="nw/*`yF"0`b\먀ڕwhwyyy=? G(? G(rKyO0 S(`WC .]? G(? G(rK򖕧OXpB  XǺ{@~Q D@~Q@~Q@9%yXawN^ ,cyyy=? G(? G(rK򖕧OX3-ZC>ro Jr? G$oX~Q@~Q@9 U]]=gVj̙SSSs-׃/`I& >j'OZ}~"̮ŋ>|?n{srr.\80]_ Jro Jr? GK~ϖݺu}~"}ԩSC ْYTT'AdE*v\.Zp8z0'v.!\^\ likk3 }~"}+==رc=[?'Af̘bŊ-+V9sf}d2d?ђ%K>cǎT=\~FٱcǡC oߎ\Ї~@B  XPx5yKzΜ9ZVΙ3G?ȑ# , \{Kٳgܹ!!!:nȑk׮=o+'$$d)S|=w@>1997XC EBz+==]PdddZg/r cdF&u}Έ#zN>|;|WlݺuJ`0w}MMM={7vE+J+ XfyҤIÇ>|ɓVk . Ͽ(0aBKKڵkzEݽч,\pذa6m2'OoK/ ^DsDQ~/lD>GvDC,Xp˗/_ 9 /;=ч<}ŋkjjjjj/^lٲ~Ӌ(}͛#TWWO8qӋ5*\q^{g=ox2]{{׿c 9R^F>^"Gˇ+D+v1cƌE>ăz"Gh***zTTTh46Ǐ{|g9-\i^Q8q͛{l޼yҤI5L%ZE&u?D>*((ȳ(}Kaaajjh}K/,D+͛iӦE>jݺuF~}HHHȅP6JgKss)S!rQw9r?iA>j} Q5k֌?^Tɓ'u"G5qĕ+Wv?D>dѢE{1Fq_ ((o"G_t݂} fig֬Yݫa J_1nܸ˗lYte&G4YXKSSٳ}qXyЛ>SN="2֭;us=>nݺq)觟~zѢE{PpeA?G}qE{O<ۈW͘1g˭zA6r9_|ţ>ڳ9w}wf 5kyO/&MZfͲeccc%KDDDxz1]i^QJOO?vXϖǏx%*ӦM{'O|^riYYY͞mD+{94EWދ}{ww?"C겲zdeey0aŽ;fjtFt!Gcd5cƌ+VlYb̙3k|gcbb<ۈw-YGl#Gcd/DOh4&$$˞_z\…?GǰaP/r!7tڵkNgmmҥK6lE,r!&MNgyy/|aO/6m˗/oiiiiivEO?/lG>䭷ފ[~}GGg ~Ӌ(}ӏ9t:}{ 9-\i^QEb֬YF̚5G?JhQ"h/q;::w@bǎ~{PPD"3g{(}yؾ}ٳ=$3gQ{'00P.5j۶m={ꫯ.څ}իGz}nnUz"J_rʴ4Lo<߳9zkWd 75~ XPx5^ ,j(`WC  XPx5^ ,j(`a{~,rO,>#bp5<ӯollXG}`0wEf=AAAz>ݻsrr E|||?oLuO<ѣ߿gϞ^{m999gϞ-(((((Xdg;ginn^z/k׮x9ÜQa7|s…{tM_[|B" z֭[_OL XWVMMMtth4tZbbb())iƍɞtpz/` 6m,˝Ng,=XDZxhzTzB *)fN]'[_p aÆ?[^x/_fXo>}>!XWiӦM .,//y{6r{.//v9ɓPK^ ,j(`WC  Xk%BIENDB`gsl-2.6/doc/images/movstat3.png0000644016036000116100000032560213507751703013406 00000000000000PNG  IHDR@ 9 bKGD IDATxwxUU񵓓 =HWɈ 0"΀b/X!XFttȌql(5"HPRNz9c!}_}v9{Ͻeu4ө_OF >| ,4Xi4h`OF >|{Xѣi'sss'N;q576N^O,//  o߾} 4hѕ+~Ms:nzy6mڴ`M;_|qÆ q۟aÆ}n*~]36mo /^xڴigMh"7VUUմiy睘 z۶msG-KoϚ5.KCCC+**BBBꢣkjjxb i*O\hQVVwiݷW<õ E2(!@ (!ʠil~PTTԦMLaaabbe@ܹB)e 6oz-[kzI%\`,Xpe^dSׅeee 馛nvk;l޼9**O"DQr DQB Dܗ3tu֥_~h{@ N (9 @ (!@ rf`!`].&={K QBe GQr4hp҈q@4dffz DQre GM%vLXXX6mFO8puAo(!@ (!i{`5vպ}>{&M1usAi~6m4f̘˗N 㴝}w߼y3yyywygLLL.]f̘Q]]4M,Blfϣ%W\b pĈ>tвeO(Ψonœ9s4_2gN^FFK QBe GQr4X;ƭI'TWW'&&VVVxxȐ!M|ћOfΜ9lryٳaIk0K2á[X]]O;22RӴ}샧u3[&f`5dm۶M0aJ{wǎsٳgTTTuuuDD?b~>hRJٳ(K DQre GMMjZ͛73fŊ}QJ%&&ڵuՇz^?aZCCC6q3@f?C=4f̘zJ)5~{/޽{Ouƙ&n0XBhiZddd^}_~eĉ R*--W^۶m{wK/Œ3ŒߛciKaZ]Z DQre GQ .& GQB DQBDcf3|3h`p222]L@(9 @2Rޥi. 2, +6\>{`)uYv 09 @ (!@"&pV4M1cƇ~ZUTT{qPPЍ7VWW~n:u/hXNfԊ+z-[mv֬Y7xQ֭[z衕+WFDDL4kҼs{[4iғO>f͝;wJMMΦV׬[}fCB*JIIv 09 @ (!@"+x%43f_6MӮ#GN0pԩ'N:'LPTT4uԫ>ݛwܙ/_|;v2eo}(G裏^uUJ [n…fT)չsٳgO4ѣ?p׮]Ν[niݺ_߮]p <^ɔBk/AFn}ǃ1w<* )XͻMӴozG)zf͚i`h`ܹsi;KKKԩj=ݛw_CT\\ܯ_(ڶmz]dggwd ,S^Z]]>ͭRJl6ٮw֭_5 , ,3X!!!ަi4҉g氰Zחvb)//UUUEFFeK;v̝;gϞQQQeۃ~)#`*R(! @2(9 @22u\{RnNJJڲeKvN,tg`:]֘m۶\'; `p_ Է FZhQƌyҪ*9_)o0ٳg3&""K. _fͼygϞ7yd]vǏ{_xᅠ ݻה7XW_ҥKRRҟ_Խ{/ڵk߾}no~C^m ,4SFFK QBe GQr4؈ |{` @OZ.& GQBe GQr4X\o (! @2(9 @hl&>Mh`dddxe GQB DQBDco)qE ><$33%(9 @ (!@"F `r DQre GMDZ; ,4X𐌌 o (! @2(9 @h-X>} ; ߴzʄpo,1X-++SJYf&>o!c= (9 @ (!@:tH^)[L&f`ʕ+GM:5''O>-83Rv2yyy?/VuJl(\Xw^rRpl۶{E3!V%(9 @ (!@Ǹ6B}>}uOw4!.& GQBe GQr=fnも[Vz,Ybfv{TTTMMMW ZnGs>[^u&h}{:rHof\`ݻwa^^^jX𐌌 o (! @2(9 @&6VVV!3 GzzK Qr DQB D8|'SRR7 ZX[h`Ek;v>h­[:CQI >[$%% >s􁻷XR F2(!@ (!zg̘W^pϞ=UUUJvO߀X"..%(9 @ (!@g m'OwVZZZ13RJ}\)THXXiii:t4R!O/{i|pr۫b?,(*--uFuYF%B_ G2(!@ (!z~𮤨_Lx+%>TӚ3 kÆ `[B9Nu>l5J; +k;ш G7z(11j&$$8dT֭ a|uѽtqUZhqАdǕR7n[TguVXXްm+E :86&8miʼnݵkכoYQQa0&ax[=Z(ߣ=b{Ƹt`냏-/{uСC{eg]6۷dU=êaÆ)v횓֭8w<>H++4Fsqg+F#bdKnoysڹwAJ9U}J SB..i? znvuΡ%Lw臟}Q7[4U9뾊NN bZ]L@2(!@ (!ۺl#F^,! n#;Pu[7>>޳p9 Wv[ܙEӧGG' rss]L@2(!@ (!Ueeeqzׯoj곅Z8kUTn;yzyvVI{;tjpϏ?Ч]GU0$m@~qIݩ)j$gy|+RW_[ad?ѽ rbJ)շo_TyuYRŠ69#>]ܾ~RS/c#4Llٲ%!78 m ۷WJeT>v Ըqw?TE!$Vl 222]L@2(!@ (!ϛou| a#Nv> K) \PUuNRR*QSo6nuAn?b, 5\Q^^/O2}:~URP%/ܶ;瞗_~Y)3.Q\TPPo/-o/8묳z}v~gyiso~$2f_ @&_߿x&>9^Y:w;YJ)mu!?a`3GT۷o߾ڵ7nqsca\ue7`qߣ{)))K,l7mtȑQFwylMM)QKg,!ʲǏ<~3>}h6zhR*Yi⺌Z[z+Udffze GQB DQBܰa1...^fտ7|w9V7R. ;v|˗/饗3}QJ]ve#Glk^X9~OӪxe GQB DQ k|XcqC>ӣG*⊤S p]BhDEE9NMӚԉZWJ-&?~+&-4M_wСSf 7 g=lذ4:񱱱FMh`|O=ԦMRg}6 , '***>ܮ]?肵75 ݫUu+kG_I V'+|衇owjHTU6[n%''RUVZj~c,a,xgFQrno0I|e G"DWsZٽ{>x}lSuV}~Se_˯9Qqo&!!11Q?$󃠘8pܸq`wJQZ%S4ΚVG+kNj+ ,)㋴i`Xl>5jӻw»[G%Y{2ZhhS/ja 7x1G+j*otn6Ga>.s83V%(9 @o%!@~6lPJJnݺ~?qU74D|k{n&}os|TRm\0MSj`լXb9U|||<]=XfffNN^A `r Dć KQrC\jU]]R Ӛk׮&R*M8XJqaއDS51&,,,22[cǎguVΝ X~ye GQ!HK|e G|?DcsW.|"tbR*??9vqW qm;vή-,2.*ڲF_a˭ۖY?vojܺ~3o`Y榛nҥKhhh/O>܉'N8q2n`^)uYlMk%__"wMsg3nɢWңOĥW_)թS'ԓԟ<>F?X6[z {|Myy֭[g̘OϞ=[Z^^~4h߾}4hѣ+++~&ѷ Xb) IDAT…!Tۘv v:8"aO=FU/ǡaUI;3 ;v>?l\tuNyK~2?O>W^?_~Yos93gLHHHHH9saϟoz5.& GQB@|P|e G|6Dv]wEk. ;7gg78Nԯ;KS;G鷿z!s_բ=7L[fnPi_U+X\#\xi\N6mѢE(ޕ`r Dć ,9B_{ 1NjaaѷvE^JUKXlٷ~裬O?(uN0׏7*555%%E%ՂE̲e*dDًO+[~ԱYq·)Y֕+W^uU~~&++k۶mn- ,luuug25x(CJ-sFkW}aΟgfee?ծ_cS>`4₃Cz8gMu[\^WS}wKvM4NJ4MG3g|qqq[jW?>9sN2̴Zơ%ױjlO <'xO0 +v<' +W,))y]=t%;[]suO5YV^Kͬ6''(''GVRjל'3Ǎ?V ,~siQFsW?Ã>x뭷>JЊꢣkjjNiߊS"GQB@|_ϟ7zwc DQ qƍw'M_ҴVo:<{u8ˮmeuAwmQQQeeO?Z3\S4=裏YU?355ଭߝgzU|daᥗ^RJ͛7;ם5pܻ099ꫯ~m̷*,,l0' "Qrb,!c DQ 1??ڄ/AJ)5`Gg.q,{7x߸qcgfWWUnkIN؝jeDBSOClqSdBqq>f a 2$??_m޼-[2]qqq.& GQB@|c DQ dϯ]ZBQW_=g}R;B3RO%GkJ)痍%a^Ts)UӀoˮvbE|6Ǣ%%%a||Gxz޽{K.dW,Xpey x0n`dY2ضN=N~5J=}X;wVڄHMܞlP%۫m:u:\X:}y=ߔլ^X;vEyoqܹ՛oybc[_䳬,w}7f̘3.*2ÇYF?ӳfrjZcccBBcCsҥeee7oyOq(u?,۶mR*<<<==%EDD;vt=٣GcܵkWK111-y/xHC @8|ĨoԩS^>޼<7*DڶV~xyEDDniԨQݻw7wl#8(9 @=GQrBuNgэou4gVH/r])uERanh62E (9 @1pf`1@ (X~1άS `߾}#l6Ç9FmV&M2ƮK۷oz[BBYo"dHUa1ncJHX X4`2ai`Q톟qn\GRÆ ZzM܎G{mݺuTTTK:tb !Zb۳[۝!%O>|>x,kW`%&6w/v 09@Ct%{w9BWXݰFl[M]LuRSS۴i3mڴɓ'Pb6<^ׯK Qrb%;A2>u]jժ wp_[QN4_nCNkK&4`i`$q:+?ʺ6mڴ/AUd4 ?*Oozh-O_ o (! ;Dצ=d QrB,((PJ 8ֽR.VN[}kK ,Xto (! ;%;A2b <{3SpmZ~#!,??_)5ХiP},X0Y,!HrQ WN͟?*..SN.dffze GQ!B9B ⃃:[BBjE-2u[n媫v-&IIIv 09@C !@Bicn=p h`C]L@2(%;A2bAAA[-Yzy4@ &c,?j ׋ŠX0YHX4| ,xHFFK Qrb4d QrB,>Z3eV/X>Ds:ޮ4?R/Kѣ{@sS>JjffaL83buӎXL&SPP7`b18 ,x/gFˑ (! ;%;A2^ +{y?b,?ꫯÆ [vwNސl蓴h[O ~#pf`(ۻ^ia][8v0Ɩ^}Uy4!V%(9 @1pf`1@ (C ݿ>ˋQ4!.& GQB@vn`1@ (C?hCzz>ٳΝ;[_ve?* ~#pd9ֽRA}ZA &cw9FҭjX𐌌 o (! ;%;A2 E8x-X~d޼y<>n׮/r:_HXeû%/X^nK7 G*?1:g+Ah`C233]L@2(g!@x+ĺYuYCW+eh`CRRR]L@2(%;A2n t~G^cQe8h@Kye GQ!:c,%;A2n qӦMӦMjpYS]'aFt $>``2}d7~aѢEW]uUuuE:%KevE &s&[xR*++k֬Y: ^7>(jZTF `r Dd:p8N/Vs (9 /y-]TW޶7[9oVvM5h`Cӽ]L@2(,Pve GŋJq8=>\q֚#6 ,_fvAfY,_|u=PSY mgǕ,_\)iZϞ=Rᆱ؎v-ڦb/aQ (9 @1pXs (9 ~ᚚZ䊯lqϻJ:B=55?Rn{TTTzo.\سg+f|X=T:;vܿ} 6#g z3eҤISLq:m۶=^)J~wQ}K`7qV%@VRR|Ai#GprqCH6?WZ.& GQB@v :Vc#;A2xfbb>kc-44i`8X\o (! ;+3d Qr!X0F\qK;v4<_~.& GQB@v!@#Dc^}tYBE|R*;;[?ӹsg h`dꚚTXXXxxR,m+vޭѣ7Dsh`X?9T̸jTMMt1((K.(E `r Dd8 ,9B0=>[eV-;l۳?RSSYZY4!.& GQB@vc DQC4X >(l={vL֠c%[>u nVСbkR*//o׮]I6}4`YKk֬T~?4PJ屃v 09@C !@+k%<$%%%(9 @1pXs (9 `zKk~:*Wпߑ (! ;DDZe:{`1@ (!3R5A}EDwy!Thhhjjoh`d3 ೌX=!;6믿v:Jݻ[,WB &:g 1k׮Rkv 09@ClfPpKve GLD)i'/ٳرc3]wu|GPJ ޭ-G `r Dd8 ,9B07_-&>^9Nopju@)]QQa>>عIG@[Op_X0Y8t`/VtQkqr@/dffze GQ! ,9B01ĺ_w>ܪ /IIIv 09@Ct:c٠c DQC2URz,}!qqq.& GQB@p WJqϞ=Nsڴi^M8Qrvl=>Nfc]4`[}7SJ_z ,kKӋD,!Nl`_43`SNwz7ٽ{>ZUU>G1GΝ;wf=\nxt{WYYzf{饗R}[oUPPpv8k׮mp+--<Nx b10 ,xe GQB@pM4"##R%%% .t=OI|N3??tt:'x^}U֭[Oc DQB::a3 h`Cӽ]L@2(h`vmW^q c׮]JÇ*Πu}?듟z)}eXs (9 `JΚ[^}P rN4VJm޼o1.T]B#oSJc~m}B]QPnz`"X0Xqqqm۶-RJ=syi [nݰaÆ _|a86׷KҡCNFcVddRfӦM+VO7N;gӇڙ%@c!d Z_YwqlXظ2rfۿRJӴ~wxS;ӧOꫯ{f`|+kNX0 `r Do>&&lIġ!Cw]\5: IDATQlڧw}ѣG[ftmwOnf0KJhptYya;m3nܸhÇ 6ZHpe GZ}^cή% ,xHzzK QrΝ;C> "d~Fs#e9ף,VdTWmٻ~qᓽkݱcRȻAluAtʤ8gLvvv#OiI9,BhyZR=$Yxn:^r ڣcz1{mN*((ؿ'GWf"Z~~tmOpeϩ gZf`IC -|w}8a7Z}h嶏:/&򊫕RIII})>R^4B9綋 RЋbq_~~cXUCJMS5=j =YBHKXGr DĄhWZ).ۻ׷>tתtO&&&+JJJ5}vz(&^IIMX^JuGV^n]|p{)WAO">V_ʺRӸy`DȨ0Xbr d(9 m{k3;h`CRRR]L@2(7nXZZj)j~\\^_* /CBB\?Ժukܰa~9׸'R11aögްv⺄_o{Ý{*/)@?ȸzSHXbr d(9 NoZ,޽{, X:2 (! &˗{O)U'ƥZdT2V N))qs^N9n+ygmRB)춊讵Qm_u]v5΄ŷ98192BhagU>.;GFFQ| ,e˖;v|YoKkO)yf}b-5Q۱ێSu3KQ\\5+ǔ>x;?WRʵս{釚RnZ=ܭ:f̘nݺnUgSJ{'~ʕ+ꪤs9+it'N8qM`222õ笮>Z{NIMNN@_9u fm疜3sk.pv_mvק9  SJu8ߣGT[3 s~#={>|?u:dl ,ao`9??t+2gΜW/A۷o߾} =zteee׸e GQ!nذ8 e1^\Zl4!\f`RSSArrrN۲RChMkmW'! ,TE)]3A9Ҍ|0YfM2ۅ  gha6E4D2#F:t }Yoy9̜93!!!!!a̙Æ spAto (! #Dc,ES7Rߕǟ Xqqq'۷K>Z|w_w7TPpߵ;kfh㰅3|-Gӹdɒ?pȑv9Bę!GZ}cSkONNv' `~״ս{wE/6mӦM[he݌b\wBccU]bI2\y}ׯ_~k5np(nQ9EC >}~566VCul R*q*whuU|>n ,_/}u 6,++ʩwy^,Mܿ:80` ߶mnݪF=&P^cw} ,c`C QJٜjQr9/8 R,]`bTrrrΝRcǎg=ҔVqqqZZZ||#+8Gy*$oKW ½ 3gKƙתUS>Jk̜9s\WfffZVjfff6z' U)xkSF~BFFk -|»ZݮO4m!L0nV)e'4h`3Nh,Y$?ქ)2e޽{3fSjժk׮]v]\aW\B+tG(ԑ#GZ{Oz={n۶S:= (o=aɒ%^' "qOpug 0a siQFsw9rds5jq244"$$8SWW]SST@jkk?W_}W_ׯ_j߾R*))iɿ z}54۷8|g~o۹sg޽Rڵ;x`RRѣGR٧ȑ#W\`rIQu:>mիW֣|ТE._r%/|=a~UV.,Yݒ87vܵ{JHHh0ߪO=Tjj)SVZwߝxC^^>]:}ӦT.3NԩSaÆ{`ѣGllRСCk׮ջWqqq]t9GG+-$no%c ann?;aVmĉ^,nǏ?o޼ѣG7yf3[lq7x|'ooOPrwv;0r{gf{nzBBH zETP@QPȽ^Q!~ B $l6!$̻ξavv= W@Z޿W_}7hNOOg> ։ hdީ6 {MUGOp7MӧXl͚5k֬7'tp:&NbnVUU_{S|t̙֭㎬[n>_hlʀ#0@(\DNgݻM&6L<[^.םmgS`sνm6X}1I3dkoM6+ijz=wfGz|UUUE ٳ/^x믿" #"06{7OO_wu>hѢ{n/ 4<>W!A ( PG" ѣl޵kQVXĨV̶mMЛ6 gѣ&Ksu%9YXVyHo WTrg~caa!bӣnWWW"t=-r1"]+"ڋ8! cǎ͟?ߣ =}C%'''''>|x۶m*@_`u@@rhպ_EV8am̱8r(3gΐAjeDe˖]}n h`4o\s5#";bD"wmHw]"  K}}=\uUr}ةs7(b&iSf(nȑ#E"Q'3n8iI=wYڋ^3Z-!!aܹ3gEz#Ko9s>M6L*h`!~"++% >u@@H2322(Ø=;.7_91#2ҚѣGw$RMMbq\`cЯ] ۶mc_y:dV;v?LCh?##a>C[oX~&.FtTD}ܝoudWվ\0^*dffu(p9a9'G(ȣe Jh.7IsK.1}|h`>X,]wƍ8>>hݿת~`ʕV H ;n&ĩvj=vP>8K".FtHDn0xlda%L0 AAqa0f͚~`G"rݫz Ugc">Rۗ4̂4f̘AQǛ^iwypѐ۶vJ ^yP;u(XB A1饃n4 BAA\޽_~!* gȈ5L{ӱ<݇2 NiH@$ |x^^G5?ԫnWM6ᨨٳonZR NZuWahQUUuAZ3?t:6HOJ~r;B?X3?q)QE)-[HVD /FtHDҊt h4 X  ֭[>SKUC8 qsoO/wqGBB9:t(? 昙_C;_UE~NYN#Qd?P#$$=n$^ k`ok#%hBAA C*2(v71K.%l#*XsM0jN8E*h*0g﫚shV*C )}h&??K 1Ak`.'#?4[EK,QE(bnn.<V4"u&R* .[q'o%Ӂ(:+ ׯ_O_a;~'%1q ' VkVD,!|SE:JDtzR2]h` 4?: Q E5p%R,ZFROћm21֙Ү.0Ve.rxL&{6b(6XB?ଫoop\AK   {7T?e˖/[UH1w+ 玱accxG3FIIpZZTT8N ,UC'ًfAKtQE% N"6}ڴicǎV X#G|wG~[^)h-sss~x 9ܮ&|ٸI$BkZx/e{V'e(ZӐ  ,Ou((;X;y\>|3gre&1pWJ5:VƵ]ovotD¯[I zSE:"2Venr6XJR$L$$T:qu@@謯s=f`9W^KZZNb/gj6ŋ])s}1^ftJ VLu:?$VDn/~#pTNӶ661:V8AX  !eNquFё'pL3xArMNgIJhJX݇JDH0 RZ{2~򈉁 ,AAƲo@dc3AJt/K1zUx X WxZ biR75A|E]]fcc;~D ,QE""Øv@RIɪV|XWU9v[$;MBJ8Z˙ ,7U !bee%ĊiM+v0ue Kt>A OBQE"0bcEkĪxwaJ<, xMjڵidyl(")%)3ݻJ9s[odߊ%| oHWhCDb`ݠmsOmtxc a(  Hb=Tb @&xZt:yo߹ĻV ::Z.D0 ;8⋍ŵ8B_Q]] rZ"ۚ,Z>o޼nm,~pBAAv Er9E:,Rt?!<<%fxÅ+V`W{i`VD 3 6D}F~oM7gBA 9x={DVdH `c5MOk%A:箯~#WOo6oO&]!\p_~!^X ,*++._{MAAB?p͚5j sM Eɮns(ю 77W^ye3̻ sT ǵ huZ-˧ ߾}H XB A]UxN. =0 YYY|/0@(q׮]=(K]'\13H_pn9rM7EGG?:,&ˮˡjYȡy[Ir%q^f`bVO(GcmM^8k6,%%O+C4?$$A(PD_}f4Xe?J^FJelGёݸp߿_.^謫1sV]ѓFS1vmclN'0Ǐ矷n3o/F,! 3 ˉ4v[ _$h`! MMMl0B!!ybL&iEXR:~ءg{l\؉~P;{X!WI I@,ޅuC{:q@~9rٳϜ9ÎP/~GVZ` !29rՠA ABA !5LZrtw)?1Ve3}cǎU} 9I3´ڿ8IX; .pSRRbccplܸq͚5os=gKf`!ϩLY>iO=TFn 9B QE|`8'ާ/ &26'.9uݮR5otꨁ"j*S.@h?9e6& VFFFbb"l`rss[}zKv{? X|wFp98X┴oMDB 4?Eu@_"X ݿfFIg&6AKϝ;v>cp@:ZBx̙͎A;t.&`59]ܳ>[L=XäЃ"?ɓGbeXBO(.'bCAV.(RE!X  !k`IJ߮m.*m`wipՙ_}wܱtwyb aΉ7i0;);^՚L]i$,n,چyNa2Ys0ϟ'qUUUXs 9$^*h`! 5@N6ߊ&[ q:k)xuu58q h`9K#r}[;USwhZخVn yh4'&icvZA^ҢoG/ՒsdeeeփGۤNq% H: Q/X8yN*!1!<<׫dļw[: ! >{o0MdݠqO+1 80&&jjjF%V}Ag`CݬU(i7\QBOYp뭷4H}r2yn.<ɦM֯_~XB,Q*"u0ec&q9H'233^PGa: Q""5E-##_Ff`_MJV|F^RRŽLVKE=^ȷN&o8CXi;æ^듿ɓ'>ZpJ# ޽{Vpӧy" }]iwl0֌+//yG3T.P[; G+V8y^;hjj:|LN05Zi.[ %#DcjRvsOIIa;m`a ?;h)bӦoI̼ҿA4?ѫW/Q dE4G9rH:E6 d0~9uffA`p3nZ UY.C]^<^%M-_l6=zLo&7^fN8sYbѣG}u}ѣGtʯՙasG>=,W,F55*C)(^:t(;C.|wF!?t8.$P@ Z% >uY322222,XZoE,,,\jSO=#ķ2O "% ,0:LjIKW̸?8. F-u̙{YW^G3n՟@vJ~B\[7|s=7***qjY?Je&]+*'E_S"Ɣ%qO>d\\;K3 ,xϿHoetq4օ h`! 4ollpر'|^[j;B ,ڼ0̲%u5XP]]-=!N . ؟)o2N:vXv:w=FL;Zĉ'o~Ќ+3EWI&~a{c;#PSupZΎi3.73,,,]_{dxȩk1OۙSK,%/B`4R֪+렁  H@ B٠b@kXo>%+da1<2t}+W`u&"}X k`wjT_RtnZvH(ȣ+4@6NK}19** b͋M?5 V.0wa^^^^⋐3 "`ɯ,O@ V H: QB66]o03(%&ٳg;ydLLdxp„ 4M+o*(TIbvNJ{mm_@tt40k4RP wܱNՠէ'MW[H45OW h`EQ_kg"$@ AAAHV'((jt꤄Z3 Uדu&j:***rrrjp8>SE(EaZqqq]]$;hhJ"gn:Z$ڽ+%Yƹsi]'@bٕ׶=`Cg -{dy8*rXGflu9eXB X\8Tzc(j]  H N@v?PX2zW۝,h`uEQwҥK#""(ׯ_>}#F`Zd\yLa`34$/͔iK%IqƆArF8]L.2ȕv6NJJ5ZōiupxXuvr6M$`@ X. PGa: QHX… lPYYY^^}:p9R:aB9sG}?|/JKKm6[CCC⬛E ^;4| '% ,+/i 1=f#AX##A$n{>7kذal\}}Ν;Aej\j;dJ X|wF!ADO!h#E;o+(]@:>/^+W~ A B2:!"1d4:zhEERHkCՙ@tn!?~doB_tJ->_wz?8kUwwĉb]ۅJc-{f'euƀ5X>zBX JJJ駟d/(qJbƍ_73cF[ ,,!'!{gDDdP6n2OABA~ Ba_==دa4wWuziJK $ՆJ[FнR㋏-7S#'q<ٹEvxqJ p~Ƕ;+٠AF18šgVz$10TBGct{AuS3"ɐ BA@(!2:JYYh$V(-Ưd"Dj#3f̘iӦM6%o(9r $|UiƑxR%%%&+ig}-UZ#߫JII>*bcc٘h/A&L),!DaW#-FB4?: Aj E!9[?XܳDŨT%MjK3;li.]e˖-[̟?騎Lkj_OgdV&xJj•(ʼniәA`6.*ցmQBa`ƒ p('+hjF}B!{gF_xEzh/y(۷#nBDQQK@|( cX$tGE0.\ŷEHHhנua,҉QV)5oWӯy$(&^5vJ*BG($c^H\SHL&KMMMNN>(@Q搣9Zy~~>l0\JTAD@qq믿f͚O>@ ,O :% >uԑȷA B2:*t: uoc\-ۗƆ;6vSx`!sVŘ%}#X}GzL~ԛŽ|Ǝ!NtlrZv0ۘIHMM5 ϟDIIIܔo"d1Ixk;UwFPZZJm8kX`=Bܠ !H|믿_~ܞA1kf_ܪqצ'^Z*U\\,jFزgWD}Uoڡ^dHvmX['j;sZJ222W^ {t1(Nqi+`B  Kmǟ$[oQa0 ,AD"}=tBCmE[~7tΕo 3xk`iԧO~Ԍd'K%F޽{xd Cل5naK $Gxd ,%!7p ,$ɂ{"\BDVVK@|( cXWQ d2P-8+3}k{Szk-RBX>s# @KBGڥ)I`֭.l mdު%Xh`u1 ,A ?l~뭷t:^(ꐈv͟D)))GddBJkW8[ XC.F~m3 HCAQA-{\-'N$bX5XqCC DQ~ ; l 1t , f`! B %x gyfժUl6{JpLLH$iWzۂ%b16Y;H!Ux"]^b`'q?-/EUn*hj–%7RvӖvωX XKBQ #dwB 4BUBXVVF455M4i޼yUUUuԑxejtA 5v}M7>|xÆ C Y~}O' n#i1btacϪ6g0H Q IDAT<4$},2L&S3Ta%\' %4MǷ:[E.k !1q8=H%F+ jVh`!~ݱ vPGa HC-K"zCX$OIK 2-z_szIz*{{]*.w1S{ؘ50;Xr% X w.tp-[lٲH$Αt±eXBЄ1ةp8 eP.3.#!V{ @ u 5K"z0J]EQ0(h1= 3=SSYJ ^Iduϯk\B:w1j\n6M&h 4R M&* d46Zc:o`iӦ=G:zG)! 1}hX~m(5\=ixY[d܅GB|駟9|}C~ ,A$ᖒt -!tlB=zK/ĎugtN&q={jEQ`2]ߺ1+@ B䰁GKM%"9F[*9l4M\iڲO13xڵkNv &X@ A z7+(A5IJLL_IMXEW^6+ݹNqrT111'i-`ص}!f`D3gΰA@XR%Jpe(+H_2?7Zؤ(?]j&uxBvq:999555={-hf%4 ,J0A'@ogeeR)VAA}48kS>|-I"I*lN=ΠVR$h@ A z@:3Ξ=e/Zi;_{Mo{gujX"$I'$X/ug!y B؟%+W,,,e/sۉ#\W &6~XZ6plٗ"]0 o9Yܧos w3BdFQO4'Vkӹh"?|$?A'$$Xd~(w:_/^r/M>t:6ӧO M/ƖVe`RHϵ?鬪G-q,vElU#!{g XN:ElNkuz2iVD ,O$Atfȷ%5֬Y3dȆgfsֆ;\ܚ1[}'N;vlݺuz>h222QEE2\H)))][:}1,! ,J"N @^^}衇, WTT/^0o,!,--}'`˖-anm`{- c5_zqw0ڰloVZZZ_ڣ{bbL&dtbTT d2@I 8uwU4Sf1aǏ[$ktvEjMf`.<wƀ5K#W|)9ߙ.^xrH ,jݷTݾhρIt 'M_D.ahy3|NW.ӧou a1d4ZL=ouA '+F*3'[Hbё{RSS t7 ]iQ}e7{ V2dHsr'233^PGa <C0Kx"zO/|&b.žvJ͸L)U7"&%%%%%uuu+k.U#,,ux}*Galr Ü;j.!oj̃[K:6:~6X#!{g r'x"_pf@qqLn`NL&1cFs8{X H,>b;R[3IɈٔ-Ep (̙Ɓ!ѻ/gOwk 6OfܝEdZM\s/j}#B4`0#Rf@ՅWz\t)smյ qddd{" X HX!Oiu[3q (dW\M⸸8T oq} 4x'|rڵ|ki;!v6[_4;-̽]9mjMX풒r F+aY[(/m9w!DBn"3ђY3w߾J"xc 15_AKxog+%h`!~*@x:%<[ n1iYDGo ,h6'x8jԨ+W4h[d~LilKq}*etoD {wNrOi9 3x$dЪQ$++JlgO=GλfG9a„VOHܷoV X莎At AKx"zOJ/g`~X>8ZLGerqR2pD$mq}m i_IlϿЭf`]&ct]Q+fnRÇ7pϴ8rX<"1 qUUUQAp}+$3-}=ǏgWpV$:A  vPGa <C^!u:w&}2nRYY/IJ 8"4|`"Q֯ ਮ`J:{VĻlm2){'B"o0 s}1 P(^}URr7Xb3:t^{ XHKBA4Bi}ԩ׳++t ,())e4kkkG?z!}I c`nH&DZbw c/ȗp }_2E*bG Z'j%lDb`sN1V+%r'`"JJJV^K,iHX%]1 m)˫L)ɸX,޼y3}% i4Aw! :TB퇲aÆj4e`@qqqFFFI$}x!Xߖ"H)QopU .t|(@:Y2k B.=-9$"`V[IK1 d|A"V\Zm@S2#iڵ{P)ף664^hjr2,OoýEQBZ=?: 蓾HDe`>}K.:ujFFF#4V>.㗖g"""`V c)njc/뎗رc/LZ|m׫]Wf͂^=z32-{ Op|k֬`lk֬4hиq^ux'VXqqv‚EOˢb(_^kjm ݗxٳg9RuW2`'233^PGa <CPx"zI3XEs]Ӣ\UĝCt:Џk`5g`[f`DX-WƎ0bܾ}p{!ct'@T~sOe`y/X,>/Q\*у.NX<ҶD+XǏgG{챺:Q U:k z+EQdG74iRWWBA4BJ(8I+dca}6>ʶb])NBkDJ&Oԫ4$PVQQB(J"8e%Ӯ(jʔ)r?9rdgVk"YlfoIw<4:z(655l6 E=;rz,y]9:0].5mBA4B.))玼6QuIe%MS+T۷d$'td# gbLLLX{5Lb cv[6SRg);,YT*O>` &1C HW@ !"@t AKx"zZs;- Io%6& yhY'Ij۶m>Y*NKT){ ,7p .Bb`x^W ,~zݫOsWٕJ;IDٳ. %mX^6^j lVrRqRv9]l]za~l45?cNNΞ={&OܡWwT+ =L l7rss7J4ZHwǵƇKu%*Z&8뮻,hDEE]p.XVWW>ㆯV9oawQ@s B`xX3999|Ƀ>+AAB Yl{FNFT,蹕d$..j7HJEEYcîՓr$;*3M'%E>m?СCCRQ^݉3_[fof6]Ж=+( LKG".@}܊T%{ (qKiyܓsoN&~=QQQxkѡCKb\fvi XL^xl6DKy}ZV*h'֭[` IDATĎ'^ٯ[6”>y6*&0v ={̞=3{~`0 V@38qHYP$xۣM\NJ?֗Y=l&]:j- X$88f긛jCr9p Pt8M27-Wڵk=?!::VZԝ9nhU=vVaaG}'Y*rz `qP`rr-rV :GR5e-`]vw^z1m=qd̋& 4)kɉK'{bJ+**<2P 2@#Œ2Xw? $%%1B"~(;Tk>P#G3fL+ͿI: wVOsGh~)/9t`ݧhRSS|mrvx1R[`ăuuubEѿ6۲8o4k+f@eSmuo菱G@}hb8Ba֭Tcƌ yhXלTW\ ,kݺumwٳgaÆSNnug4L!t2EM>}̘1ݧX`AJJJ߾}?̂z XXh ,GNƆG_|EAOѶG@ͺ't@^\كs߿daժUh5$ xC&:&g޸qaN~xՍS2*t^^z%l~.\裏nٲIa1\nouO?gmw·9l~n>-?&}RSSe翍 6kڰ0J#zcGS>yCd]Q@o]X{Kg$lqqq7o§: ύ妎K4|Fl'iiiG%KY҈#> =ʕ+wܩP(>34`ݺu/2LIIp՞?7|Ӳ(BV >bΟ??^Nvtl :>RTJ$6"h=u\.NPTUU`08.7z K,=ztnnnrr2  NLڜ$VH,N˵qwzBdpqq1^t]3U*7߮6G .1}vn)2UޞT<װj*ru]x~˗/̀M!tBS6Nn\y&cCCCx<V0mSwNz+Wtxƒ&0#3`^Pb^]F} fxm?ѴYb@DDĘ1cyt X[as,U! K maH&TTZLjjjj^J!8;z 5^@ZZMCΝ;G> Xa˩FDDܹs6%-=܂ ,XP_k+f3"P`ذ0֫ ߨk„ 6m=z4ٴiӤI< mzqd̋c X MF[)?atP3OVcCAdPI5xl4vp0Z O.k'BLklP/В FDDLz}ӊJ Pm3&ź40wܜX$Bݾ}h•dJ慈>TM%^BN+'>wRuE|! F#6ar 6o8[jk֬M*[DŽ,y(}r l6m FŸמ~޽{; ./_}>AAAm=qd̋cBȼ +V7vB XpV4QeYypjp',m^Mj?AdG*hy9 XȁQ5XX￿gZq罵T)  #vh48quL={RO z1)RKztU1:~TI xΝ|(aђ"j~œTI2ʡ^ XNUQbBBBFŸMXMJz:ŭ1 .aL J/sNxb#sk'6 X$` %UZOMwly\ P Dz(k)2Xȁ%NBZjwތ)KxѓP DGT<뢍&w߭ رc)G ׯ#ip; V+sUTRPBڵt&L@Xr%`="J`Yj B8  qNX ڵ5`0I& קG۷o@_ "-7~z6v4;D ve~L񋋋;uԒ  Xr`lw,JԂ@u,/_ꫯNG_ro?s :p&.=]tAqbW T.׿lTͭRfm%`<3B[Yk .6 fܹsTPجJ=:5X g7}SZi^-Q^Ы,7Kx L űjdee!PDDá L-N7ke{ŕ3fܼy_D'`7*mHMMm)`<#3`^Pb^].-o/5ǁ5nU^x쳙e5z5͉{50<$;w\=-_;?H)mV Qip ׋Z}3f6lXku<ĜD%8'd2;wx3RdpuڙB!6ە!AAZBqG vcu0 Wc?*0j X999hpD:۰t>~ero"YĮX,^jO?Ө7*m`0'I#aܞ} RNzׯdNW[Rݒa0mKxxxHHHeuuf7G5L>&TzիW߰|p#eN M1n(r!٬y!+L%Q.vQՄsXs L|NX C$IE'TGsmL>ΏXf%-V>s "8RV}{'N؍yPGuXA8 <ĘJFe~'fKQC ԅ h'`՘;jm圦Ex<8vU9999.\pB]]]}*$I1hwuo-YtU,`a~Ehu m2FŸ0^33Gf8/Q XUUU/GH&=h,uhRP$&$[nM҇o8 0<'uCkV_+,Zndmm H8~ yg D00XV`2;HEb([yh|G}rrr4`Ԧl_(usxꠁTkΜ9))))))s(T ^G%Ea⌄Pb-5V,w,y=jvDۦ@X|b X {F0R_Xn=͡Ŏ!%RG&ʃ2W1[ca>j :q ƧXp˭_lSgB`LXE9UVKٽo 8([EeF3XL1bw Xƍ3*m̊Porwܡ| L l/k'ȳ| I+!BZFh}ѣG{-=d4X`04I4TVWWpU5f;?C v|xjm~ڵk׮-)q5DK! ۄ }:VdȈNFnמ^f[kד3Nȭ:/)Vt8'$P¸\.>d^~`T,D8%fsC_~8p]I&X,9:thll\.?bnGqURRHH Xd +Z\Q\l[ZKKhygj y*h܍'zq;i!pQ1,(,,l)`<#3`^Pb^]@sn؍,58zcVuZvvCEez 2#ϧ{t&VrPی-dĩޝ;x*,VTH,9rȑTvh׮v?4+:::((zwq%%Ue6 F88VVV?`S$ nNѴYhpȶ3akǎ{_}UhhaÚkjQhe2,Xx=q*5qd̋_ X +4&` /š~zl'`q8@Sϲy dqjWWW4ջ`}^̈ "86""X$FzWIn,Y< bBm Ae:Z aL7z\.&w6XT**>qiճEuGz Yh&,ڪ[SGmqcǎk찭A+ X矧?~̙3N2޾eeyd$aB׆V@}b X {Ё4B()Ks`#K_Xblɼ0T^12 `\}&́TRDuHry1uIJ劀5yd Fdɒ `RR}Xtt4 f$Zu&Uby'"$uZchO,`a|,`aځǑ0/vYDWpTnWҼAAgm~xe̽,LAdG*dA APlߧ5HJp8 zgɂv(/Ȼwc̬?{m?\.}dv`kVk]m6l1B=zI>^xƐ,Z oTLsKx8iep,496r`qܠ&֤%Nhs M3nJƆfGőu+ !_﫲{]F HNNnY6"Ptttoւ muj4ѣv=s2m XoSVɼV^7tR+++J%ds@S&NvJ*xN;~m*-^\K`|Gf8ż BBcMRoјJG9rҤIvҤt(lq~dU.jt- "8" >P]zJ. [nAݺukY6#A ~yPذm۶Q wqj;P|K3ϟxma17;9[gĂ?bF Xi.X`0h$IqhhC*ؾ}+GsŁ5 &Vg>\NO!b A)RE999zG9 IDATbbbЀ^;~x=4};9x 1|X7vlAv:,$ih͝"E XǏD"`sBE VE02 {R KH_ X {|Y~!CΞ=a m*6O*rE2pvo3V`h,oa0ЫW)SL6'z'UA~z <ŋo]ֆўd4+/믿RRSRRNw`n^Cm~NFD"$.-Q*x?vyPYYy>5V^^Hر~זUIM˖Ũư%q2XxVz|28̀yqeӃ ;w jK]駟zh #nͫ슀I̊:$ XDs-ݻw߾}֭[?RL^O "]|kJo L`ͤkѣG_~e=m4Tnԋs0j'xdV\" I\x1YZV~~~Qlu+kl?UWןeķ;wtBsPaֶV}b 0^"558̀yq{zSVmm-$q䜜/XTT4vS, }mc;5h. X*u&khO!7v.`oev$6z'A4IƑ IHBVlfͧH/ W.YYYGiP$OB uCeN &""w+ЦE|!H"Μ9b=Kk8 OrZz%WKFM~j4hmFŸ0  J_4qݹsv+]dRm1u4W@|Nc{!M X7P;KgNc0~ :kй*b$wf U~LF(((#GDFFR_wuuu>hª߳g֭[lp۷+J}4yXRM/M %k׮ݹs;5,}aSBzKt4R95&3cϞ=C|0 X {|YXV]w<ȕ+W6++]\..\]EN $p^ݐcnha2vh[DEE}PBO Y+^G{IOO8R( Uyښ[nM4iƌO=/>0d犭&`E.YD 6m>}g}XB8S]'$2ѣ5*o.ZKY@,[{KgQڷo?aA882S3=e}<_|šCɓ' v@PZo8I\)t&k.*trXz MQ"46ǃq@#]ǏtСC FFFfi{ld=j^z,BBBKT,bp8,ZS-?ZۥQ~2:vXŊZ헅MGѲ_~tiT5#x܁UwBۭ}򷃖ˎ:PwٺO$IzvkB*0!<1 X/#3`^}فEO!9|o&APc2g>ȓA`0ǗL!}6}5X1\vL^nBbQY J:4EN!0t֔K 2f UFz!4Ҥ P Xlf×slwӟp=Ё8/ J'<>K1uն %907n4zq|(j 'MںtJ^zA, 9X`0V+9|YE̷ XW. X #p8[]:煊yqWq`effN0a|>"kIGrG%:IAUp0` `0~ Xp8;w0z#G~S|>Ȑ!U~A5@+ X x饗lB]B/i X`]ޤ6cYdɒ=d0aڄ`P() Pj3R#kn;..W^7onj+}ސ[%x)))\KJl(k׮rrrgs̝7$$6l2lrݺYľTɎ ,`a|,`az  G*88"'IotȾ9GTU'%`k׮GsEC$k6 21WU_^7sRZׂq@'o 6I1(ْ՜$4x͋=ŋhGSU)Z2[gԩرcV?: -%m>(9 ] Xn_ChVџ͛7X,T|~ԓ)g`0.ŁUPPFHLL?;oR υ`:6$޽ Tp=btSs7,Lv x7Nwn^$$&&޺uKc?a:q`1$`S .;:&h5ϣ:vl\OPH$`M9ݩ?q8!uQi~˄yD"X*3)NƏ?^Dΰ0lXs `0/ Xh B\N9%&'" FU:Y.#)!՞:9{\d0]1Wp޻ *())1%dqwL `w8q`QNJ&?v'+c0_n\W+tr`-YI#Ơp wR'hs;eʕ=Xsm=qd / XtV?І$Կ!{,D%`Tsrr5Rue@'D-W%tEqOy ZX3abP5lD Q]SAĸM Ǒ1,Vߺu X {mn[0hVVNwR\"T~Dx?\r[/!Q{[W+)e|8,$$.,ΰt+$w-L=1 X/ѪOE0^Ǒ0,"`uTT6͔[4,ZMXSA,{;R:VXHR(-yj=ŹQzֽ{iiiax;j8w`T1nqdADDaa\RJ!?bfݙ^ KygjW*-#)БG|B'-'$ǼAR8z2b<0^`Gf8EO!T~y2φY4$VC+VuTV 8MΫkzneR欖;x1XDTzHJJj|F?5dȐ2l'TH X>Drbj鞚۷o:tΝ&݁ЦfN̰1>B0uwTh_J|i8GކzrWv^Hn7ި~7ܛgaɈX`0j3X1\iK/AR1+V' ;vڵcǎϷlݣsZyyL׫4 X"kbnweBaהo*QOuL0yz}c cXLd2RN:E,MfN^ac;v elh;S.+Q@yy9Exµ=P$﫯A[7P(rP(lz4` `0~={.^𥆏.}GBy`U /)(m }x۷#Irޝt:]FFFFF֢|UNMc`3аy!"uO7tρy$--:OG/%9WV[ڸ;Ѹgcx 5,ZMZH-}Ν;G%u&AYg2@iiU7'9u \ծrHzb?:`0~0^m=qd͛7?_}m+Jʛ0viPrE;wP=6m3BsrrV#!p{-[Z.`iDd| ,HMMm)`<#38VUU߿ҥK_m(W]NP}"֒k@g͏Pgʂ_:9,T Yꫨ&A͵ n ,+$uڽ{N\oP Anejx3 $ '' ߓ> B;1 82H͛oRar `\jj 5ч~("##gϞ݂ cu $$^^յkWj3++Nj8`ںgBY7ڒNL| , :^GCM P },!Ir–}"N 5I-^g9u[֍rmݡ?c{Rr>8mڴɓ'O4LT֫l˥LRB0&&ƍ}

    }aw@,ȽuK߷:bƌ[nݹsO?M F垶Z*YLLL+"-1Av2J".:0 XODDjS/!lZZZdggS w߹9]ׯPw >bjj`kO-R\&z9n,ٻ /hL80&$Ityſ☛K6Fի !`FJIIٱcK?EVXq̙Beee?7k#4 XF#y%qj~OpHHw`/HE|||]XP>-! WٌiYZ#>ph-^`Azz:DFFR=%%%Uיi@#cRDdMbXz<lBa^! ;d(Sռ*;(bcc`0\pB ,6Vrq7m۶͛7&z/[\FY}|2b<0^33qh%Ŀyft q…m۶SnݺE?~go_5#u!ZVTޓ?(rtt447=_:q)Ҽ(LQt9w\dm ,P%3Mqqq}gEEwܞ@rܽ{sFl6AҬ{otO,@R)b_g"19vGu`18*!!A*mwhhh֐ft.d'N؍)++kݡD,b^|]U'ITN ,0wq`9hO~KR=cf%hI`%K|'<bܸq/޸q#qxѥk"/ddd>|x̘1'++j TTTX`5zjݻƍeeef̔ڿ3PώZmPP`,`aD WTڵkm;6_TrJC%X/ƍVySp'+)Di0vvr['gJeNWZZ mDz`Ī4jyϜ[OX>KY?!.\8'5:%iA ݰLUV}fr&bqd+H.j ֛DRҝ:H;w\.|4MZUUE-P(Ǝ0ff *oY~mX~8kƦ7'⹗Ez !r`Q#Oe!88؍ ,d8 X/ cQ;X~GNGU&bQU*Q$Es, Q,?Nt[l' F8q ʢГkNS쬾9sJKKDz ^U䴴4'E-C{zF?6}f1<"`-[W_ jjL9rL4I Ǒ1@"Q -Pw銐H޽ dR~S~ vB>#Zb !hS s%?.`u֍EforlD\긻 bڞ}]U s`,`aDϞ=z q4 A555EEE-?{/W0\ZP]xXʜ Fcr2.`Z2[MPYO{?ȁamW_jUN;bBtzԑ1ooo޼Gp8E=3$G89t/ 7!HdIJJ2d<$wݽ5鏟-{L.Y$=JE:hX$YlSeE]CBB6Qzq)[_; 8J*hB Ɉq0Lowpڵ 6]vڵPwA9ς,Tگ_?jaf9n޼jSN)))\EK\Dgjkk?TGb]H.>|xӧO\$>ñ 57 d!3gNWt0YnU\7S`3wh:xG,aÆ͜9m0a7LC !A=.:69B奆L'L&>\CTAc:Gvɇ $I_OKK?>BLGh؇9;Q p Ǝ^N1f `;A\L!DOmζ7 K!`, (aQ\zwYtҥK. yyy~{bC XO6dޣa9_*@6.],Z?6=Ro cz9o'`Q둿Ud tsh"/"=9O޶m۶mvhC2J;$mڴiTH 0sR(F#S`s`c;s<(`u̙xիW-<0ƁAP$ϛmr'SO"##"rj_رcGoo^8eWHz\k2r\Xm(`)7^N&Xڕ'&1EK00^m=8RիL c +Wzd^/h'`Q) |܇k_YH[&'W>'x{fuu`-#hb& XgWhX?!wJr޼yΏo߾y-^-gN=v*"\vZ\˗L&ᲫUoli2QlPIQX&#DLLLTf,M괆wVp9;25FTmdz ccX:eR\@XMs'Ѐ+WMٳ=<|h|hNVn׈nӊ:!V*C \~ŋ䒯۽7jr2͢)U1!"R؍=zhc0 0L. Ծ}{WN!8i.BMe 5//ݾ&i_5iLFCV&݁ٽU&K񜀥wEmaX;&G]cFCQ\6~e˖͚5ɓ _,PR ?OmE}4ՋX^^l,#)\k'ou`0mcX:ͣ-Ya3e>l\\\޽:d{&`"P9y,6}ߦa .Sg viO]lC]{"v6;=E͛%NYꟹ=RΞ?O9aXxLg˗`dRA$$$ hbժU-W86T~I&84B"dhQ'NuwdzjcWlvڊk>]dy;0a/ߝ(5lvcj+ҙE(}n)!||1ߎ՝0 <̚5k6o+8|`TB*D viSX e꯸$`DM8v}DeZ hI'.ѡ X$I:"sUb~SgqQ0o,`aDlll[O7THHɞF;\d~ǑKRIsr٪?m9%<\jr},KKK Vχ?ʙ/0яb5^G(8F&I?VHVo2+;:VmQR~,m籪$ɓ=Ij:MJ_ }. @Ю];8sxDYYb>*XeidǞ̷g"E9v_n :d…pZ7X';94;PU%?`_Ѐ*yQdl}5~T~QE[R+L$+`y3ŅfFmX96md6qX/Gڄ_j4 ,`}N; G j|H~~>IS@8B[qTՓ&Mpd[Wߊ>,iˋGS~(~5~l*d][%ჸB>$pZ×%>A+WQH$wA.<")K.7nXCYD3w 9*++|Xjl6["662 SZdV5@QVV. gUxX|&b\'V !Сݻw/k ) QauVT+]e# 䋋N_ն'@qcY^҇ `ˏWEEp/Лqtbk5ɐbe4yr@ƍ`e{l\k2X矪*y>1, \tjt]W0;]lnJ-,p|EQ|~ nEŅUR@F-e i3K?iiy'{y0my饗+^yg˅|҉uTkO!G-4ZnJD=W4ʞx+V52ȅ xTZ09&)_w{駟C(_&,kT]#Oz&`hً߰5ڍ$$$hTV샠(-UUYy.^M17500)cǎ}{з xgE=y7I븐2k.f1@V@ m>:y09:vw{^ai*`9,pтtgZG b|2Er `]v%>1k}1IXX4~dMv_2gtGnTTk5jFɀ$P<= r$tCbW]hfВ~vԀ|`nZp9F?!ݪi,(Xq(XX,~Y F+!ENU؋ ]~W?<ϑ hqɋ76X`.֯uz|t 9,a<::Rjj*8C.ӿ:+? XT8%hRjfgpAh :rz;H6l 6 ;{0^OjyrR"~I[ҁ ejX)`mٲeիWy ߌc]]ݜ9s8䲘F xsY\R{Qoz\(H7N WkC-oFtVѨFqi 81/MV_tn64]>} 66V($ M+AB`44yT h!pŊ&Lp؂g,F(ql8G5mqtj& oq V09ƍ%& ӄCt\W39_~N$I2,, (_ |GƑcڼQ>f2u΂'GN!`"f:KMB.O=sU4@Tzh+kNR͜SfBgS[y4v`M4i޼yFQ4555"U(D剀E;jM2?|JFMگUv 鍍S:W#Z9 6G׮]SRR7(tc`1Qya Ns8! g /YLGtMNd=! F=6^fEwq,c'q|2zxFĝwٖMq v`a0@~Z7j!IOcCXR1]Vii)ReDmܸF*J(*vugϞ~lS%Ͻ*}Ͱo$}=y  ys7ouzɂdwOǿ4?!@Vg}6nܸ'2SmܸĉtkK~خA uoC(dwO|S~|{u/Oγe MiZ E2"ӳ QjtY ,d;]ׁqʢE͛x,sq }o~39Hzhᛑ{$ϽʊqHt!`󪪪]v:NFFFf;>5;|uRzN4S2YQ1K`hccc[, NEEšCvޝndΝ˗/Ϭpg&,DŽH6 ]yW:&TΟ?oX$_`woW@"sV4hs, ]~h4ҏylvt]hNoj('e}ݻ7++kKz~˖-zɓ3Jweڊwڵ_{ }\kEu_m|/|+Nϩ[Vq\*̳L1(,BcNe |j<5*,Vjm[o ƁqٳWZ51mng?7|BLm!tll,ALkǎx +^\غ{,sP،VVлwod=g |/bȑ&Lx;{_|#M6*2M=WycgМw`DDRmU'm?˻,ٳg`iFf+!` ޽{;,S*--( wY :… $D_CofjЧOv*Z%Vn:ZFXtsT47M:ɊZeN)=gLFۏ5Éf5 4V%`X>x$b< k` =_v񜧾Or:d$ 8\د^^^sNz챀q0ɁE X&l4|fV\"=b>%K<3f`}|0b\,Ltz\xsg8"t:]ٞą[  Bp^ʄBBBq X%%%ڲƑF0,L+,,9;`P7n/Ac:d4+a;9Um*\ kÆ XE)6<85rx'F$$$X{Lm*kQ,x 3n gOmQ3(J?vMa IDAT g)1UU 6$b*,<1q V0}H{uUpLkA0L=,YBdVq 韎̦-4pp/sb=zd{wOLQD"!IrL{s|DxTM,ogNEk\zŠ !Z/`Dbp8}G.h(3=~jV᫊rd$Bp , - >l6'L&CZ[gˡ"Vmiiu_ZWkvUkT%O/,xQ񯵵 $ ^_b/DLɛ)myLgOrXUr܋b00,TZ:7?44/bKXn Xr~/}v]l_{ XƣUu VϺ1b0 0wS\z"? :2m'\'L͜|5""BcP*z8Ӂ|H<XQQQQQ1VC3:Sű S+%%rʵkךnrc=6dbbb,1_Tk6%$%,]y?ȜߓFI5,O\ݻn!X_/U_jOKE?t)ecD\FQzs1&W>Ua]E0fؚy+=b tkG"39 tEcO>P(,9(ٰO>Ǐ8m0v|9B4f]mEFSt^kr0lذT =H#5Xtt@Ϟ={ܹ:u:J־}N3AKűD<}|޸|1XB *&zq_#?8AlYv7v!`DW_}U$ի-D":h4o;R]v뭷D/닍G$?Z!8lڴH]y k~&2.rbЊKr`O砃`DDqisC%C6ҹ8:8dׁAl-(]93+ ~'Nmq,qDcA4el?՛իW}|0b\,L~@r֭djRqPN< "OűTmhMNtX8VTjL bW7O>U5]kq- (K; ګW绾eB-AB& D$kk}5[/Lؑ$3IcRn Ӱa:ݬ&jusE'Kyk׮#FN`ĸ X@uԩ~V+ A(94dasQ4N{hM Z ~gTªL+Mpj׻wozEظqpGPn_/zD6nEK^{{ڱ[mxX~J|8eo 0F])Fӕfkύ7Y)ݺuMXM츃2[voddJǴƦfq׭a5Кd {[o\++,,lҤIٳ΀D+ %ǏcnGMjdRjiP(t` h{9t„ Ǐw+V V ;lTŘ]+&,ݎ[|E Obw=*b}?~QİQHh*/[>?>0i:t`0)jEeE 5Fݰ)w跫յkWU^^NKdo M%ϧL&XX ![UMͺ/4|f'hXB7u XL[},$`y9*KOTfssEk9h|`5{ XtFųO:էO{Ը^HLLV;{l@o~^f2M\lٲe&MTjʬ3Zr/~m2MS NJy\x/FKkV~w^?zI!h4@8[Vw*NRwZShZ3,f:Jb!Z(XPњfv=E+++關9珳NQ[mpj8JM&,R<M֯_d/?L6 ^z{;ftSG"c9#`s[BXޥ?q24 `%Wuf|0b\,L1rȖHBpuuuТX{W>e搝*~J58?~Ѥ:NRRR-ZhѢo̅]޽{/^|z}ɘR_' $ JxaW7$7ǍR>>ψxZ2Z#LGim7}-B۞ `h&Vn3gif|aMKU/Wi ʩ?Tz2Na;*`9!DQ0&poi[JKyZވzo1^|G:W#9BAl-NS}āq\pmEn `ۯ.L` hE1/`=ShfRRRzzzJJ =~IxLW_͞=Y{+} b~^1XN'V֭[Q7_9>|j g-5.5A/TVV]|,]vE.$o XC]]J/`s=Vl+2zΜ9g}6w6Exx8ӑt / IHaVUG}ȋ^Prrc*`A2XHqB]3[N ~_q*sk ?jCXXBq`aǗX ̠a4uV[mR4y9, 5XE!k %S'N8zhzܽ{wh|cZEQ JWW//ec&,^pG .vqiؖ-[4|Y9>]1?D{"D2"vpW2܁C`K.}g.Ȅ5dȐ%Ki{, - 8 |ف)s펃(S^;k1D.+k;vLu, YI;~ݻfsKc| ޻Хeee0L6o޼ l⅛n?eXjB;fyyhɈľz%esRQZ"q\8U]UiAP3샚5+-奆]l-OgB tnuu5=J%V':F8B7"D?;?r̒r|ʔ)xɒ%Ν+++;q?svU:{lR746ˆ U=V[K3Js&={TXoׄI{ޝTϑxv`Αi ǀq`s[SXGL46sg5NCcZJFkFZC0aCǷfyW}ݒ%Ks 9ņ7goHuY XGwXdڵkFlKV\Z17u r>q$, ͓%%pn @w`1,`xļ%`ubP$@C wX+V@A֌3ƍ{Vw}ѡ;wt(rBPtkyOjM4.]?tдit:`q X vV%χ4G\=D4vk,` j,.3]\i&$jܢ8M'%%3ѣ{VmmI]EɅ摻|?qtC}hE?[D|p?Bz4F`yG卌'FzDwOnWoSCcDseb5z0lǦh4~1GJC8{z]z5eʔ绹8rV// Xp1$Iw*`ĸo,, oZ6[tL%QbE~}Y555E t~(xEP1-6cڏcǎ%''Ϙ1%裏2O!{Qt`GbD"Z 8q⟲K.e߻8xt+]MWg"q2Q fu^w] fwh,`͚5+##cԨQQcŌXoq2 0`ڵD*D:c- jӧÇ7\.GA0e 226tuAjA/Ap{֐t 0CӛU;w$ 6\v -7EXL[}#΂So(>`6s\5BE]DFFҥ-0LSFBOb Xʏ]|9K$%v.3]8c8'3EH69P{hJJ@ @,7|W(6 a{r٢_rb1`j A4-n X0};/=s7Um$M~E,B yEخc XT nj5ݗ!ttZӁe؟.yU*XwU/Voe8y#ǵǻDEEHIFF… sbqZZԩS] aȄ% ;v ƅ'Y]4;eunM5 'ޠ[(83!OTz믿:p` i ´  d37I-e XwJ_`~m^= &`K`EEő#kׯ:_NYSB$"XD;2}Xן;>C&qTTib^.j8"._LkK=)) 5k VE{Cbby=z<#/CNL.< 9P޽{4hРAqDʭb.,O<sO\V<@bzNBӏ<{HBR@ű13_~RM- r-ׯgo;A,=o"Z {.vTʄ. f,RXXXs~wʍq .Dp|`S'Q G$1Ijǟ05$$dժU>1 ;#G l߾92EY!lKMş)<6(pv/=d3Y2$8"eX5"S2*uQ/#g̘!~yq1& {B@tJ`/bNNNNNΓO> AC/yDH$A[Pe8oh:zVA.$%3XQd~ql-!W. Nj:@:+8x`MkD"٣6ICN۵kW66l;$`!zخXs$bB0ǑyXvە`8hH'Ƒ>u2[*]ݮ"6 O*Ad#5~#`Bt$>q:vƵZ%} \H%pYkB8QWW駟gXɺU9Ip}`LV 'N X b;M]&NS{`| dar`1!8ʿ\  šKUSˁ%Jf%# */UXXh('KꃹľEo 2J,LU7jl'>|Ǐ?eʔyGXܷkD"٫O ~YYYB\ r9. `N_~k,l wNLGV'-Ohrȕ ]M oe@1o0Q{8킉"%u4Ƴlm'_bBE{yYT7Z^_[[KH$5e /2YP_7aSׯm g[: r.^5I%hNoqgeeeeeu 4Fv`:֪I}zN2YT^;6lX;+ƌ,x/ہ;'m#As| }ZJIo0o,\n>͛   QǴ&`V8~gs))[ >?7; ƃnbM&NyEEE&CisEwFc9M n{m~衇HV(El\~x"')]֟hNAAe0?}ϝP~@gH}ޝlц9v /`I$Ǵ,.%;v@j|r/.и fhA`iii|>ʕ,91m$0`XMWc?k6yZz.BnMaCG. `ĸ/ ǻ֭I^~ uS91AP^ ?jkl-_VCI2픗r<5u`=ܯ'h{. 0JKKVpw (93M(7s < 4뿶ܴyLڵAW[r[dС#GLOO4iRff&=O?mU)L[ *|V\bb3LXfZ,dt~No>% m`98(Veeezox.kXC 88_t21V,B D\eW2[ <o?Rt`Q:UT~-GzS;)juj2k Ʌrb3g'-V@=LCk`vƓ-N@ZSgAg O_*cw'|tmݶjժUV1pup$bN01`XD I=H$!!!?΍cLL>+1]]rUc1k4oNL70uhuވ1oz=[V>PZI;X%K|>UT[mom3k9sر_>F4 XYaqX)w4 3SyO}y͛7JԻbh9S=(w*Cg1&&lEݴ ŁiU7RT{|#qXU۱w+ٴi/H~dxd_b6s!`eeeFԁJ;~yXEEE3gd~Q177ܼy;wEQ%%%9deX6Xkk4?PuvJN7ȿߴ Y] XO>djj*3fߨS[zZV~گ+ >>~ܹp8_-b. qV3֮]er{stXj5=-vK`˧P.{p]!<=#-9 z|*sH'Vݎ(ĉE-_a5݄~H|0b\7X NV-[,{vьG @Op*e Xr =vZ;#]mk &Օ@¡V^^ޯz]wO-RSSn?*մَUЬC9Q6Re:FܸL2Q޺7?:ղe2e2?333pq7> *JU-Q^.wf̘4g/B $1LJE12BUUU*-e$9Zd0cc5jHdJSj-SUc/,| H?T`0&`XVB'5攧4j}֟7[Ӆ3U. ߁,L'O>}„ |A ޓ~g\jv$ g<&ٲF[bbb Jwgbz ӓd2s=a< YCm yfʼ<'N Q&77)Ew. I{ŎOqE$~$4$9b8Zq+ܩ2L*RhzXƜCClڴfDo?5m7rhVVVUnJ"aGx`X=?R[/,`N?~|˖-wv)**:y$!"nHy8L:u&Mjڲ*:::''ҥK.] 'P[BB4uExn9~?'0sui=>tɓ8";"##G( G2͹xv`-d2Vl\[$sn]ԛ۩H$yzXXs7nʕcǎ[&$$|DP*9K*2{3\Zj1Jeee_]: `yA2e  X]^6@DDD{$bE01`s=;`L6N=ܦgﻘcK,^;zT얯$ |0b\gV߾}BwSVwvVuzVBi5~W^bXhZRTUUU@UVVFEEJ2l~hK&sq=B?2K[vR R掀Ŋ X߁u &@TTTyy'|M"ʿ7"hViQh@ ͹hzfaVO)ђee4 ^;p|X7Г]vel'̙c0N<镭1X.( M-m{D*++٤J4Yⱀձ|WUD?$ `a0 C2u@qE Ib~NX`Z9 ˿8{ȁ,BdcVyT+`X{d4NH=hE@ 8hZ_!:t狊L&[~ R 6:S0ys  goW6t`(``q{&`cRYYɴ_V=BV>$`aVЉG"ƋsƁA $:={kejG~ q.GM;A8~ `33p@,`)N(`]xQbczڠ[g3H  Ξ=[TT\y֍ #DŇE4G= C1z뭷훜|ykЃxϔ{ߢ@AAzakFtW@-SwxZ:3q\EzB:Jee%VXQ"ЦEJE.Ցt⑈"ǀq`sN#_Ik4'Lxی&k3,`5Ӄq:A~+JR˼v ݯ_?@,?ilV4[h4*MnSY]J^w, IV|"JI^Y|R$el*555vTߡT9`Zo޼ A9 mOL3\rDQT29o/R"mEEҎEQڣCAw&IIIl6HQ#;gN̿{Wb/jE,`uB`q V018+S]9,NJi4~}ԴDF;vlzzzqqqqqqzzq蜣LrKMFR,`555VSs"=OJJ6? up?) #ea^|ۆ '>(paaaM0JDyy9ZnC jQ/Ĝ-SGκ^X9r98z߿=AbqJJL&r.X\.61,qwH!,0;:Hkq-/_;0ЫW/Ku*Ce6vXZ:ZZfͰa^yL&^y!C]*'-X $ЌpV.mYy2֞!')mu[" XHMmt6R%e2= R 0y;v~)33&.]R(!##b YRbR X8q(ʺciq`a0^A"Op'j+` Q㏇~9޶m[sSF+9@5*җdgg7ٜ<-b.Z`eu=t.`uN i"S|n0VTL1$8#Bԁ4YLްQKr~2ͬVmԧ8L!tZ:o$`yB:J}eyv1CDf̙?3=D 8L `b qDYp ONcސזeO>Hq`FXj/t9>iii.\hnyM,\BO1rH4ޱcRT\. S/ؓv\mY,uo,R<; \0-C?ZS5y X3W Ǧ0SBaxx83ԩoGKKxK0eZ.]zIׯ#Fpo-`z @@$$kZZ خ*JQKCD,`ylO?4lN<1^$0V018{Ν8=M2P2DRgt&`<VS|!_XFA!^"sR^|6o&S={,ӌ|9V*x }M:u̙\Uɿ1 }%J=v0a#VžsÄ\FBM,B vdeeуLEk1~{GO!Wڕnj Q_>E mA(cqgϞ---O)[ I!oS--xq }K,9}40,Y2O|MnTCs3[șL&Xl08)q lp]_6o/R$RN._@Ϟ=뮎yӲ2d~!+q9(oB_[J￲)xJ9nm C^^JOFwzZj+FZ+up2;w}>}zD{}3g0k5`4ڭ6QpPQQѭ[߸qC(2k׮cvk'P>CvM{jAq Tٺ!zWM>}ȑnau3\ǒz}$`Mz|\ko ܫY9=%-bq$F#DUE#RKM/ja+{ȱ9HbVg9rdIIIII :f*=d0{Ϊ/pȑ^|ޫ}w=:w\w%w?<\o.뫪"ʜ9s/n믿n2{B<#; _VZku# jiRW,:VF~Z,":]-ϟr)塶)NqH!9ج-]9nVU`0,YIN_L 0}tNu⾸l.cIY&Lkm.0 5ܯXafa]:ZH${=qDBBBBBBNNΞ={D"'cN"5MFc))vXfݺu 22rƌdii)d2&R]]+<ӧOwпnݺ}vڀ)`HbQ~Y{BvRU,,{ת5nDHE Dݣ+6B*CsdNsKFpBBB~]h^%}&#Zֻi&orr2= nN: IDATj_4?ՙF:}uL:1 "SZ`WqN91^' b#qd:X,vGM;#A,-`@bb֭[U*JںuC<^`HE!ۘ7ɨ]^^ ;wnӦMk֬ӖsA)Twԩ{~زesrr֮]_o۶ڶmTppVQHQU!A0^)ڵo)' rI .x+ x]tMtʑ:Ap`y#r`bP$)7*H1>i 'Eu/Qp9HR*W\IIIi[0^z>{c TVVX)EEEh7h4-[]YEEEuuu}GYXmJCF^?Ni˕-|qauK ^ԐUwpݻw_BE֊+fd Q[-\zNVV g6 ]Y1ޢSD 8+ȃ0H gTʼ룦 b|4jB ٪⍞HJC!`@NNN,ӧ=YAjLksUZ_}UVVRtRȚG^a#=K?~lٲX;jWIrX'Zt T*셌0$;hUݡ @|RQƊigʮ4l}xEPPP3߿?11h4^x۷o r\.N~ X@U}%<aB &х"<oN_J7oDX`ZK'蘘()Ve[OߣL+7եaLB聀UXX+⓶|ǧOȂ>7|Js:;v՞pX,3 !V|Q@A(RDtsznQ`EƔ4hIeԌ&O2L9t…ׯ7ŋF>7X !Le:]C5~ #PY`N`80;6>c0?kF˓%uFRyZ/`3'FK.r`t`yP5qR"ފt㲬Vk,{+'9) }Ff_0aYn= Vk6G4Ίz;]}P$_;W@&It`QQѸq۶; HR WS!eLgNjloN z{UNvr:>yV1`82S>7\RB>*QlsݎX:yduܗ,Yb6daadrdژBt`ș2AVr)O"Fd}|h,xxfoͿr;wn?R;ìNTux`r3pd468DiT PU=9*[/2=0`7MIIYՀ;;lh⺡ȑn ^4kmト:8A10 bqt前=Y|?/,HD*h?ZFe"Z]PPzkظq#t `Er p]q * 0?L؋j{ٻ NOLBDz 6a-X췮k]@vW튮UT$ J'$ 餷s?e d;7wN|&Ѽn'gv¨<X0$00Vݘ>mųXu^nͯa5/Tƿ# a!,APjO!Bx+终w\]1]l[_Bu;7*`pG>%ksj+e#ICucJZݲ:3kR:Ww}&hll)/`k'Nֈvh1ݽUYTes,MHH:3|i0zh^̂.IMMIN|QPY#UƸOЇAi9!$$$ 0NF"Wo-`{o_awl% +}w`ց>Cɓ'G4W G?fθV/"?o|`vS-;v|97o;Ru*[īV,yV`.}EqժU'NܳgOfwf;B֘1c^nᇱ';8NxTWU{?2u;QrrY-bkBTGXו)t$!sV (WR~^UQQaſxl5>2Z%,SO=Ul8+o588aaB$&~#aՁ%q:ׯ;cܹW]uYvFn/iH&LD2|paTT 3"T&wuF+ֲRwW Lm zvvر;Z-6vb?\[g^YܿU^' 裏2l Z!&]Em6yJRSǺ8"X!/`awM4Q  #G\B3?\{iBKj\ptH5{lQz)𫯾_~yݺuGrޯUmK5mٞ?GINN....,,7o/?TT5b{eSS"my[yyyw7CgoQLq!CDEEWLl IV4NoRDDDjj*?&i޼yÆ C;RRR:0[X;,"ht`:~n߾'2e3<O_1j(igVN@nEXJX?v֬Ya~~~оp,[mΜ9_-m楲1 iFO;[SycʒhL&\TOȡn"/`溺:Qt硜]ZZ=jԨ:wkMJw5-.u/,Xɂ '|2;;KTy˶}sss{fFLikGj!zBHHsD댔"Wo-` 0qGyd۶mwԩS?7M'Fj p{YcbQL0Zw999=9/o՛66{Ӆݩ q" }] 1ډSc B>W sΕ|sR?Ed*5/`Tc$SR󱣼Ǖ>iҎ/_|YҚ\kI19#kڷA`RSS"y:m0Χ3XT&zu@hA@T*Ք)SޯL[ˈ3-Kg_(}N~Ut^20= BF. 4ޛr:<؃Iyc_4XGMvKN1:q8]VuNSɓ'Ϝ9+?_;GBӗ *binn MU]kw/7si!];/E;Q Inkr XzX,n"RbM:u]@]}zjjjFJy#Uݳvp}([tlOAr`^t{_:JKK矿ۏ?˫.,,ܽ{:Fo4%@jbukNxi8?YXXϗ:1 X=AZEցïP/мe|JϹ doM6 !sX{`C"U_ZKlN:YEX]]]ZZ*F`"5ZcҚ8Kcna1Ʈ02>XsE(b%& _0!BcN/+o57_ar9Ȅ{7QNNNBBBVVرc;d2 J#/`E63 XijvX(?zK{`A7I$wgiА/ય3?MT_M"@4it`P~z0...Q"E5eJ1Q9X:f❉Q5kցc7E[ 7:-6/D֪yu*98ū,S}*4mF̳ٓ[ XAyŶhp榮A ,.oŵ:rHuu5c,>>^\JJJdd$ '=*{BkddG2ƬmE6g鰮=F@$%%eeeuΈN+..nĈg'6Fd޽[oT &yVkD166v~-3"0ּ楞VBDP^xm-g|"?;x Qk^>3!⽾{ngs ̙3gĉ3g n* =\_Gm߾o g}6clAּ]|M 'NH^-f_7Z݋Db>cJJJVVѣFc>"ȑ*`s91RE/uAM"-w lAg5vclʔ)oY6r:Z?}?jܹɓ'/`ʼnֵo[1N=ZxӇ_T\ju˫-R}@t`1fHǎ.$r}Qu|!ݞi:`s"OqqqBB;\YYNLk5Ҡ.PT.[V׋u voq$$$}B !Ҁ @4 G"FE̙N/#UBJ sb |'Vj{ Xkힵ> }زeĉ'M{% _?2ɩ sٶyYe}JX7v/Ś̛7o~?[n@8IfffTTcClAW?R| ѣG>A|tڞczJJJ^{fc[k~=?U^'BC4 G" ȑ,`1&[єcS1gUsYW "5 7밀;<*q{UUUeZrO?3^~)?莤̳_,1ƒ%&&̜9S2(c\x_~y|=Pq=q?-[4i^条clД/+)){7zn&,Qm|de CX572VsN]7fNdr󚗛JK&EjDW k/뮻MBl&={Md(kY}}=c7_%F\=?##Wq1u|^ڙSN$$$UͻVaa| ۰<FhkekVr8\.jCΪ Ud[ X(,U|?%sTuwtV7Z6Oj&NM6?ϗ_~o/## ?|9EQׯ_ٗ /`1Ƃ Vkkn.`QN{ŷI"@)`D?#+vzjf?0[I9}>sWroMqgKO~.or2uĉ>cYYX_mmET~YHB97,Ƙruj0` XŋyOTmu=Ogp"4oܹUU?M6+,ؐÞlxz瘩W\'s/U꘻nReg]l7_~nclʕ7$XXӢt#=mhQ~+ ӥI#GfeekMw'5RuzRL&SZZM7$Om|6p`Xh~{uuիWرcǎV9]qV1vƲ7&xG?ğmLH|Xb?.f^2Jf2kkk7Z6W͎5jg\ / cޓϟ?hР˗|[g(?=WN*m?vؚZk~Gb[~I{c2GY:~|兡.Nk~jI*<-;Z[Vk7 ɜZ5Ww X<dz:?[`ݜ$S[vcLQ[56ܝIII_֐S|\>]G+R" ȑHr$!o}u!~RE5ҮR ?OV8FxEclw7n\pfՍJX]]ڵkZeZ޻S׎ ?ҧ~<&&&999c3_{)i|,->(]m4_࿯p2f:Ϩg4O'ܩ7N; 6unLLsO-ýQk9.>~xP X|UۖZ5!_}B9i@ DXX}}Ta555Iի%c,:S~Kv/({1Z-F XÈ|- LKK_|ŧz*෣G;гս?K+++i V'DhwP))߸ヲ;_z^xwrY~&B%۾ᘁ =ݝaمUX0,ذa}]i;~2dc%nk<pf &=/9"\`n(s/q *_H^Ġ;v̊1>~ON(KW\qٳgD nyySb2X:>|eժU|VAy/.\( yfo\ )ljC⾏/xSÐ!CzWuo=o21w?s1w>5o C²'{k}7w?---YR$y۝VQfXT_n555pܿքV}}4ø_'i: ZOmWz,, ~ @4 G" ȑ/`iGyDK6w`1v.6͉umk- *>F~;J>;N(:mN.שVmgql)kP XTEyvyz~„ _ ,o~뤼|ڵYBh2WwxT:ֶmۺr=3^S9r/нeU`X}b}=tHRpxGz.6\rqqq'g1Q,`9ecV'#2 1ںEiFΙ1f",058.v \}*+`M0DK~xժUYBdMXa|vA㵄pƍk֬oڵkg:$))) ,뎟x[-dO*Jq☏+nڔ).[S\3O 87Mwȑ#G/GMXKJP\u5kOlx7=~֩br^]jL6^HB9i@ DOcK,bٳ>N XƳ&Lck3Lu`=g#:t){$kTV`X[CX6"'|u`5~նs:)k k+`3k"3:AUi*^K$_BxڴiĉG/GxY+b:++K:<~x_R]# ZkkP :0i@ D#|+,ɴh"i|iX.]tG\k~>IQ7UTT+W,//X,|K{&Nܻ-INNM8]Zqqx!IMq|^{)'=-}EL.)UFäI+ #Ri&Qw%̽UZ~mҿ ԁuqhw?ݢ%ʗ2ƦNwc=WQ`ٳgXbŊgώzy +AYt廯bSQQc;c׹ cm3I-3sX:yb#:fsv& K[9J,xfFb}/zVDn=<)ɽv,bvV\d!z$(wItjk/<{d[Ivrw^my]S[[_^eY%2f̘qep @P+11&)337h~9;nvQcMMMO>f{́c-|m\T*XuuuWx[-:&FU444B&*_퟿()[6ַ=M՟s^kx+E7n2?=:k& ޸Wpf X[luQ%7#N8yq eMMMeeeyyy~8iZ/7x/? D#HBP1v]wGFF.]pA WNˏI|b{x֭?6%r%&PGug`UmǺ b{7vk*/ָ"Q>>)vK@/GxE4bOwvy݇_~'XrѣM&Ӓ%KFΊ~f;pQy;cLᩗ=? D#HBV`0^by AM-?i+nM9"1oGaQa|ao,I"HWWf{vpgEmZ\\1준e)jGi׎yo8C^P0k >?A2vXÌ_f]&*UO?СC/"/ÉV4 3~V;:.0i@ D#|[,ԩS҂~X]םsJn4E 6ln|<@\%673T5RtZێ˹Xl~1ͨY.x]b%,zL&S]ZǺ:&66VZt:_r>SRNˆ&ked2M~b $r=E.5[T*(bII/Ze ccLVZ|_ q)`A/Ձ5vd|%ǥ p1Q_oMXj~^ RSS;s%5tґ#G2l6r˛kxO~飏>zb0iQr:7n\h(g͛ǫLJuHKR]|Wsrr ͞:|3Yr_ֶ>}C[sHB9i@ D [JH#UˆhؐLNi˻K/,k3L7$!rγx0k& q͍pfcng8iӦu;Np)Ț{]Ӻ۳& $|ԁu⨌hvm\Į]j=. _{%$$4c\eM;p]~9S1飀r-[6ܠ'>|̑W^y{%)G^rڞ:rJrVTkaiiHHw=UdlEeJ:tW\t? D#HBP  ,袋X7[?aYFG׿,EEEzu뤓&z X)U%Оg嫘Ba|H"t()[=D0\߷.\(B glgƍGCm,Ax˯|##UrKg/I9-Kz_[5yǥJKK M֖|ꩧz⻀Hr$!Ҁ @ X;655|U|?RwCם9%2SoUXb׻2z1oy^7剁i,==j=3v&KVpZSv=|MFٌ /_R~K_Ulsj:JHu+V14[6}{z% [ 3_HM~ƲLc/?'F2Ah^AXzh\h?i^YH&ظOK7:,9AR8.=:#5:̹?VF" ȑHr$!o(`kرkE]Ǔ'Ov "=KnK.߿sȱP HB9i@ D P3fLg/uu !c,?ȊEg z= puQF1r/I r[lYWcQoyF2>|r~G뮻:>uT@U#0i@ D#|CKABFq}(67Cgyp=c5*l_=7:tڦT=QrYLU~]#Gmݺ5;;;dSHr$!Ҁ @ X @/[[}_-}aAtTcJ1;x~Iclshhnټ?kDYz/zff&+))i0< ,i{` ><9mj[7^v2ƎDW| L矗zU*++^Ƙ,,,ܻwtAp X#|\|sg6^i61?Ƶkj7qgmW X @c/Wo,kAk/iNIKiQ0u@6m,>}7m$LOO Xh[[wW]f ֈogx8eʔ'|RށjGh!? D#HBQ|U Bgjavo%k׮?C5 X7ܠNp8bbb, cn̘1+**-]XN<ᦒ*gg[\c Q)A.E\pС;v7.sޢ 8Rv:f̘!ʪ침^(Fʖ_YY_HJJ$^u}˴&Ne:3UG)A*k~n;6\,^^SJJJJMMulIq/)5.Cʳ,P͛7[V~>==y}4[̸Ʉ>m|״2P`QT ,eVqw k}O%w単ju˼92 zȑ# AϷrX,͐aTIkJvX"-@t=i7α@ D" ȑHr$!o(`)KKc|ځBbDzyY{+ڲe44hPvv^w`1"Ɋ+Au`α@ D" ȑHr$!o(`)KKY[cСC1Qn*QNh4{ =c_4c|0iFL*8"erW Xs;#Hr$!Ҁ @ X2ƪBdB ;4233###gRRRr>Ԫsg,hZCP=;{`pAtJR >\~:%3ƎٜԩS(`I(`)WJ^aROeee]]ɓ'*`{ =kҤAYYg}uV^ ʻG>>9 @4 G" ȑ,^,?;T*Ր!CÇف)I&{z !JKK~;w|}r$!i@ D#|Bƫ=cÆ ۻw/ceeeIiF X XQQQQQ!˜1cJ,e ),ipIev`7rȈ~C,yS%&&2ƜN M@血,mׯ4.--Ɗ*`_Ϭhƍ'u:]BBBPn|!c@\|}r$!i@ D#|CKY|W+|xv}a=3_E,BP#J~ |C D" ȑHr$!o(`)K,SSS% Xz!󹄐Qfi=l,; L&Sp]s5999qqqKP,eX@Qc B3 &)XY;]HB$!Ҁ @4 G"t J[?X\\)J? .ݵkb5dȐ#G|# ȑHB9i@ D ,e x ht3 ڴaԨQB1f2ƍ7a~fAli@ D" ȑHr$!o(`)KX x=z)??'N:[ni XXL $###8s:cw`]yIII=>-BKY*VU+:U Μ$777S蕺ZZxq9Ҁ @ D#HBߺP*`u.QZ+'''S\Bٯ_؋.Gi@ D" ȑHr$!o(`)K{`;j6q?~^إ'@u%Xx=z)?2ƦL$;˗fffmNA)J4Ԟr9 @4 G" ȑ,]i`1=^&h=9Ҁ @ D#HBPRt` X 2B@4 G"HB97;{`)| !; PR7qG u` XU0777S蕔ցi@ D" ȑHr$!oPt`~v=%%%S뮜pOWRZ 9Ҁ @ D#HBPRnV+fΜ@a !*Kw:$PR "g>ȑHB$!Ҁ @4 G"&9 yv߂ z-~?_qqqFF?O03=WAx-!S$,!Ȯ]n8AڿZ\\|5^s5'O9RJ[/a@n馤-[.?~|QQQQQg̘W+=^IiXȑHB$!Ҁ @4 G"#{,;;KW>sz!d2zɓ'Y'~ aqqq+)i@ D" ȑHr$!ob/gn?,?,((>|xD999Ecz=?_&M G#Hr$!Ҁ @4\WߪۗTTT7;s:}v9~03=WBQƟ볳+?o߾#Ftsd`,&e];ϼ;W\qEX^ ?H@ŋnݺ|򺺺e˖m۶mѢE!b~|7 XȑHB$!Ҁ @4 G"#,^|w۷oرcƍzbpO @4 G"HB9֠A>Ӟx_w`pORTr9 @4 G" ȑape&О:Be!܁ST@血, z+Eu`!G#Hr$!Ҁ @{*1{.~TVVJꄄC=WA`,hKC}DY/!)j !@血,7qz) 9Ҁ @ D#HBzR}g5k,^:N"Jcͦj;a{`A{=GE^~T*  @血,pO %4# ȑHB9i@ DTϛ+..z+E# ȑHB9i@ Dwlw6qniL0a׮]覦pOcĽ ܁ST@血,OA}J$B)Bo,Hr$!i@ D#|{K=/\'%%UVVw>?߿iii1W`,hOQX} X"&yyyBoMܑ# ȑHB9i@ DTXBo,Hr$!i@ D#|CKYFc[) 9Ҁ @ D#HBPRAb,:B,e!܁ST@血,Msss=JQXȑHB$!Ҁ @4 G"&9 yvߎ;&M$njgϞ`k׮eM:u֭@zCLJ,!Ձz(`) X Xǡ, S&ȑHB$!Ҁ @4 G";;{`8p`Ĉxڴi[l |@ ,YzjجY֯_t {`XB) PR=} X"X!SՁi@ D" ȑHr$!o(`) M܋=JQXȑHB$!Ҁ @4 G"FDB%F z+Eu`!G#Hr$!Ҁ @ XBST@血,} XBxpORBHr$!i@ D#|#U"!œpORTr9 @4 G" ȑ,XB) PRX0Eu` XB)VB4 G"HB9= r7qOOOzS.]16}p9 @ D#HBQ=31s:f?;?\T,+Q`(`)[+777S @4 G"HB9ޱT1f0V+co=`>w`a !CKPCKqn4 G#Hr$!Ҁ @[[O큕P[[[t+=`>KPRPR{`544{ ȑHB$!Ҁ @4 G"dP\\)@ G#Hr$!Ҁ @[Om➙y زe|pO/Ľ 0(`)6qCKq)@ G#Hr$!Ҁ @[[O큕]PP[j՝w{`!XB ⠀ P-`{ ȑHB$!Ҁ @4 G"ۉm➞)@ G#Hr$!Ҁ @ T;FcAi@ D" ȑHr$!o(`)@`PRr,=rss=Hr$!i@ D#|DQ Lz ,P4 D=Hr$!i@ D#|C B8S @4 G"HB9ޱ9:6qP8l} Xh(`A{ ȑHB$!Ҁ @4 G";X =B  ,pO9Ҁ @ D#HBPIOO # ȑoc":hhCǝ?'9K˰)LkVLЙM0 sr C q}'sI{#%@D9QD%@D'ѹ;qw<`@`{:ʁ (:Jrĸ8,h,t>,:ʁ (:Jrĸ8,h,t۷o{:ʁ (:Jr`x:ʁ (:Jrĸ9:7q8n,h,t|o@G9QD@G QtX= Do@G9QD@G QtlX (:J ("ʁ Dzf7o^HHH```xxxvvv'Ɩz X'OήHKKKLLܶmkl6LbdX<~ ZjզMz򰨨hΜ9/_V?~Ϟ=kƍKHHpwJI(>"ʁr("ʁ ("An޼5tVHo]p .1 W;6bË/5J{~c@TΎT]]=tPZڵP?p:CLNOǝ_̌hbjG*ӧ]622RTSS^n1 Z_yy̙3-K燅Wc@Vn1cƍfsݨ,JVVٳ=~ AKLիWϟ?ݿ{ԨQ-ZlNعsgaaO>c@`5`0(ׯ__bEnnNX,[n߿gix~xx,h,h,h,h,h؀Ro+((7 zT6o޼fO Μ9hѢ>3SLoOXn޼9dȐfW( } ]: )---,,oĈWQZo}}}]O ӟyh2]O'v=888..RKDWm*l6LbdX}."...44ԩS-w^Ri IDATFL<*;;"---11q۶m]""!!aǏ_W^aÆu)t|ׯ_^$XZ(㋊>\WWgZVkBpK/)DwޝRZZZZZk׮˗+tBnn/^\RRrҥȘG%u+6gm ]k,X^Y`Ajj΃G}G*k{zXXX8h C"AXlU" ZtB^^^TTԃv(g}ٳC"ڵkk׮+t¤Ivܩ^پ}{zzrMD!x~[ 0Qv(VXWm*k׮Cp8 vߑT]]=tPZ!Xԟ:uu:bҥׯw=T^%@fϞm޽ܱ%44… Э[7Ѹcn۷on4'e)**۷{\+DESSSttϛh׽/(ժ^ٱcCf"Fx~[ pw2&&&333""g#R~WVVݻŋIII> ''ŋk֬A^999~~~}Y|ybb|C >7x#$$$$$7ܴisx h͛7:tСC> 11qʕYYYnݺu֮]VZե C <,~Vjjj+:T֔ӧ]622RND+{qtʕ+wOKDq͙3'??_FcTTz_<{rMDܺuСCK,Q/QV5:::((((((::j+tl>x] Я_m۶eddK%Y`WѸHe(//9sfrrbiEDq3n+t•+W Wt "˩x/~/ΝEQVV6fʘ1cʔk:byyy &LP(kkVXQQQYYYꕬٳg{i#5b_}Ճv(iӦeggWVV:7nرwGUv((U"l6իIII=z8KG!ܽ{wĉVjΝF1//O%@;uԖDEZZZ>\[[O>KGQ̚5p\reɒ%K.umQ}֬ Nkע_u;RY Z-X[[z7gӫW3gΨ@G5sB͍Qgݻw\\~P^^`nݺM0~PQǏ?rH[DŁ `?~ջt¾};lذ[666wYJMY:  3X4X4X4X4X4X4X4X4X4X4X4X4X4X4XE{2`:,t:}0W%Kw:w]lh4 ]_ɓƍ0`;XOx뭷&Nxʕ3gl-[Ǐ7?}zڴi~kԩSo t:… GrJe+''/:;X~UZZڧOe.00J߾}o߾|ر!C([#GqF}' 3La+ʓup8_K.{z XA=zЊ" ܩ <`x_wN=Ȝi0A=zZnVkuu;wrssg͚{`x^U +˚5k߿Z,>44@`@`@`@`@`@xA9g9IENDB`gsl-2.6/doc/images/multilarge.png0000644016036000116100000027334513510457027013775 00000000000000PNG  IHDR bKGD IDATxg@.IbC+`_C4|j4*赡1*MbF @,ҋvwkavYe;k̙3/gEQf:t3@#yh:@<4gF t3@#yh:@<4gF t3@#yh:@<Bqtt|EoO3)fumfee͚5Kvɥ*oDff 'LE/?iff]r8 VVV{~5r|޾}{666?Rzrt:o[nΜ9E)>n͚5^^^;v쐼 O~իձ3#####gϞ ,===Աkho`Ŋ֭ۺu+4ӧ;::^vM%[ˑˠ8Jw á(j'O={"6^4ŋnnnN:t(<77VVVm͛~gdڴiAAA/=s̸qrssTkPt\vmƌޯN**Um WڵkWTTTAAACN:baaaaariI䲳#&S]]h"'''fK.zxx0W{СC-,,Ν[UUE(s/2 srr.\heetҚ9a3JN$//ٙYm۶ǫ|4t钇a*]0enjh NNN<yʔ)>dU@.NA"(88?^4vXV>EGG?t7m*>}ƍǏ9r)S֯_Ϭ_*L^^^r#s{zz4iӦ]+qwwOMMeDN:]p2Wӂ|>YR[[kll,IIIaAZUo.D Y%rKѣG_|:++k͎ e)<PT_wԩ=33VFFFv.={*~1M6NNNYYrsI/ԩ$\Ho̙3...=R՟>}'cffVVV*_{MQ?0vX+*Msiij !ݩ fV@ Lҭs\ ,A.NA~׬YtR"f[ Vύ(cccFFFE\.YYrSCDK?aÆݾ}jf6{ '''zhz3"bk׮O(>##CQd6B@9"_|믿t)Da$*9,lh2L Ê+Ν;w}fSaa!Y|Vunn.;)mBC^^2󭍍ͫWK={&Ç޽G@ =L=7nosnn.2-#'Ox#G$XXXL>~hhuȟݻ̒{u҅YN@8ݤIv),)G2K9.faCK/B.NA@cc~aܹb.ٳSN<ٳgOkSSڦ(<<93ӠA:,a6ٱcׯ3ٳGz#զ۽{*ذÇoܸQzO9m2dȁ%B#66Ynݺ+Wo,XgϞׯ_\]yAg߿̒ .ѣ6.8qSfT>9ǥCۗY\";B.,Ydk׮Jf.,,_$K}}};& EEEϟx葓_PPPPPcǎS9x`/_\YY˗ϙ3H42eԩS 6l{IבH͛7<9m~䉓Ӷm$nݺ9)KttX,f>|}d2OOuWޒ1x>}DGGj|2sĉ;wDTa$*9%m˫֭sppHJJbA.NAJNرcffffff'N9sC\.xk<99yĈVVVfffY1lfffgg7gΜBk;t۶m% ˗SN5kVyyy/\6Kinnngg7{ʆؘ^ ӧegϞ;jرϟ?g.?MLLTGhr$ "L%o5J˅ ƍgooڴi3}4f2Ԑ м_ם;wHHHy&=UUUh-.S}\{tرc\RVVVTToEDD,YDۍR h!`@*!Lrt<讣Gnڴ"oѢEӦMv TgF`6@#yh:@<4gF t3@#yh:@yСvC 3<=4R[HH=8xBFo Uo!чF~ "B=i K[HBFC#uDԏal -L-<4B_;k`lH֬Y&4B[HBFC#u`tC#uTo!чF~ '%>HsQ_3@#yh:ϪShhhTTTvv*γPEQTUUÇ=z>|Xu9J3;46%ݹsgȐ!qqqJ: Rݗ,Yi&$''g…VVVK.!_v~˯ γz7ҥK۾}fddDEEB$Eɯn <<"<<\ h`Miw6!ήJzQIII^.ZI^ƪ{ Ï öX,GbԬ]s.##TYdhyVϟJ^/_<>>/^(Z$5b*P@@-O 0pǏ >|pBB;TYbbb"""bbb4Sγݽ{w˖-aզҽ{үMMMkkk9 9`ضDk׮_2dΝ;}||$F'nܸZs`a<):u---'L@W&v)55y1yƍK.511gS4a e t3@#yh:@']T(##cΝ+..ܹ+&M$%NotZyI?0etvV4 Vg|eO:ս{wBHrrݻ$f͚'-[k޽{GӧOwuu}w}wر±ۻ'nA9[ۭPY|n>KO/ute{9uڵkoܸA OM&s^zBf͚n:{D@7|n>K n2F߶lBQ3\SSw8p 33r%Ξ={%6γ}7 *--x"|iiiرEMMdы/ܴXh:Ϫnݺ/(::z۶mtÇN@ 988dggwAmbϟOOO߶mEQϟ.kZ{c3vhx풒gz{{BRSS}ݤ$[[[BԩS9ƍߟpٶg̘⒜JfꫯFE :_)RH5lY$ϟ?uTIϙҥK)S̟?_6::۩STgwwk׮=~8((j޼y'O,ڸqҥKMLLMk~oܸ{ .888te޼y&LhtQ6 >9((h̙uֲeF%rR ;{URR"s)tMKH3q3ǜX: ˗/O4i޼yr9;;|Siy-I˝gT666VVV =zÇo޼z @p p@@:YiLQEQHIIYn]C5O8ѿSSS77O>$22rB擥`0"""⪪"""=)9 >HgU|:Ќ3gTrAAwEEj*Y\?dG?cttǏ|-Z4h f{}7qqqEEE˗/֭]XZZv壏>TxBX[[K^[YYi=%L| G"& իWaaۯ~عsgAA+Wx<:thȐ! {6lءCdE Xbݺu[naa@qzz鬿t߹sg+:to߾jmvر sss__#GY^Ӆ ^p?n۶-wss[x.\.֭[3f۶mq 377 vs@/@:ڸaÆ͟?w޶Ν[jծ]Fe 7o^~<Lg0S򜚚:~xssC0]vR33SSSMUWW;88TVV6[TTtʕO??3gNMb7iŋo޼%)))C!… ~~~̵>~/^133={YuRRRۋ/D"BȊ+֭[h{x3fh T>7PtsM6]zImM@}ԗ20L͛W\\7P fh:@<48Çe.|{t -:[nΜ9yg|>ntvUPPPSNXXXXXX>}^p-ZDp8UUUs̱sppXlEQͳYhP(7pB+++OOϥKԨ`@z~hʛ6muցݸqwމ2dEQΝ[xٳg%f͚5dȐwyښ^ghh1c^|9} & 0`̘1ӧO>~С_5]rڵ &''K7W^ 룑G<^ 0dB[.*Röe022ڽ{\UUZtQF1KFD7nǏO󫬬d 뚚kvܜedd49yGT*nAA#)??~ۦM1 %ùY%eee˗/?x/$FDf 4 O ]+V6m?]TXXضm[ٙ~7%|ᄄ777[x>adBP/O<7~;w+Wž={:uyɓ'{쩪VWWoۤչ]¸]ADDDbbbPPPLLA:;C Ø>Soo Jǿ۷o2d!䯿Zhљ3gڂtSr87߿?!!ȑ#EKxxx\\uXXXll4 &RNܐٶsUUU~EǏc$Ge RF9ܤ!TyVYuyy䵕UYYv2& *mT& @k3ӏ7>COOOcccWW=zTۍW111aaaaaa111n+ !t~ 9s===+**nݺlٲѣGGEE_@}Zx @g^zȯxAʰ @p3rnt˗/O4i޼yn t@:؄ZYYEFF*/@naa.)3M.tV@4wQaa >쳏>h+ػ$bccbSFYHg al3g̔_Ƴuyy䵕UYYv`Zl4,@0a[^  @!v;wVfnn#)^0!iHgã㦆 6޽{;wnժUv1b[0oh1'"""bbb"RFHg!5^|tbnnxG6͆Gi줤$4hY ! 5s2Oc+~n' .aitٶd`,a2c`C:kXK 2GvyyyVVV"Zŧ#B: l ԯ4;@cƶ/Xh}nHg!um+)JS$ !e Y$3*mirnW*Q>70THg]γ`SƯ^b-3'T!rB:L%%%I!yZ,* &HgÆ3~iybOuC:$t ̹P5hOj|Z!1Z]Uxb?PN O _7 Hgu=Ϡ$i83.]Yџ P3C:*t YDDDUUUEDDhi|_d<%t0xHgCγ!ktw2Ŭޒ#s- S1Hgt6T<'l-fj2S"T `2hMNJOOgvd~y++j´v )|n,Hgt.F="3zZo&A( @ uRAxF|BuyyʪLyd>BVĠz͇Q>7 3>B:>< _ߞY8w.FWdN7LB/U-2*M'p/6! 3^C:d~jͺz7ZAY6]6|q"g@(wn.>a@FkVN}P_j9)Z-sI5 <+%n<8 ]XBa̓} s~裑{x=B!˯޵u_j9)Z-sm+ͰJz6s&Y`REM+BHz+Eb̚@Vl7Dƥ-ʔo*ik6w}Bt"eyuHgt6<<o)v%$Zk)k- !w2j@Pu˪:y~O;x\cG]`B?_(/;YzIGWA: A2qS70Lz€_ߝ5ulڬxxJᬟ𫋍 WꡟUq?-$oϧFVSY}.iRF3 s~V==ϴXuE oDDDUUUEDDUb{΄j)k?<%ngq> 2 OVS҃G`VVk1\g=U `Ά g=|}ߓC^Ug_r|;) ONWVN|Y+bD2NX_d*|^02x:~Zu bD:;BY0X YGr(񾙾RphIz;/\z8bPg/RHezfIrƫ/O;1W|۫Po+ZV:KU뎒ݱ^^^<#\#2@)f|F: t uAfK׉s{~!rJK۞O=LQb5S;4ڦșw\v3=#/>TgYZ%y\yM `gf^Dbk޺G8 䥳Exx@ `.mgiB\*Hg݄γX;:êQAl2ۇOVA wJF1gFDSyP֐:g.H%=~|S#h~P7sJ2ݔԾ{@Av>x쯹4yɳ+!ݜ@ ҏ^*;ܡuNb t޶-sf2mX1 Hgγ^Uά :G g{ծ_8 OC{:uf }UF^U9ĥ`kYphdߨܧpE ̞YB _ә2(\..guZgt5<%)egQ9wWrdw7ﵧg*^}f>ax =yI{" #G/QQ0BH;S+,84IeĻKv3w*D:V:BZ&όcbX8Ut5Z<_|yҤI[nժUHHHL;B  c2)H҄å/>{_ztR%u(q̒C3_aU3p22kӈȱ>|.(Ga = Z9|P{O[*}ڏT||\M /әҿ\zXrMx C:uCCC_xq񼼼ݻw_O3Ԋz:>z]w_ Up yK]#ҏ 'eE>~vȓ3!s61s׌!j?)0<Y<}\#^`ŷomf9Uttה3hfƖA^NZ>pB߾}7h196~ϤډOiնH$LyKgx=$g^VIN~^䓜1@Μ0ϥ#; ;8Y>j;by[ ,t&+]z[4i&J^V#3%:9wwhF:e u:6l`j߾}VVkc3ג<:ʼ^mh03,ߢv^y.`My|I׊L҇H?}ӎZnmlX9enq ,t6'+8U}B3nj(i;j6;z κCW& ;s挟>^ggg>2uԴ44L+$ ue 2oZ\af{ǥeV+lP`7j%فnm[3jVf/a7qTxkHg9C_g.ޗزQ!rHeVyJN"@5|s1I~~}U~Љsqqʕ+l"ѣ>\^^~;w(qL8Nddj2bǯ5|VV%֤EDDZ<%v,Zy3%uz_p8 7!ҒHnR>|-U4DFFLmK N9O =ZL:"R9^m:t1ے*[ŬE7*^tr9''gذaWo_j<֬gxJ(x\JbҨ7wj / oҙrP旺N2X47w2W~˾yL>x@@)# 'L)al 吞s?)RoڂeDt&$+wO!tt~kS7N9S n)\n ө-Hg] ?i#(7LH:"Xt/i=h?6 n+))),,O\Ro E~}tO:_'$y5'k*jJY5vE:htfڷ7 EZk,ףTF}bŊ#|n8áO`4h޼y>x͛Ϟ=jADDīWonyΰTV;e>*D\KzE(n9d"fݬ7S|yޟb=J,c Y҄퇇*VPoKiUu|% ,+cbb'p>VaޫgE=٘rLH֝WV̚mZx593ӗ!;X~xxx~g_E\#nChsrrɓYсIJr?--ի={p5"C'&qaa=[[~[d jw'!esFqGG$YzZ#iIII7NNյf1o t΄SWi?UUݹ=~__[xcӿD} ' d3!Yw^տX6A:;RgB9/L$? Aôvۢ1G-bʬn$7$d2eʔ[n]"^C5]NM]uZ~2!$9#.; _{GٷVJg%?5vba{fbs5x Y>V:Y4x1NeMw缋our:QR6KuG-̶ܿ{m&5ίD5/C- Ktfj%lCț^s~ZYzd^CU%p {n2"4xq{&0#o.O[/vx<,@[2⶝_VP}$'eHUo+(p4zIM֢7ܞZG^ZEKGts&fmKW&DҚ4ݹ{۹L^Yz@w2{BV^9%Z'ܷ2_=-)ӹ$JXQ iM_ utfxgS {{a/.lHd;UCe '}(:)9F\ʓeg/Yz#=?h:ϺP*v܍~|Ѕ|uώسS$/}F%[FѣO Tmk3XIf쬬mtx>fލg¥ѥOY5['15N(ioubGErMevbykm{J^ N#k'70m7 wlWمG=obq_c[x :Ϻ̽11ۆgZSC>gwvh3*@d]#i~7VwKد}OVW?%ТNۡWԗʠ*ތw^ɸKiǾx>극qgK8oٕzzߏoFsxѬXY"t<ZԻV4K_6D<_En<̢w>; &]0BY*q=Yu;Ut-QBҥZγNOewڥwe܊a IDATLmll^zۄVf>ٻ+)yVI~wVymv8N |Fbt(9ϊ^]{kݨ"QP- "&^2|neoFoKz?=6s-L7FnYqY#HҙU<_}2$m2'tZ_|eЬE",+Ǭ_i8 xq[/?K)<봸j{[I!!^"M=~$9ӲhݬfY/۳zvGvvpjC`n=z)m̂?oӅ;x]ujtq]37UR%%=v}7+^$@w)ްM{Kgz~7s̎1B{nٸN_67ܳ.z{3f޾799PUՇ/NBܺل @YIvD$y  cu вYO keGT& q7l_^U t N>#qӹ[Vte5ygc")>֛}hBHUmBy */;'rA;"޼GY;K'K"ňY8ֺw{,e1_;(%o DdvIW>I24K+6% 49Xx?'ITaZh0sWoGGnvGgc[u"&~1ՊO:5"oLeG׮['/Mf>.X XB3&IVmB2_VMj#sf@_*.vFv&ʦ){lQata_*5~z 4E:Y|\{&s EVtbU̧,ّiN m;|K*}8=@X\Y@3N$;mгn6"3}.-yGK\f} &P'`.]מΖ*,̣;9ɺKvYGn @!' .K.ur%+Ύ&>jU#_p8nNzts8N @䤳TY~88&T1cЎX=kwxST-G|ج󬣲Sssx/Ȋ{{."5)BͿ r0BVv|{ k0kSޤ % 9 [ OhiXJѯ|fGƋ^}f/{q Wth}_m!JN:zΪ@>TIϗL?;b3ktxAzR!4::B*{$F+nέؚMn*⒐"$j J_*>-ʪlvANfwhO_@[BkbVihfޛ z{* w==TL;f&^3RpBS['&&"ԧtJ̰[s򡺯țń3q ФI9Owȇ.JFrγy7>Mݎ$;v(r-E2g(rYIԧ؜R^þ9JyK׈0FnC&Sk=BߏlM;kjy a?~HW?@wS0c*D:OC[oXM|[ގ۠M-ygbsy k_RJRw|~ߠn<$+EέwmxDt 넖@ HLL Z+XzEP3 Q:UӸJ@J2\ܵ&E22囻ZyKw1rZ2@7vetZk\PirOd{. .>@mJ[j r!D4 ;2cB]-Eyd׶ft"穏OoA3[{ͭtw*rihņHg*넖]C|ũDf@Md0U$(2!D$)wIv#16X"f}&5 /o+S[ ᯟ0o~d(sKF2C3DPZvfqSvV{UVN}Ҹ9;b&}[r8% 2Wu@YISWVU~NrOhIe1{W^EC`VM:pu=}35EDDVoDDDǞwWqgЅŷ<.o9T9y-oԅyv@?~,}Bu@ לUml#B}FLmINf>"UoY}ך^WUI͹#%Q~cW %qFw-۵N#1oʎ5̢&}GtФTF^f^e9qtn}gek>I:w?v c6F{y-1116vٗUr8]}WJHL)Pk09ÚU8WD5_@@% YXmhyv\=KKޔW$C՘z$÷;;n>,4(%zX(/Y13zN]=ԱkI:=}3vߝ8/*zϏt5AYxyyZ!jrD]D<[(}|hqtqmTFS׷Ǽc;!Q)?˩]XҞ8Ti gM])N0,+y\ x>uVuq<|ǵ1F>oFwϒ50B2<ʬŌ+222 wOc-O!f/ 9Q̙2IG߈PNLgZ[F6:z;=~őÜ>BxmgT}W~]E,W؉\=18:#"9.Gj7۷~,_w[<뽒J.J"exվU=tX@)btU.wScOC6`'a%oO}؏ # "5UZaÒ Ujp^ϩ Fgq?"6i r yx6Gp/7)ՁgjƔn@`lF U?Aݒс"N {$٥:^?g3v̢sBr7|xQAsgOq_R>uv7d")#Q<"Z<[i4%Ҟ w6,~M QDr]YЩ!w}rQ0zl_x`ɳP[[p*ó}BG+W>Y/`( ˪O\oyIEj B;Za5s{|J.l{F_w48w?996ȞMQ[[678Rj<+x[b$B#scAKFRg/oaٛ\ 55yٽ{mۂm۶{=3رXoOW*ivljV?Z6Wo i`(?jcMOoE E1O'X"6=Ά̺lbVVͩ˗>O";)oΔw - bǎP}sܟ9j~KZ?G]yȝZMEe8n1ynnn~'d2_|z֣G.Y?d;wlnn6VL^^bF>ڈw%2ؘFs l'f p3T["ücB2 ̦٠ Omx֖ D"·?TJH{W}W}5~n !+)YC? ~qn!?ɵ:2;K'or)pbu_WQQQ......QQQ/^/]+&n"oc.V\m7g-&۷o]zY&77w3ͱYrM PvFA ~,Y\;j4v8^1xrEf*BѲ!V`oP1lP>̬LTZ;^p8s97q'}BHt%)c=F4-ې[o ф.YMWYQd5!S!Ocogp~0O?t2!a'H1#Ͼ^,3:) h 1Mw>yLRM'԰5^nZ@g p~C-OaAwpq->CgU_yn3 '2Ye(9AV_ųx|IrdEw]<4-fʕ)~/\!99yϞ=>h{" ӇDɒew' ~ ^n:OcEl9WxtQ&: I ,Цoyۓ#.0#,U_q]'':szArLQKvڙbb!CCCCF^̶k5ՄzzvP {WRSh=T^eP}i]GuiL_s}ȭI Xx.д(f麼6㯂cgxSg5>.͍bO!f;s?Yx(pzLZ ]\]]?ۆw11ka2 >.2z&t׭wOHJNNSWuu-$yh&GBrw<D $:8cJDQz g9@tņ:̒*x3na.y<e_z>"ܷY*>'S9#tgieYe8FGGKJJa zzzz6k.CxS&~3t.ꌠMk׮IĄ.: juD/)Ejm'G9x:GrOb @T_:.GpW|ԐVQplEG{3Gw I ezOXs;mY,Zoٲ_xm^Nyg+%!gaxZޯ?yfebXeс|mϪD4Fp!٭e!` H{޵kפjbj@g:KbJD_ѽ: (eKC}a7T1tNfLf^.&HJJnՐs|i3$[1K ߽\wAMְ !:,yyyI˜9_*)FÍF#pKKd$w mYRqY$C@_9B}JeN4(_L[L3glӧ꫙v k֬y7/_n2WLr|W)c<$--m=K\a4zH]?t`7djaHlJRLR,T403KRRŧPRV'y/':/07u6Bt_ IDATܩ5Ln;Y @I3=\GyL(wRx"y}uL _ 4|1n1yJIIYnݒ%K{o6l7o^UUAXzl2~ꗽҖalX?!q4?ɋ27B&*{Ig-G쩟6 ̒;ofF;U>A͉  H ![|^CO `OVchdVd:s ߦoImL62<[n=yU||||||֬Ys̙|%--ߠ^^[vA?gG(wsdrgb=$`_,>v),S)Kfԙץv)&ԇ~@un4|!n1y6mII$S5.835d/͏>iQrR[vvnHZ+ @Ԙ:,l19):'ERf$EґS8V:Bu/@a_9R[rS$s״3guBRQd*gxO4|nU贕10,i˥&+BG35Ѳd}$UX[߃<;?ĥAQE,7L3b`11[uV[pFSB) ӹW}Z/-d8k/E:󉍨ZD0m)ɨ4kV-&rҥKfFPݍ9$<.]Դ>l]C[Q5I0=H7uپͱ|?nPI,zK`n#%U}#Wg>Gno/oQҌ1Jn1y޶m[mm-M&M}7*i,]|%/qjֲDMSWv* (#lwqMn=ZE1}LI_J6ӗ wN'  W]S)bZZZjj ;Bq>yJq yR0{gؚ)+^(F=) 8zm "D4t1ۭ٩٪3EF;XҪ!8 ˢW<+}-q{sKQg1=rg\:ߢwLMFzYfqil-( "##cxx؄8?ր m}/[d= !ZoHP@GZʫ0Op+j[j︣ۋaa>q=JnA3 F?S~(l>+j#se 8ߨc/He)WR!HA"!"u ˦> SiP64hґD|O%Ӭ?llPi,Em,;G.7v1@yߪqYDT»X:h _Gno/~ wLM𸪸y!dSItF+D)\leHc:F71~HBlY6X?T~΃&ϦBu#b/m4amJ$/kD|䇿xV!gkfml}\]B2m$768VԶ~cOIk|K[`úY:;ۻq!O{z}xRq^9R?~"zIScYꬅ@r(8P5N/V50Sri~!Ҵ\"٨pi!ũ3xOQkj>g\&&TY`ƕ1r83 bI])JgMNE% k0:fv0)F(;TaUQ'1`+j[hӛOb%aj7@:aaW>&Շ>l3aBu0+t:gyC5ܭX@,0Y:s"6҅ ܞ&0y6 #oɦNq{x!'K=܂5=m:9" H CI]Δv0,̟ Dq;?:γ5g1gWM=+rgy>ϓC*xhՓbiLxrH]ճDus9%Y0́&&`^9f5͒&N:<߰$4[?:fqi F0J6$.݌U*#!I#54Q4.03pVDYA³ctb?L$[:c%6!Mo =u gM=G.W>N,oQsWY:)n|_s{+?"LMJ>yF &P*i(B H /:SA(s}v&g5]ƆEX:c1Qa_PJ~yj\McUuENhP' Ϲۡ}`sOr.k{X:s0,_8/*$LC4ɳ9TPt{0yRv 5^mt<Py:St0$e!+>y>_56}#ʂL g9E&c#-(YZ1],,jcU4m[j;Շ'5?_SׅgVZ:)iξo ?:(0y66 *1$ ^6c{sg*\BapJ$!j')6:A_6wpkN/PqU ^I5|V#-T1KI?xި=]No9lQGտqUG 1N:E3Kgs@_q10y66k0 YjOyr:VPxiI(m(WR'-x|LѫVY =NjJvlkW|KuE͗S#9D!$+P98n QdwET*0fLtWgl@A|ΓWTr¸|CrHV0"wϬ *叴uSܜ5Iv\g&kc
ɳK`gА086 dyB|ʯV!xT5<=+EGTEdcX6"C^}}gas×Z:c . vuvys*T(lDS;rQhTPwm+Pg>UW=P`"3s`NɳKڠoI2Zf\w ,#oØEE0I̶2Es`Hg{ BHZ]ۀyr}a 堯m. pO) CFO|6[sYM^o]ҟ<[:sM #62es0&wLgISpR{L ysM4=RRRFGG=$^CM;PҞ{'<yja׻ڼ9A!t{̝EW\kj'$Rgo31Lؘ"?ޤrE%x\ X,^;Vz?g9NqPį,ƛCvԙOaM2~Bz^<c,UwLgBx},^oz6spƱ+sa\f LR=BӉ\vg4'ޓ`>@,oR[BKB&V|KP[SOxu 4`l ĠOx&:J<6r+|\0;?'%%[į,`B/S,[P]SKa10Nv,c 2(OY 6j{ J(*%6l݂ I/3+:ƍ#T>įx"55)0<[:cM 2y sUI3 `l .^njYf roXGٖ, D -5RTԭ)IPT|OVxBai)&uƌ~RReggeO&@ >8v)>p1ij/V ȼzٶJuŇ .ͬ2s LS |-=D͎;xFʮt@N.-`7Ԋ/M̓@L/RM7!́K5=!#9U# ذ[:cβPڔИ_?wnXxHUhB}Lxs\嚒xTgٝDNrb}(x7ۘi jzFNd'Z=\\=51ALᑡtx9t vÞl.Xjlgq#fKOSIH¶:7;ÔGy;++6dzԷ+J7oq\O{ɐHӠ:ev^K BbP,^8-,GG/AGnCgԹgxm.SYxGJE}1 ùp[nN+.q i2خd=iBcrK}\DC%V| ;Ojˉcȇ[csii]M胡Qexޯ;jCP([zBDH$4 >]KyE ڞz kddsRfX.S:ZG@0+ESgWNLQ_w㍹6NL IDAT}8Y5m? '?j{Ek~Z̰Ln]v3v6>sSn*H{= ٰ5_ ČxpuS!2!`'ힸ zQζ$wg~rϿˢkhb٪p,Дl+ E2VنdGdF99lUgsC-,v K< BTWTTڝXQVfܒ@[K<1c`}[_Kաݩ!4FDě)*(Br Wal͘:)\h;<^.ؘxBe$2;uDv{j\pĬ{_;Z9֩FN"M $XYի3bo1WY`)l E__iƌmg*ZIKK㶰vc'_?7|Q %WʶAeGC8@*3ذFwHD ujLƮi֟[` sc*<)l>KW>E,V)òՙeeG)^6sҞoL\_ ]v_*jT 6G!e("9[YߥO^e!E^U= EFFz +DۥY$W1epFصkפjbjLҎe&U9d !m;J4ь YGW8 sgU߾rBI3`̵5XM(!zO Odق:c4iτakh¸Wg& c;;N`|W*۹ɾ!4I~ϏMᔑ X^Ӟw5/ TI2M`{VƢujǀviO#_fEv~꟧*~K,Λ=+υ_lA1Kykn=lJ#RUK5:[_Yѫ- CbT.(Yrtܦv?6Äٗ^euĻDҥjkkM`4M4s#),SBޅˊcDɒY5>gK7oz25+NqB6̰@:]e#̷0,mǏuH{K<7 uIc7̖S5(|M'^J#)8rgX'$uD)'|(yrk3b%E;v0q07uTӣtG^©J*Yım5$A. [/Tc>%רڬ {.3`IYˣcf-Ֆڔ%Wَ:cgIِ"?y^::nN˗/ڔJe]]/K/+&td_;ҋNlJc(tm^vYlҥX=unDQPlb ٪nBŏ)[[]ڱiRh_m5RIPW4ftlVU/[)P۹D&,|,1ջ'˱mȘ(sHWQEBRgl@ rUu4DnO)'Sw^lپ}Jess={"""LrpCOg{I12xTaFB!Dtff&nw-)B[ BQD~8))iۂ'<{Fu UqSҏ޾LQշezAǰ*c9,Innׯ. 0 gmsUiF'fי5:\ʘY |ö-e+wEbv[V3_2[fg!D3ngzUB-YcGL1LKK[?!AGр (7Y_>sF?8SwSX!;:4bWĞB!¦76usvYĞ>]hkl'bʎ\IˇU lCf <oQmҖ~656z={&ϒge7&3{Z1P`/Gc ԫ-Z-}+0(œDCFPWtGMN OTNB-XCHlkMӥvAK%y2f~gyqk,糢§,.CݺECvF<]hY!:W=".Fr3" T:dc`Ϊ7!۱7yD-$\9<j2)Tu&_yjXb,q9M l'nc !5Iޤ⥃ecJ^)vo),ϛtcڦ:WNPIaS7^_~}Y0yIjkkwp_U{4a'F*N|lUx@| E;d־1^E )qtjuoÅvq %H$b2 g:S"F|J951f 5,1u ؛k" Meٺ9][*`*o:GEO-6UbGdWȈcصL|<$;x\0ZӆlڳH5nU{zۻ}U:"umt )V &q `}0|6"O/crdTs\RM0jXb8 -pb mIrQp>j!gy^Ť׏W?>um .eufu '+Əɜe &&3I]GIUg Tª.eFEqS~}0S.մ]3w2 X>N|f(Z>ge3yY,ؠ:{ A?$mT^_1pՆN>CY&v?.t3DlYN 1U[zG$nUl20aUjkkGGG)(*%%E}`Bwvl[JL eb!vC0Wi25 Ϗ^/+|v IlPoZyFm(=pRj-x%Eͳ~ٰ -:Q٫b|#>#o@DYC?=$e5}F^ ۽ AedPt|Ɓ .! `M<_Zٱc˗iiZ, ˱Nj{M#q՞,<7*I0&H'9rg~e#/d`; >]ڱl#c$.mRY%߾e0nva,bc^EkkhGp}@CMF&{ߍ۠0yԥ8Դ2 ?l/x`3&XJ%QBTYE3`=|7[ĨKQ!MY ے[tmom׭jwOv`enHrPfd;!< զ,on^%s{CǰkAB"LͱZUCԇ"V\:tBVv+Fݰ; 2& ---55U?U1 8\`!Ep;AJk{0c!D bEv{i3 b*웽VH認C*)Y53{=rQ̑ռ.vn\A/>|E0:/߀ >[yhpLb^nJ[)s0;=o?Zj[ ֿ /7h'Y,uV?OqXJ~ L& ]oGV*o[) fc?]r3^c9F)wr4 ꗴM^ظ :&.k#웽D0ma{v#_g;um> ]iCo~Sb;3ebDKi\ؑ_)q_cǎ̊ o2U;wGN E,.u؜|>ċ^g]U:sy:Ξ='$aذ}Xr4\&8WP`V2Hgx⛜f!-Tom[IASܿI!!^#x[EBu&3حJse2^b5^βeq_vZE8qlp'#99t 0yy("Zm!dW=.ykԙ^kc_ iȎ-?R۳w8N.JQD剏 ^ͣ: ',"lT#̊[)}rat[(J]_셷ʰnw.Yz#6^|0F#Pjfh򜔔7{U%v-3vvo$?#&:{o5Ö:ա A 6; Zp)5EOG& 1c#I]LJjY7ogoB(o~W)\6%S߿NvK#]Kzc"E01m۪* $ӟQZYs }1),3ߞ8VgkT9|+ZPI߮7~@7F*t"dKPFvl@cZ|_pE܁QwloW}XϑUPf׈ٙnjӋo`@t^.-έ-n8 T6, s3 bۛ&tUMW)h^p2HM3ER[(.IIIm]r\JzV'Y54ҿY2!oT}ƷtΓnN )u;Jiknod^7fOhr{w-گi>6, 6X-k[QC6}(Tyh <`c!b/ bx13woui>')0)DPFVUۭj#;XM!$&#|]B C /J7:Wg`=DqHWG\p "YK~ Τ:wϮe?F{?7>Qg;:LwؑU~@O̕E-K6OhE9Fnr#Ć8G`}(e-}[{;86gGӤE\!y3E˗%X,NIIQ?#eb7c˹EVڜdwbAe.VO uiV5Mudk`"68)seVLZዩ3Eo=ǟ9:hPgTF+Z(yVަQ2EJh!Y FNii. f!M75RrȮ'>y贴4DRN*h Ƭޚ$3Ť b;c<[qM/Bg0BѾ쪪T2j ajvP<%;dwbRR= k 6Y)s(Zӡ9^h{7>tdǞU}_AG_FOW\>_li,I .R@,|\ARx43Ǥꜚ0Tg88>{{;E `[Ԡ&FMĨ115y-QE1 6&M8:9WcrGP`fgvwTWP.m<˷ٳg7 >sx׹eAS3=TˢbyH{]F_3vE)]]^W!MD{M1G!61,b mh]AWTshd F IDATLJIP/F,9l'&Tyϓwn:w7F\{褱cmP\TJ}:U-}ߞ*Pd ݜced\s~ǃ[NBun"o.IŤhs .dC+s6FDDDSw67pzaEOţa j X.+ԴTtvy4H<TP9>TDFtE)jq$ N֔C BEQ􄙺;*`E~%$$D~إUBV^-N;;=k0AQ-]6e종52.ga;/:6X@%Ozn7O_'gYO# OfŇյ8:% M.?_,^TBH؊_"χsNțu/мdWK/Ns/T禠(FZ&\Ciuϳdn>=wRD7.d}U=#Yx ﰿ>=ōE݊o/j:]xo'.\Pڿs\A;k%_d^lE``)-NfȈ:rY"BCCՅB'N)l?ej8qˇݎ?igwΌniY ` "֏WT# y[E4amQ<2vSG)-_>E}5¬MW Ɋcs^Pչ 1V&{袋3D->SrR.V s!uhГ͊PRIe?,`eCV-xU"h>DӋގ'=nbѲuK(M̅߁PPm[sj]ok=epPgPʅb)c OȷC AXX͆ QD~˗hhP4u/.f!eyUH(\ӂf=tؔ:Y]88 T5k|Zڟ y4ժ|u X_ʑLg! b+hhw~5W_\9ukTu8l9ر2QچJR@,-VSeOŵnGqoK KwYVTI%Dz(VG&Żdijz"iXdٹJ&BBwOñgn AE[f&5=U3QJd%eZ'w{vG6ib{+u9WW [t,8OuضEL^xDn Q@,:m(kJrڷ[1gƝW{h-JdY#0jSF\̳_'~kZauΙ'r5(j_dd?3'S"ΆRοr)y^ӖP;-Sb 2kJ{g:3r/:Jb|:8I R* /҆@sS%ߠoeuFo5"=N읋9/<.cdoos53]IL߫#cݷ*ÕGܱAַOt0׫3mvaR_e2ix uaD| hUl!,Mn&FR[bWRU1sw0Aw}6aH9~^uJBun#SebJ}W{' sIc2]Mj"Yչ!\Y#|~򳎿̉X\iJ !lXX@rΛ>֙ӌ"pu@5OҺOhq7j "dȠa(E}*pXQ;2KK'915-&+nƜ{~.<UKRnuv x);KKK6MD݄5(FߪT3Vr(+0ml܂_-Q|*-4eu}4 xcF\pcΞ=,^z?`ѿ>[q #`r<[¯ g8 ePž1h:" *rRy]Gґ@unpeǿH9d:/qոG3'+q~RչS︡ŷu3%/V us$#N2( |>_~ ieYwkMc(!5Equs#(H BȽF"sq=b)`DutyaN@@@xxG`` qw5Cw&+p0-' .djjhVTPg}}}}||u>|}}y0tcQD:;J,gfϞpsspqo@SSBCCɷd.iiiIl< O ;(߾;--L<**+2|7һaaL)Ơl6H <f@5&IZ񉌌0(`gk8bHK)O < (bh(38NLjhQ¨'g@YfC$( HѶ ^q,~%/:[v/һIYz@un;R鲧D9tF~}fPny&~PZ:^[}j+n|KkW删Y<0:w稨"ʖRdShT# D }w?mr6OHX .d\8m1hn$HC)pzPҤAGXa_ۨyEe>0W:xIR n1x&?]'hB@k7Aں2#P|0Ur6DN S̓ߣ,R D X8E1 ,r5sՙVkaH˹Q[C<ʖ˼yJ|չR "l s{"HMW0L1N9E%pIs&0<̚v`CfMR 23X}0y ?\H@MY,o/b~dy &*ls:^l6AВnP}a_b,--@Y p$:spHx)0Q?h=j)LvUd[odąҦ =>qcyovлdw;fXpIL8&|ZݔzQ-=7 CY|ɍ-R\ovwI@GNOjeW Z73Pj@Uw۶ߟ ޲BRӞiv3c(Fa-V>/*|+:  b rg5p,YչCb!x]0ft͚R!)7[r+AunYNMp6~l5p,^dKJpssSl@@@n;z;e.]:Ffzz\_^|$y<;m۶5>+QYUIӱbf3GzVD}iigs9iid˒7Am;} ffYl{/vNHts>z1Q$I:2H8 _-ޕ'2^Zymo ^zt&M$ӓ\j !`2m 0޹!yъay&i:Xe0/ޯ/ s:1u^qrW$?%UmLuR7FȇSy4BS.OʏۈMeͶfTLuϜ6@-贝:W^)O!6F֯vJOF\B[ ?Wzfųꬔ&F}"L,fɉTCpZ]]VAn,|_Z;gNJԝqi# Bv~L(8šչ~E%ooAitS=^V hBOS砄 M;/SbeOt mEyBunStW[ݹc~W$[^ ט㵃givpC6v/?go=bpc' U[sSm.RBD2zr6FW<&jwx<޼%+^y6*Z!P Ԙ" $B@II5\(Fo"os Ci"I(* "u09mRkʲ9ƯJ{8Zx{ m7!0MeՆUFd(R4]-ni%L.6R&ܑ(s.NnNNNU $Ugx&Ez;WwX3 ^jKؠ69ho-޼wHӡdWfӇ}AUһ89X)9drTޠT#.s6J޴:ڗ'?07hZ|NP*f D4*P[+i=t$?2x0Z;i6> ocG1;3gx@+Pc 'Y!i>=bʌmOx-5zߖZЯ)Gg80ڳj5pEmE`=㞌1WmǤ  AZ ?y,6G|T(6x2@գrWWUUZځ38[qQ}WvQTZs?vvPR ;U~!:Ugx.EFN|++:&QԹ/%G αւW``ɭW.>;ғWM? aY})#B@MGWhtLkCZV [Z"ݟV݊R,MYzXIr'QZԭh "9uҧ)7 U!j$;^׬쁗% |K0V3Ç %#w>_s-H@d wb>k);7?x84qwa9OH-ў8hox_Ï{{ӓ6Ŭ{?-cd֞ IDAT$WW&CVwiogx=hK&[&sX3#P5QtfNg7})8L\u&gՈ/TH~I_[ܻLdFgE)-k= vg_3V=T/k`g>DRo柯:-#a6ܬ釜m3qևAHTƸ=?=& 0֥D% ;R!퉖V$g$1;1]6՜OM{"1%f@YՕE/4[rFgz]~ܬ~ YHꓧfB˹]ǻigq:;V-gY9"G!c$M,քd\5\ ?Id&z1xqq}gq9Y/{`ӏ -Jzz,f̿0.Dj3@(=P'o>ۋ]Ci"mίRGW[|¸+X=f^31匢(\>c R^ۥ"i@v2bf>绘 1ICTٛFnj8}4K!P- ɸb;Klg3-軶V7dܱܰ#[*͸9`tħR71+YxbFeͲw@V([$eI,1*76D_Z⾇X,HC8NjWVu*") cp ` *\*`xjhhTWW<+,,4Tp15}SOZS^c= !ƚ{ۏW&(cbT_%EWstt~>4,}@^lB0~mw^߱<@Yt6ƘlX9TTrf>ISSyA;?j=BivM'j?`;pU?1i:`٥Mطo_LL Mgr>z ,[h=AR>:r FT%5lFFFEEOJJiD.S-L9OgccODGTiKbb\n`N + Y AR瓘fJ;"1f{q ]@[sS3BIoVq9.ey>exNӮU1sJsVJ3 8d@y  i4}Uza"F3^}URAo?R Hc_txBBB(bW/K|y/>amKL a=kDFZ&ˇlk]:-Pgwi<^FKW'M X|zUdvӗoۻu~ (5y<+_Flliţuڔ.\X{ rҜl*y%,-wfNJa2|oNօ.DVV Q4Hk[&tX{=JDԪfߓf0>|c \~黂/F+ K;_!??l+JMd//|zk TeJe\RbgOj<Իf1g>޼3μZlbd $ܾ䋅sCEm{t2̩ᅭH]1ިz;A-pHӡCkMU}hDP{ܔGtbcŹȇnJ:,w/+_ŧ vo^">!n.syV^b}eYDIuB$76yz$Ν?6Iգ RJ+@>)rsH.7Ticj+9>4mll`FxGGGᄆ9m7Y~Bwoע doDkJsVl'22H<&zyYT禠\jr>ڟwNvn GXnGIvs9PX}aWQ,gĠ:ms ]뎗N}{=/"jJǧC ~U{M;Q8h3^^^>]u<==Xn3zYh8;AU!|NTC[`jzPA-B>Zp(k# S=JChyD&cebJr.Tcǁ:J.(ˍ/)XK93+= <v4(OJhk#cnT wC} uM>~L,z;h{k#ޛΊߘt\V]5 зPΞXBYɡR1hN݋a9}P .dc]sLW}b&~dP d9B6RR9]:tlzĶὭTDb?cxEk$"-_ݶ[ G!ٯcє:gώdãeZۘ)xEvJ"ݬI`vԋuC7-cQVgD\@,h;i;"Bkق#Oτ+ ǭs.++-m: W_NYH92iI".uw3A[26E$ue~f!@|Sˑ9O7%6 ^YT7"eYrFxI i?Î]5JDXhtmǡ}r'I H9$xGWks;#|f0]YoΟ8 yީZcצp"~FΣ91k 7xq6b9dZ@:SzwWmv@Πk;u3 ւQ(oUb`5(T>Awf=s 48vdyaN)`'1iTZ&ʼw=}Vd"p \.2F(UgA߿GG|܈.8[ b8-9ȿ{7QW}0.؁M)}:YZhA5UȊ, 9x`Ǯřg]Έ5,uj J>x`MJ݇I9\HY)ڈcmrsY׃$$ 11\;(d sQ.x涱gcC4kdp7/ '6Ugh^Ӌ^h?jlƆW5 Xnv5j "UJZ&ͤӲn\kPx3{ fٯ 3\I!V.wmտ׼g+vQ?$33wH'DXS: o?7K)T&2y;F_eiP-gB+ eD9jݍ_({Hݧeu.:wNFU([c:`ȭC͌9 O^Ds>&d7kDAsJ et>(Y(TC#0 ead)YU~P_!aTwNd3&q4}>;CAppp@@@CGk4_QhX4ڍ+:Cd.a\.7,,Dbvr)3@S i㝍 i~qL|{ s\?lkHX3#ݙSQii-Vg }$C纄tS* DP  =lr)% [ohV4]_5D P;lIL^ʿ4ᷗ'ymLf $-d珴Q6LAF gVׂL&S~ :|&@xx8DDZcf$=@+ \6%{*-,Vd=ӔYVyttU c7x /VͯaY`i(XBА:w!i?YYNJI/_Rv8UH[ õNAVxָ\q]4_ex2MA]<"R}ҋdL`8䷣Z'@> moz'6] gPxYwYjij~dr/) {3|@34!^Z\xxxqGPWWWbG: N\ *udJ;osp8R;2aY8xqW'"/5Pi b3ӣ¯#WV-y^Jx>YY#~E{Z>0e@% B>QЊCSR!( Ue4zݞ+~=16>[B'Q@󵯷eGEUKy:whvVsk# h ϖ30%\J̒-#tjl:fxyщ+da™H~8ڵC>)rʄ.5H> E1ܚbV#5;:wrՇ5]&kV8J􅦦棘qYY0r)K"cc~}\OwEiU~I$2MMM|$4šLy  @i)Mn/SKwJz'uv;!P{W}w=y[9Y/I]l*ԙRxt.^Uxe"JyNΑu<im ,8=27{9K슿 DGa(zqWI@UNҊPqk׮YEx2u$e6}c{Փp/(n퍧CL\FDCZQM̼My @i)ͺn/RK_OzLU#  ﮐ99^' qLqN;٠#juAhٿOɰwJΏHù?%{un0Irb /-`٭3t|@J``'&'NxBuh+x.B16PXHJ=VDaJܫ[,i93QW^;=kHA1 a*rP6QmPa`/Elү>H[a }ue%BIzqC>ߟx}U<8.#dkIU~Oa]rn:c21;wd\ 43?Z]Kms͕9@;9:3ZFC5֚Rq'3@boc \L/44/V`ivm _ b6} -t/[l|`՟J\o@qU  ]kW@ <~d?OYnI~Nm[1JU3'IW-;:uM(W% %7?Rq|6KW73t:uCplҞNoxnLjA?Q|;Afiu]]2^jV~CkHkQʴ x re?jy˃h+g sqr_-6K):˃Id9 9gA[Z 5Ks+f u.;mdέ, [7@:>L3jhUgF-i)[IDFF |)Z,`ݿc`O_Di `931w}m2\_YsѪJd^SE<(Q!W)ݥs "B$Xkh97]bl۵ġn/d\ 4g26$ xZNx@ZUb*ܻKdŸZLN,ufG)!2ojed9Ski1@:t#sf"ck!%ˍpIÅ~e%!ՙRzxP]ZeTneh}Aچ\AiA_ϳCzKB~?ԧ|:8:SoN!ΤΔ^Z\(ΑbRHdowN/vǠ~cԹgG!pw2v7f^IU7VkE"hjmOʅJ]pWw# ӈEa/_Cҙ*2u4%s^x~ vY Sm+}^w10yHu2с \.W,wu_ 7n'}I 4ʾwU*A>}`3ґ1n }NZ5 ԌHmىFTrbL~05ߜ+ z"Y@ yҋ>"{@ &KUei1AE_}wot7PFAށJ\mۼ[~:Sv,Uߓ(>]Aǣz) nv3 hqq=0|@nGt°0{;5 棷bQ:ZĚYBr }8yFUgMjR䠂ZibPz*<"Q={B#6:j`n(]MֈUR͛Q"Zm2 cףos+7jvVlߐ'?:puuuwww$ ɀ*2u|8z{2OT64mD\H{ @iPgFsL"y_H,}uzr(usHD!o4Ԟ?# [pkN8aPKՃ@>B}GO7C>uBh<(ϐv1 %us<oZeL=Q5zSf=cr 94c(J!q<%7A T-x_bOӉ"zhvg4vzzzZ9?2Tıt̗x!ɓ$Ϸ U݋+KJf9Mzo4ye< 5x˷x+Sud}(XF߳42-^7HۑWy4U/b}e1 MDGt_! 4-bGj#U[[ssȧl|[&Vׄg x,8R=eɺ@I|<cfg,Ϟj͆@>YB.e4LQ܇R͸=s>}SFmYK)-v`G#cip*2u51׫AyiثAx d(DXIH4`#iABT@K@՝f2di0u8L.0t,:r(jLJ$HjT,U /+iEFH +D QaH[bX@4˴nlPC~qs gԼ'n "މ}Oy( ur8I:kt:[@iAڍ+yW"222^^yoٸY"h1Up "D.5z9|!D@MB)jb@"(jF %LʅT4:e\P \PWs*m x>^W#u5a?{wTmHe+HꌲA\Qw\gEF]("j+ ]{II99'r>9I,ߣr[/CS4S.L QNv4"!/=]w݊+Y9:.s\=C޸35VSq}GGDPݯ67Rכ-ϫAx+n:tnsNV^y5c?F 5Ү aUBR*BX.$4.(SkPnMLu(UkI|QeWE߾CW;4nqR/%gϐ9s|g \s'*ēll O SիסS8Ah2%F h5+h]́zUUu*` UE7 Qu6$NU!_bS!&NQQY}! ҥK:~z̙3G`'??$GtjKJ9S"aS5RXhH'RtF tw0C+τVԷ^hhk&]V_ӤoufhhnSZ: 5Bm:T!Y?avA_)$T. -fbFFC4aa!qQa!{vV9%贂on/=?زOD*b<<裓'O|?ޟxFWWK~nJ[߿ |bn?WtvhM0A|Ŋ]w]ttto9 0gs׆R t3 G6F\BT>N뮻nŊ{O~yv;gٚS]zdڵr߸qرc% K% ;*PY-_M2cŃĴZmG3gΝ;ZΝ;̙cի׎;>dDۇLC PovW[ܳ( or F;,6GE'uv ߐϝ;w V*((h.^zoĉϟ5$''9swYtx)rϿS"P70 s۷KZ уi3/hFa~??O=7y[wq㹸`x)C:vm;égBo4WXQ)\͋uvH:"8۶ Nz͗8qe22.y~ݻsrr"gfa3g oq۱5 4~r#5Æ p!넶{EaÆ^\;ݭ 1ED4x]dXw[~tNxZQdʐ΀]/JΚ)ώeM gSCM4YwZO|namͥ 7n%gIHHt#Glnno96-}NV"ZhDXˍǪ/|h~yP Z OXNW74[x7ntԐPSL3`ͳg7]vOI]u㠷#´ ?|Q~p֖>"44`;w$oZT]ƈ,:VGh@#e\spuVJ5~x WmQ};|e\\zd6u;:*Ӹ>6Q匡◈ڀ)uc@عq>IgGOk4ty tSޚ{v€"ZۛAh8TTK<{1u*B ׄwJΈV\7t?v{kr MփO2a.Gܜt5<֭tv\UE3ͳg#T"ix*a#ߜ{#K9W[ vfM{HMKKK[[[[ٶ 2a&2@?nn= [LFӱ/ʏ~TN:NI2]@{,u,C5»GJvsdіǏXSSO?Yuu#A˒;vիZۚx-f*{E?]M: Mlۆ3SvoؾNv_nkN4ؒ|\DxcLv79)[Slyg_96p{ R ozvo-.fYU痛>. |pt˰a hU-: Ǐo+o9LO=;FØA %MlF`0My?Ov>ϡ&m)D7Kjz]Z` D9h熁 ߛOcgXoH擢ۈ֔Iԙ#;G:}/ m,{?I&XeM:na0$z`uSMƈ~pkȶSZc/iԛ`3(2a!X.m=iU$BUMmm&CkS-,#7΀[h=D<#mCjӲ>spċŭ/bUSgXooQQѰajk!&p3A̔=n kіY*Nc鸭'ի`!44Ig@!|/۶6|{>sl{Q~7糷eE]ĒHϰ<;ta"L&aWٳyl8ٶ=At[yxҋT~? W(C 0~]x/?r Bzzzaaazze|Сeee=D_-/NtOFYxxf~ޔ_+HW(P(BT~E!<0C^R3?r*0Lw}SO=%im)t9~k֬Yf*4Xt߮"zu-]tҥW~衇Sw}O駟&L0}VI+t,iW* ;^$"IgwG-Ydƌ#3fxW;nU?h4Z[PPлwoi3L~[O8 A]xV/I]tӸe˖1cHSe*2556Ҥ+fQQQϟ%54Ϯ#E:{-WξA솴r둲N:]=>ؑ5{eggKSe<.v׮]G~'$drBV;p{뛷"AHOO ԩ]wuqktȌ{k8q_ E&Lai꺌[E5jv1b)B,/v gב"t+HgߠyvZt#:7_[ {nJă"OO4iR[[*~SOY뛷"oݻw777ϴIKK;r䈢HNN^reeeeee++Th{z^.qH8m4̴iӬqƭYzdʕ2byv.Y IgI:t g7k6??_.x5VTT]tYhdՙLnVyqYŠxy7n 꺌[Ejۓm:3u`5Ι3g˸U?ߣGM6UWWWWWoڴG/r*ܾ}{JJʚ5kΟ?UV%''GFFJZ+h]G:t [Hg } .*u2 )//h4uԩBj<|RRRUU]V;vٱcGϞ=+jܹs 4MTTرc}]+tͳHgw^A:{ oH KUeeeX0znΝ2eʒ%K&N(}uup5>R.q“'OfffK5vp5|r1 AI `5ے,<{íG~Y s5?>??Q~cƌBxPi"t+HgԩS׮]k=v[nzV7xs=.jo/A]U-d)ƍǎ+A]qӧ'#}ш#$ϣը||P¬Ud=:d=ݻKX_?o}'A]Pi"t+Hg'm駟6x޽{766*;nU8twy7y\ɓ7o\QQΜ9rʮ]~'ʩЖonSVV銊~锔C)櫯Zt'y^ۓ&Mkedd|555泪u+B_:ɓ~'iy. ,iW*E:{V$"IgI /..6mZllllliD(ѻ+6+[^MMUd~~ޚֹs})B[>k"o>}tjڵY~Gi2Ν;7cƌĈ1cd?wQF}G>(̚[Enܸq FzwV  ޿e˖ T؞ ut^Y&ҹ}t|ZbY w<3N<3N<3N<3N<3N<3N<3N<3AJ%w 23(482Lr@f Z@v344AT*~,3( 48A 48A @!22R]t B޽? w!"P g-X`0k% Ey  gy gy gy gy gy gy gy gy gy gy gy gy gy gy gxJ8=ڼysU*GUwXzabccM}v3u]]t ҥ˝wYPP"bccGrJy})3LkCɵ?&d2ILVl37+**꫰믿7n4iҨQۦ3nظqݥ=O?+"K#@"pEkwNs%a&/q vcǎ}ZF?8qꫯϿꪫuќ{ٳg'O腘._w2ݔZ0d(SJ:{!ᄏs~wv2R?TyРAFQtxUW k׮#GFFFfffXƒAغuѣ5F=zl]V7o^RRRJJ… M&Sss󓓓?YOIIh4SL9v˴}EG9xuG2eFIII?VmT*zzp]mmm.]G, K./Aꪫ~/[# 6>W%%%]tYhQQQQKK7|3m4c{}#WժUcƌ1L?cJJ~mϞ=wnI{MJJ]YYYQQnݺ[J{VZU]]/=_{V\YUUeyW,w;-[VVVVVVlٲ'OE79xu'NHOO,hɒ%wyH9^Z\,d2?~ٲeݿo߾G{߿v׮]p8xl+¼y_~qΝzڰaVkD2LHR-b222V\P\\|w<ޑyo[XFv?St:]UU֭['O{ Asy=? _wn(Gev= #2ьL4s+;vKH1սzx 7>|d2577;Xfyo[~ۢiӦEFF{ټyh-Y? ?|摔3gؽsBBBmmHqqj!_}FF/,/r뭷o;wu˶^YYi=RYY٩S'mgp0EsDMMM58xu))) rTl׳w׃g"##{97 L<߷{ܸq$%%7y7͇6 _1v;^O(hL㤰[[?׿5tPF#BQQj=^b*\X?mϞ=7mT[[aÆ1cx[l߿Q[fˠ5{ @FdUA&:x]L Ǐue䮻1cFYYYEEŋ/xm9y*qY?ƍ[n]ii^/++{ǧLb%wBa%LS\\}BCC+((,mֻwsSt3yk͚5/ٳgϞ=/^zj+ ؑ !a|x !!AӹqqqqqqNرc#F0<|cǎyb g$lg͚gۛsrrKJJJJJ'Nj?accc||焄 @@#{T,]СCׯ̜9sȑ ,p'Op}H\;t-uٳg[̞={˖-uʒ> ̶}ر[ 4~pٳg?'?%dHgyIJJINN2aQQQvv9sb ԤV-#z>&&ջVmmm}N,|!JtgsbbbuuuzzeJ+=$/t =~[t.SiPګ+#]{'E:K_5JxBُ(ULUPP`=RXX8`)<)T,"w-^F:oY-(K,9|b#Fx^t0PګfCtd۶W(U^߶[HgSګWt$Bitg}7<3555555O?}Ν+ŲpO>)w M=^_Jㇻ@הּO(m.x3,)~( Ig?WFK:Knݖŝ:u޾} 'N\lYFF5(jp|eWt_-}eh'“O><πSyyy-Hg-3o9ܒ_Hϰ΀[! R37tm0_ )I |txOlH < o90 E38l 80 R37t8l<D7ϜU^~ 8+HgqγpV?2JZ;RY&•="ޔ$w] Fxt)&œq\߷V[rVת7E@6NQ}2 J[h8!€1N{ g(QVFh3u'* IDAT@.<3?="fx^rf E̶^\U\yLu5rHϰґ.e3TӞOc0yB]5\4RT3hP=aТ3Uq3=|mgG EKO Pd09OD ?I|~ ʦygD ?.o[h<gH=-:;46{[4|~ ӺVb@L:Wym6iJy*A04fؐ  e2WqgXo<{xeUNWۻQPs7o"e 7wC)i a7/\f E̶lۆYsqݶڟJ[moꞦs2R37t tHTDȜ)ICsJϪۛgaĄmo:qV:ߗ_<#TBkilo:K7Ǵ/ _yFйJ|4:*Ac|6i5v/j <#3&&tIVƫ o$JF S=9!2\|=G8xH7ϖe] %%> AI:Q]@PyzuWum\^4πX\tHӞ&v>Gj4@0yf}hp7nv-\pƌ=zx}tXK:768P(!Ig@py~g.\(|G{9yx !!|'O͍---ܔ_QQѥKᄏփ.R"ԗ}DFċM:KLJ*>v5kVZZڞ={lojll.)))))Ξ8qV5z…:`b|y ^ hT٩S}effZ=eK_tC֯_o9sȑ#,X B||'RSSA:\ %z?LK)\z()#E@&]ʸyk׮ [nޭf֭g϶={-[?4Ȳ]@t žg ⛀&_⩧;vlkk=ӭ[3gά^zvcǎ s"x|~C#7 <<[FˇZVVE]GG& L'W=& St9:둫sUy0*((),,0`@GS_l̆/H`gIk.Ig &5*7uSf ]v-ґ4 wEşfg YE|Ф3%&ٴ 7y6w}|39aaaR(l\IrNa63p\py?CKKUP2Ims$DžKܹW_=s|ynWw)jm ha0Y  mh4.Y$//It£Ӟ tvp𴴴'NIWD8 Ժʺ&_f%ŊHB `+k.KLMwDMqRUذz=hkIr3|ǎ;v\. /J,<욫UM錐VEl0Y &9{3f$''WVVXwfyd74]s6exn16u-m8{y̙[lٱc7w7رc֭3fj}?YpPf( =,?-R&rb@:#dE鬣yM,8%֠3}$84ȅyÆ ƍh4ky8O4y'HgHcص m_}?O=ԅ ,j}?9繁xHg8ya3orW^ye͚5&Lj5sUIJP-޵]IU#EEEcƌj)'ng#c*jٵ mʼZ ිE6̭fEP.:Nknѳ( oqy~֬YR.\s"%Fv3B2Bwg p8ʅwh?^86!'Y!9_7-a\LdHgyaJ E!>qĄ :f'$4f~[monT|te T;j| og紴2"©SFi=2bĈӧOFc55nH=/=~ N:Lwq*lYƫPWWhGkkk{ 5)^nL~VKB6u&ۜ,M. Nry^|yuuO>yŶ6 wlfu!YM?@p˳&RE:}[mHg >="ܞe{&wJJSRR:FG4벟z)R^rb/6qUFHa@[reǏR&.)ҿ[ IDATdo *l^=Hg x&=l6lXAALJڝ쨓l觚72F۟V֛$ 7y#C:]jBx8[ ?n tvyӧ[zdݺuwuWw^`ᙪIֶZN #'I]\?Z^ϯә% &]}٣G3';vm31LՎ9r…/ak׮-(([^u~u6C? 8t__ۦsKf&ڶy޼yirrrаwI&M:u֭.]v:t(#####;wt;G9; J ~(EE 8cXjd;|ʸy? Y6ُ>Y?W^yNm$w7~`;>;'>k Z0tg/gM3to922GփUUUMMMި#oS 4Gs%) I23u_֊eI=Hg XH?m;p$ $1}\LhPo. }!`7ΐĔm鍖﮷9!@ M:;<>|ǎ;v\.ø$! &'ʼnwc_2)IRKU΀r'٦sQS;YCu˗w[zuqq^/..^z%K?y8 '({8ڒ7z7V|{'G`),5HUE:2JH ; ?3gxM@pS)d熝At#J%h3st`[k>oJB ΀{UF~ҭgϞeee*{+EgPU5tfi\Hg=CmUԙ괤3V|LUTBq8 ΀{R|湾~۶mҥK=["wo_y=3M{rQJ!޵Έ.?hРgy{BU@S&K4\C:կפ 8:k,>W^S$ K#sn=@-U=\"yʐ΀7ئ@`l'O F)e `mY'E:)W)dh46Hg r jo+_OTp)>76V\Kf&f@~m^-ލ]cIO-Or z?/lrJnnnllllllnnnqqٵkرc\);j# `WIg DI<ϝ;799y߾}wtI&eeeeee477vرe˖>TMx8ܰd _ [ ቱEI>H:IyS_|#G_cdΜ9K.ٳg7nܘ[~kOASFA&9 eʐ΀]t[hEooմ.ϛ7zd޼y6mqÆ g㏝f oGε|U !l(tBG_@ԩS#G1bӧoZ۹s1c.B_cmǿ;ӼnGDDPRt^e=󷁐_s]]FILLm??W\2dGAfO^^7)kzT񋭯~ZSh}IA˳&R#3BܘAQն_hyӚZ- H_<+.xk4zseJ]]co*a^P 2,olζJ!k|l`rsBBBǞv555ݮb6"\ۻFƯRNn@BGHg "\pZtn5XoO[[j+L/ @;ߤ5Æ +((9~СCQ*~=זlw>;mѷ0 u$Ե V3C7tƪ66΀|}ݺu#֭뮻F R+M׌d +ALfcg>0-4k!xtE*M=Ys}PNo kM:9Zvȑ .\x W^vmAAATT,N5o~hb"Igׂg]111v:tPFFFFFÇwv6ގ}D7 =Idծ`yT {j,33 8Q˺L}c߯pw}) x_ym#8 m?sx=Ɂ[FD ~qC[qݎ#'iHWL>jXt|{)E<#j_lu"oV+-x)>7&η8Nkbnu`𮠚cL CĄ͟IC2]?ƿW񫆒jfӶ}tFЈ =Iv;^G_7r]+FZeqTwR3TM"GW>I{.v;Sw?MqӰ}Ua0 )mxFp+5}}B 5~Xd4rBʸ δs?J:ôm11 A,U[VIrCն}qX}PUl1MLA,%!o[1'1/Ud+?PhM@aڶod=fgNrɄaFGN2"ean|_ɦ+Y.FWOE8Ĵm7AW49b49MUL5,C€Cʸ !Jq 6_z+o!&#pͳg,]Kہ3O7LUycL R=|nYgnnlrC3Spp<峓}{ ^ʮO\nǦwՖs y)&R>eL9OsΧ>~sK-Wg`6ЮƸXbrpuFF6 p2sڕ'[ںzL&0H}Vm7π&O7.cb~>"B]#eXӚ:tLJT Ա17 A]yv -6:kljGwR\̛bQ0 2sl5;ټDStNK{BlT):E&dtu.[謁oU+ Aʸ Lqǻ#&Sϼ)N``ͳgkM;H4`qеf}M] aM!h@նz@Ix_ã:{mn6g`m .D*ӞΝ\3_AƀjmyUO5-w^="LIHa!n?H+1~RN˪ƴm7πN~Mcl(|Lq 9ײeQfelޔIg@hF<n0,[;dw˅{(_R=|nZ je5Aj_g7π]!I1%q3Wv=-)cc}U_yv tGSkƯN\j{M#qSK&!2sC3E([3Bͳg,nAm-A{'?#d2s"ߞlm^7S*L52nKn#$y/e::\+16l̤ۻn%R—"W;|lIgy(//OZ)_|OqDwߗ^^^^GH]K#O/h7<;rtFHM:)&עo{sKmqQ4&f_O$U ex\ګt-L%B _E5I=6˺u]xO{:۞]e2[~A:A eJ;50Ѹmz^?4N:ZYfgMnyh|R7raw,OiT 9 X6gnJI79^n(ǛN饨P {[m:>;{tRNˎ Z@Oג@7<薉gDMmg$1qt>JѠ߻Yp3n ½˓PwIq2AoR|t @w9mlN[Yo"B]J>;$ЖՈ/ 4< 3Uq[Vhh^g41? i'Mfp3Ϙ ՚6o0yLLf8kM|C:.yrpߤ8Ex~طHR!N.f^g%) \4<&).ڎߞjN@_g;73g4nhjѠdYyW~@7 RNF̒"g[E:;jF'@wOKIscmu3$gRM=j_m$4͟sIu{:KR`hx^zROC~ݎzKIt^%33_uZIh$1jZt>~33omLtHZNV{GhxLyܐ ]'.EL !}@WhxQ\?9a@E5M\.̛?N:3; 3=0Mc7(s[Rޡwĥ53; ׵'֖V O):߻}~uDdK0o2Y@1,~QC>MOT)l/5R=|n0,l-,1կi{)Ñg>?5aîTRg| oniѳA}ۀ1YQR]}#ݩQ+٩Aʸ 7&_NٙtMtF3 &͛0+kZ OOI{uɒj3)Yw9b{W&7c"ٵ@ʸ O6au/ڙx&6*Uȳ by4Gr\rp9\^kZNg}U@:A#L.̝0^:W֛^ϯ%y~뭷ˣG9rdpL&;1~uOkj Hg ݾqp]W>)%iWX1m4Am3|7]?aX6|w.E엷e ]~Hg Y/o=t iG}e2;WrJnnnllllllnnnqqq]N;vlnԩS>d=?yx]4':@ IgѲws + s&''۷.N7iҤ{okZ kdc'{rfs-4E3k2AySQvgA)D IDATUO7̤3BlGY~}Ȝ9s.]*B\\܅ A4hP]]oo:쀶-66*gC"V'D'EP ڞ-;bc"DfĐA5m ͳ7oަMo6СC>~5ߜlgOWHg :2jNYܶo?sC`_GSRR?1R^^>z貲2Ax㍷~>{Yx… ]} ~ގzS BzaaʴxYP Vi/j2A1$C5WR%^WP(""":FFctt^~o-C=v5-?Ѳg,iWZ> M90]121icL]zewO5;ƨz++) _yֻvǟzꩼ<^o\(5o,rzA{)+Tuf W^^ʕ+|M s'+)+hOgj[t&cE_4](5\L詉蟦藦TH3DQ 3 "긮t!).|`b@r@"ZM:3| 9 Ցg˄tqe˖y饗222^3 &˥2ù["\ַbHA+RtA˅R}aB;V)뭼%ᤠj}a@Hѵ]5ݞ-Bbl>!UpxA?mHg 4. K Z4¯꟦`DڶoYm J u&^${IgGD<BeUCaߊva{tCU2ѹS'o@A&3,BiU"%HLQ27R=|na2[.xA*c5")#%wy/e {ُ8 @g2WI73y)}kܨ*BgL<#9u$Ե0CaAw,7=g"l)L|A}f* Z .66A?42qR?Bʸ ی&˥r"}6A -3~´m7b* '/TM3~Bʸ @>yuh錟7pγ8 A38ط R=|n3ygyoYA3XmX={jHhpOXC:~"W`I%l2KdMp  gyBvbot~KOt+xN>߾OH:{}8l2^}bsA!:n?Sܾo'K7_D#V\_}yS'o5W(__J7oH<{l2^}gOH:{l2^}b})=z61%3h 3<3<3<3<@6ϲI]>Zpš+g}v-T TTTH]Q ΀K<<|RW^xG-//7k,+ 3<pGY)%ASI]t:]JJJSSԅp t#G}rJnnnllllllnnnqq+G6]v;˕~LSSk6qDGHg%3i9s&''۷.N7iҤf o2ǎ[lٛozusd/K/䫒 t\"m:(]/#G֯_12gΜKvD ٳg7n]p;eWZk׮Gp Dt#]ϟ7oȼy6m$U=slذa1 NLllG4F:.! y>uȑ#GFqi\כ̪U{챝;w3F&3o޼3g?Oz%%p  3l+;b 繺خǠj}P*\d6nO={6%%;h|] ΀K$ImP&M=|nKdH턄Z둚8Mp {.&a G?>tP 6.a\M&8ӧ[zdݺuwuT~Mp {.&c@:΀?M_|ACCCٳg8зoݻw_bٲe/_6 555SLx)))/RYYYYY٪Uホ{nwփk֬j.]կ~OtE-_:nϞ=ݿFy++++**{dv `k֞?~ܸq? ֬YSSS>/w>D~׿vR]|G[lINNrJ,**JKK[rŋ[[[ۙ3g: ҙtf@*|AXjhpܹ/BǏ~w~;:::D/~cΜ9_z'gk1 Xzd֭7xc3gW_;k `틊oFe:;~4 'O츫:>>rk&^`˗wv/ ~t&-3_A:A.]$߿s:~MOOo^zKHIIp]NsKKʕ+:Z>=$,,'ޮ6!!v>}D;}222:k P\\cCCHllblgYpaǏ>ܹs;{'krW^a={7!Τt+P'` * r/Μ9SR ?~־VRtR7=ztTT /^tW;ݖSRR*++G*++SSS;~{xIIIw}o)¦MRSS>z|ԩ=آE~Wvx/ζ"i<vL8qӦM]<}AEm۶vYɓ'#ׯ=hР[߻f͚---*ǵk׺Q|͛7geeue#FW_]dIw^_WCCã>*²e};vZVcǎݴiu~lyfA?w θ~i`^^^nnngOtٳ{1jԨ 68_3Hgg^t|LfpLvя h4tWgÚh3}R ׿Kl đ΀3hL&Y?A:Ny;̶ߐ΀8s3<#KWIENDB`gsl-2.6/doc/images/multimin.png0000644016036000116100000005123113373111455013451 00000000000000PNG  IHDRKbKGD IDATx}|ս?ِ`0< CAJlZ)KhJ>{ھ-܊-E p nżDH *,$Dڋ LPjvgavvΜ=y%kv{w|9b +w^ 0H p 0H p 0H ppF+W8qbaa;a„+WFQg\g_G?ݻ|bP(ݻwŊξi>g3:o~sq]s8w}wq;sԩSNm߾Cg:>:dȐ믿~;.k.UUy"u,R_8cZt_yǏ?~W^>|~Oux:#MqnIIɛo71bD8#%_b7*j? <8 `Νh(3DH;ܫpUgi3W|^O^lIyyyN?rԩ}CÖ=%_bY7ʐc/Sgޅ MH{UQr)*a2WqWE!KKKz-#MMM }|E1J{l;vرcY)EQ}ˇaaHq'LQ-Z:px͚5p8ų$+V\tE6m:qV yqH}Q(ƾQ /n qlEڷ|CCV8LVӮ Y~}!co۫^t1%_b4*;wf4F9"[>(aZJu '+ݧᝰlDA5J)6JUՖI&|>EQBдix/<w4iRNNńb6*i[d1%]aҺ-2/,Mai@\NNΕW^7o?[:;;ޑ=C)ru Ac !8L)De 3SBvH2bEH&CTU `oVآ2ღLޏvĉ6'%&q%',b1֫0UQҞ δ8HW.+T>x<ġR'J>HiWpZyđh-!1ϟB̬Xu ] o^+m><,aVq),ZgƄA1,=lJ 7&0qBWĒ'h4(Jlj^+08unLXCJ{̈́l 浣iDBuV6y1SQfrJwcRkLq?h0g#FME*rs̿' 8WW髤 p<D Ⱦ#U[OLBX mI-}' ̬\FW0dhw$=KdZ pSJHu: x1 4 'X#|v*@Xք~N   cL`q6^dY՚B?lDȖ ۆ_7llXJ---ICSWW}?#\K; 6xl!BZ+9ғ(w ýPۼSHPN0=1J',bUr֫ o/TvI DM GrG$UGJz2l K&E^^4E <08 %=Đ FSSU]y Smv&VTT8(mXUUF*Ğ)q" '1/28xVTClkkSQr݉+`,޴VՐs%U:Rv.[J+`UUSҲEVK$iOgv,^y&jĕuKfn8vjv$?رxOqHMWMp%XbL3SFEq6wIlYG~+ C{ jVXE_B'`s;i~2q䷂[g:ZJ{D>t F_Vpx͚5p`$Ogs8lis6"x8'䪪fK9999ׯw%O1,Ch *^c{`Q@9pˉ VRgEOrcZH 3+)Ӆ`y5]({ZH-6拙 y-y<ś#ǵPt!_5ਫ਼fYZCeD[QBbkFyѽMwMc*nG-+fk %Fz#V ;vKO=$`pk^k}ᰘ_:D{ g~:";//ZC~XCBKhy:=dٓO>9{q _ޯ_)H^O(7Q*F/q w֛Yv ^T𫯾zW[ dbM?k^|Œ>},YD>$P.ܩ&H [o"/GQ%KH߇S ]zbw߭_ قED]0gUU92Xj[TP a뀿«a!nGA;_~1RSAu"?jjj\N^رcwާ~j5 AYÁ#'*,--MrHE։ǢCQV:SD@T2`Le/fʤ+iwrch4(~DA=. 8Vvg"@G~+s x9Ґ-=^aҒq'KN# :H~?`"6odhsui ϏgdK'"/!6Ȟ"ȝG G~+X0" [6nWRRH6ak6ď1`p[[()ܹSVrv3Ȅh薍1&IK(k <3fΊ0-{׷/s&Q|hIcX$g] ,b]__0 8l4Ps8 h[7= 4,yȑ# -Np8f͚p8;n0x#gp;ud$7N` F)#bo͵2Op8\[[K"h' Fql_[JqlЧ]HK;K%EC qf)Ow#+ּݩ8Yfe\V:.X1%aZ]z.0OSRsss+**x/<7TJvw>O,XH;&NfY3(gJHPHƒtKhS.=r݉+`Z- M6 2t"{K˩~f/hÆ?~͛~:::nNퟪ`0*p z=d埽ޮ]lq I(J$D"M;X@@#E]YgJH2bbnQN>=dȐVZqmawgvI r0oBRxfϞwd_:IGJm3 @UF;]cǎ 4h߾}VXĺZ[9إ'Q>axyn6k֭pX,<+l|U콈ytZMT{6$JCHQ&}?_$]XV6$/d]lxСCyѧ~6^ `>4.XFW֙'fjnW:QHT.=IE,f>u_@#ֱڶYzU ?A4x_y-X)¨WEIXpRR4k׭[7j(.$qCG:a}QU 2яx#/b}RLJ<.E֭۷ WI4&Xx(hooEc!7ۅm6dy"#񙴏x#/b)6:\-vsٳ_|'+⚵$Nc(MTaRaK޴x#/b)~+gl)V]lmqCnVPy 8]NF/O3K{Eh/5J^ظN.ċ/޳gWfJ3,-%Oifi6Sh4cǎ;v5 OPZˬSr5ko-y֮_IHE3]g( U_<ǰX [)(P%4,k לp8\[[[]ze-K|ЄwÕN^@zi$k>$fXh^NG -/noojܜH$R[[(8n+L /+fpa0kXnjKuav׍Fǎۯ_qY-'B䃥J?/Z(ab|ʔ)ǎ?r}`Mm_,%hEVgQ9X3+W,((?v^x᭷JD DE"u͝;7!akk{sjss3\iIٍn̹ЩHxM?3LO?ky;vرko۶-1᝘^0|be˖&L>eʔ0*svڥ(JyyLs}enqe˖UUUj֭[#O$2W kRn{]r%HąRw̆kwpO$vIN\wf;"Sy#GwׯwMdU']z%!{CCüyΜ93??瞛={6`Hmt)ăWX' Tr=X .g_EQΜ9SSS+}[\ŏL  5Ϳ_~~ ;|:'KO b jcF\Go>#G65Zb7!M,h0M@ ???e___ڻ%Z3B{2).=2Mn_|$//_tAw֊p8f͚p8;g࿊Ѩ(eCYﵷS etohhh3gN}}Yxǒ7B&LB,Q0SN3iO?]UUӧ,VEtmOM7:`&̋ F/b)][ߊ+ !G5 , 6dox$رcǎG3 F/b)iS7?#)y[htB 4 G"r|DI#[%Vy|*#iыXyJu444`B ٰEőd֚PBlmsIڬ wItAu6~+FJ[8Xuu>>: #H֦(Jj% iq)V.>C(^>&cME’'v¢Es{;{|hi-#Ua$` \kG.~kJ3F4cU]ze l!1{{~67HM"l9KO=$`/wڥ(Jyy92G 7򡑬~F"\o--{v T@K|B3] KO\w RSUiaM?5Cy-BҮ|C_B/_eVEb'tp3/1onX߰`0 9yҥKߛz>~Ip x ӌvĉa($KVsOӻ+WZOgg_kub00BSm!S{ pËIXγ>]I(z>F"Qchooo#<7*{HYY  R(kІ ͛;,[lɒ%O>$@>#%b˖-[`q2ܕ)q"0K1{reϼϾܽzم F"ށا_b rζғ(WԀ+ecȞzTB^?cpsJ:9Y尭[ar-/Uklٲ*qbe㎎JDlyf͑W4mmmO2L5NfPMN\47BdpxرV-Kvdkb 58S[[[I|fʰ pb GˉՀ?O?tРA'O^p%\bYH9GWWsssل)A*Ъz6l8uvp xG=2;yW("+|nBUW`7=ӦMKg«a! 5kR}W.21hRTT;絵W|mjjje"F2OFY~>''g87_w1@ gyLE`0s,o>27zUQFʼ=rӧO3Ԁk֬{]L&IX_{i@`L)R^^ҷo.w\P=;4׵#"T ӓԓ'OްaCWWWoo_%K 450yT#)eBUt -`~ݦoŹCw^Kq0hf8# 2 qhDC*, m˴yas6C!ԁnrF8N\>b#}Ύ%66pXY$7}RXFEIx9匆5#``2Z"+hq^GEx*Jc,C֞ک)'؊Rzm 5o:2en˽iwئ}yN "$`/3Dޙ lxСC@xR SU$j0H"m٘ 6ȅ^[f̆LUaB [ly׵1ZKc 0 a؃ɩ2EhP5T^Q[(]s̙C.^W$v{p3бc*jͽ;߀M1)֐yw?>:rB*l8v"F0xaoI'%dvL,X qIX!>N"x'j2#R$A|VN$Ԁde#txG8;oe"Db\"Dk^ǽǚ\ ***y͢Bh8NYoٲ_O'\,0/Up(WԀRΝ;:¢~h0 ӤW\kmٲw\RIuԒ%K,Y;(։o„ vȞ]DiZIL]U^]]vڂ_~'IEVʹ"B:e}=\p .`=ܟ wՄ/{57772՘6nxuE"#"Yx555F h4D\rwQ[[C@Iם#Gljj袋  (Jyy9K"7w H窪}QUeMݿIIOG~P)]*J$ |j?0םҦM~錞Ew;d- ^XMHs:/  h?7|)]D1W՝wyg_w6ѯ&֊H$R[[Dx)D20Z`GӳhѢܑWÝS ֊ 6̛7w @$bj \"F;wF1O#OI*Hϟkʽ6["Lp8\[[K9ғ ؐ+m"4 6q)VB܁Ki 85ee(l@1kB6O8Ux u :V/:zNvu1rW]4; ؠ|"TJK+ r1)I9)*Y!!`BlS 횱^~ulL7PEK[=p Q=Sr_O52m}c#+:#hTQ -CcԎ馛VZ; Mܑ0D)Dqڈl0TQ6vo1z^ށ*q "$D XBAXꫯ~p4AOEk@Ųq0 rVqꫯ:c ށ|Ua:~Mzzz| gN"m[(BM6Mo풟D(hoo3ݭ!''_~zLg`.@~~˖->/~!%ͺg 6wIiWeeev|BH̙3{zzfΜ;ḲkԉRyE ;̵dB<^RZB a۔&ҏB+m)m!/~PhV)2!hPt{^$2-$JC=Z_PUz%|7#z5`0{饗xGi푬>h<0 eyx޽[ly$9KF$k>ĺ 4&jK}>CHVN#|* %ؚC+j`Vͭ =Kk׮]fz;xl4ͧw$,/1ͅٴiS8jgG;a$q֍oVB@8K9 B(T$`_lق !Bs j /!{qH$RWWW]]VY :CE  c s̩5kXC.5`͜9sڭV$&(b1 Zj0 7PqH ;S+Me"B{;8naRR 51̠2_~|ذa~˖->O 5N+jѣG/ҖÇs = L {0`~+ށ@0 yH6^xӟ^"ڄ, 3BPH]6l7o^cc t^"cjRF(N2#t*/}Hdݺusua3gs9HpZ=xĉZU E Bx7pG(6m#Pp C[@6V  k$ j)PVDo2!hZig9:uԦ%{L xΝWnjj:rȠAƎ{=X)0 Ua=B?#nz={</q]\MUEH!Qs&)1WXX\h4ZWW7xP(Ϝ9SRRr!FImuuuhw,.iii),,lmm}QC2^v]ɩ3fL;?^x!!}2\F$n5aד'Ovtt3}-ʊ>tq:BeԨ/adO>%K<˗7⾾C YpkQIMHX*ME!v1}7ΝGC@ Sc4J:`SN <8z $`ގ;.@ xڴiѣG#G֮] H$R[[Dx"a̰@%r'f?;Ս;v&Mzofg@6l7o^cc#@A`#Pǔi܉ϢT^Q"ȺuΝ͢j X`nLeS2T%fτ'aY dɒ % IX^^{<LIUEgYa5-N$`l.ZDu;$rBPEEE{{;@fܸq7x7o.++۵kn!=;;b̙===3gMP0رc7lPVV= M D؛[0rrrBP<*Юũ6%Zݎ-?+Y u9M B=)T٣R (`!Sӓ[J"~Ab0P%~a+e-~_ m!QWZ$T$q; (+e-"6!(WԀzkVHr5̟?֬Y0 @m3.!f^ 2F.\_>L#}H$f H8uTg]C֡ =,J5`8UUwMZ:D @ԟHMH$#‰ 6߭"zr!qDR_ AwN:icG΄H7Dփ:`yz jnŸ6{Hiݻ'peE(A#FsR_ Ankvξ,#F[ 5`>g̘s9cP?~3Fٗ{ .UU`0H!$D"H˻#$ofKPtuttTVVVVV{oذa޼y\]_ ATUe :TUmnn|W^yĽG !|$YnܹsS|QpI xG92tŋWUUxBpCCCüyΜ93??瞛={6ߨ#Lp… WQ3g԰~SsU䅮F   6.5i$Y"FG XQAԩS֡Phڴio_[@jdj۷o5k=ܫjƍξ>;Ł@(JYYҥKkį2ftI1H 7pر7vuuXbѢEWv- L}݇zw_eg1G=QZZj剎Gڋ/XRR͕}yEQ78@葾H7DidV^={6_Ҫc` S6x/RoE#;bĈ@ z : ?SO=-x1655i744} y d"&/t6gm۶Y{v0rHC7xC 0`@~ wȑC <8 /t6ݻ'M3#}בn 0=9{A=~Ot<Y%|ŋϙ3+,,,>|8 =ň$}בn 9րN >qDaaa':4N8QTTd~O>yǴѣG`ׇB_Q { K#@ mH:~x x>`Ȑ!;vl!h4 婧.G5z|+( F$XS #Ɵ/©Swy~#+BPEEE{{;@!HDW|_~?CZ[[N4~xޱPBĘ%m$Q|===0"Q'to\w X79//Kr4˖/_>m4ޱ| ƟmBבn[C@y|+G6qS֮[7t@H@}ƌFG5f̘1cTWW1嬞1cƼKW]u) 4̞={ժU}WZ,*gϞ-[{Æ kooO6 ɓrʉ' }Iܱ\L^:m$< 1)q"={slCq-2aydl' UUٴi0ȣ`„ wqǜ9s f^x!|>6A$!yGGǷ:D48+Q\ #G$"$jm! {d- #G$$0TU Z6IDATWȄE=$< E4xaUUU"WȄE=$H )O$Ԁ~!!pIX0:!f_ >PD5$ A2!h6'e֭HD˜˴1>\>^C%FA @#Yq: ݻ dlpqkMC%xqD`HRuo' ʼnS_ A0t#R >8Q5`2ĩ0I;I$-H$`Bvށ@rk[J"~тDp F߼y&?SMH-]w J5`( rv~F @hRNNŻȉFr;/) ՖrSwGP_Lnkk[zu}}ɓ'8(m'a)Tn5H$nݺ>}%LiqfΜ9sK/  sHxLF*`p'`ʕq%qa &*sOhTJXM6H A$U K Y!h_"-ޗ5O%A.Z(abT,$`L*#JǹhѢi]l%`utt,X`#V D5`H(Զ,q>NC[e1iҤ B)^k/u&a .JGPH+ xm-RD"Hw I9].b0|>w9K P{Æ kllHR bDqBx%h/vsfY?"Y0_$ )J5`Pu`0 _Dti Tz @QPuQGGGeeeee~HP%*2!h˃kĿrvA6gPQp*oY/7ԀGe (m0xN|De^M\Jб# d/|IIM^a.( V UA #^˨%[nD"^vBIL8MV E.<] 2f؊jJd2lڴIyBCihBvutt|[߿?'/qNmys R#t0@UC8X0@bE#4iF_m6 T&0dλUC ,X|L? Pf b2EbLm'BE K}AjQfCG2TU `h.{*KH xtGb=42-7U—E4EцcƜjss쀄LiUv\yԀ[@ rC}%$,P=40JX| ȵ\) ۰i|ɞLSɵ\)2!hFi29 ~ |r*mq>0fQ.%@ɚ0{yy9fT[#i՜H$RWWW]][c0!" QEJ{d&)'r݉+`ߖA2[>{ kAڧOh41. >Ɛ_CǸ;wr$1,3dp =F-%pfbF( ish4/FOs[[h~a+hpĽL[N߀%J!ph4 wܩcC7YK+`aK$7ٓ&+!`+ͅ(5j2wVN#y 8-s!ʼyy2C@ZuG]dF'_h$`3)Yg{{{ZIZHj|؜\Ӧ[X aRBavXDb(hlmm9ͥe#JGyJP㓤̕j' DRv2RTT;X̃ѧI+mNHMMI8,a.OZ$/7*֒arCX7J)]pEB]?PJ~^PPPPPpGZ\eeGFxN>=1S(ks/SFu/;{Eyg_x~[Q(ZxQڞ , zF v{-d"aW_uU??|W^wLutt,X`Yx'FWq$7*=~j#կijsqO=<NU՞M69{_Y~wuuÀ"EFtu{[d[IdO8qy)..>~h k w$[Oqϰ<]Fx\/j4=%_IէO!8L$_k(,.NEEEǏA駆k$$MNH]]ݭPSN{Qg]vmGGG~~@W۶m۽{E]tE455!ȶ $`8@ $`DI}ь38p3f:twDhkk{ e-#۷o5k=ܫjƍ#rΝ;#F .馛yQFqLxGUUWX1nܸ_z/b>F>o߾J4]rĉ = &\2:1:utǏ?~ŋGuqekر555{(׿?gΜinn?<5iҤgyf޽gϞO_~>(7ziN?!8뮻wٖowD{'gϞ;og}vɷz+yq!˗WUUzy89;xUU(--#+,,-[}/&'G+m6}tQ0F/fށdG8PPPȋ 1ZHuu+H藿~oȑrT $n{{?rJށ@R=; 6o|O4w Y߿s9Ǒ"6m._+_KyGᤓ'OjunV"t}k׮-(( 2j޽V0<} 70`nOSO͟?wٺwyԩSNھ}wμ#Y?۷o_^8N~vЧ~:f̘۷OԩS#?[o:t'W x~=zѣk֬)..~wxaÆaށdKUnMqmqⓉLKww_m6ށ8O> {1ޱطq뮻NBON6wY[v5kx㍜q_pҥK+hs_yÇWrŅd~_?}W<~@Xٶm۰axGa_iituww"+_׎;ѣ ;vy}駼q@IIɛo71b#/.D xܸqG:;;ǎ+H?曗/_>eޱrW=zw߿İ^Vq1Q7nXYjw;w 8rW\+8r#/.D>}z]][oW<ѣG+**ɓ'󎅡;v\r%+; МkEVooٲE͛V%7`f᭭G ̫;r>lĈK,oQZZziq9F~xGo|7nOz{{>\[[;t-[I~'OްaCWWWoo_%K 4w\Yϯ^xرcǎ[vmqqS+N; ǬX⢋.ڴiӉ'^38|28pmvm"Q'asN8;l۶o/..2dȌ3v;(>4MMM4t}{{>㪪~]}rL(//߼y3(*,,,,,,//饗ze_L)x 0H p 0H p 0H pY"aPsu{IIENDB`gsl-2.6/doc/images/nlfit2b.png0000644016036000116100000011547413373111455013165 00000000000000PNG  IHDR X'bKGD IDATxy`T?3$ L aI {"DaQPp! U_j.`Z[Xm]j [ @&0 a $ d͝%{WrgzGs2 'A 0XC 0XC 0XC 0XC 0XC 0Xz?PTڼ?Oȥ2ͼ#W޷o$ʶΡC~'Nz,=#5X֭AuJ$kO?ԣp/t_.K\' 7x']M&CDi VccO:U*EP1%b1%bb.VW2$j}6m1b/AA1%b1%b3U\\[v>m3=qW`QiiCDb(zB)DL~2222,1ƾV봖]?Æ qQ&]De4+++_{BJUZZ:ydXhh`سgORRҊ+>CصkBCC-//++=zt޽[`EFFfdd<냌3g<#OJJZjUggO9rO>y]6r8y#7ׯ?|BBœ9sΡrdEo+zP1RzPMo]&^"F1D ^"F4N?$g 0(K$oO'8zP1RzCuttuzv]tiLXY뛧6pw&^hX_V|5XH_j<$͞W/_cpˑ#{::L֧T_篙f&tĤp{n>l90>y#x?ȡ۶o 5cְ㽐0XrRSS%bCKJ!%bBL]q%:oSr1q9˗ kO{Vՙ+_Nh3NV6|QC+}?u\+kj4~vX!馪MBt_G5(HJ=K(!BKĄe2u&DW<} eذQG]>gSQfTBgZX鎳cN5ş<^o}mɶ3f3[aQ'];κXTnnIúa& GowzP1RzGĨTLwR`ժTbXOPg5oDHH/؜S|KR dsW~,j1Z۰@BBzi.]4\>wmpbX߾O0o0B ƘM˷[c~x4ok[ov~\ss| fa~l5:hށ--Wވz`yOUfxD0cڠmxΠ  ɼ=%bCKJ!%bJ;}16jt,ѡ#cf0~8c,)釕Iq!ovڍ_V emrsO"xeddH=K(!BK 7 %C&k|Yw8R{TW{-g |}딄't/_f+f3SmSOT6l|zӌ11/ʨDd Dpg($˗ 6c} *ϟb,ap컒cY;gnʎU7ok?ջM&S߰Q-yөƆ^G57!%ɯE(~lV9rzP1RzP:O` ܃,@ 0Xr%bCKJ!%bCK$*XrT]]-F/^"P A/^"Q)~8{@1P` kOG/^"P A/^"Q)~`{ @1P` t: 0zP1RzP iZ 0zP1RzPJ+ı܃E @`(^37zP1RzPJ  ܃5X @`(unzBbi J:RzPJ   TWW[h4EEEiiiҎ @ī"_p`05{PtF X())UW꒒I#P`ɑ^z)$ɓ']?D=P@/^"Q#r2%b 5l0׏+"QO!"K(HT_5XN T?k|b Vggo9rȠQFH=" ),,h4#Zd4㏛L^xAt_~yݾ 3X2ׯ?|BBœ9s,Пڶmŋ}ݤǻR]QEDLQ-[RP"!"K(HTry/^|wПڳgOKKKfffppp~f̘k.X?/^||{l$(\ μGy$*****jɒ%_^~eW^gʕLq;q~u:֭݇| ¾PCyyc BOn wJ)x`}E>dV)x`4).!bʕv&,`t#  ~\CCC%bCm޼G%-4(Q E/͞g̘矣 D}˰nݺ'J5_m/~裏N>16gغu"+z-48'M6 6,>>w)((6m'%bBh[h!v,腢Q E/ keaZVeaA%GKDe4󋋋Fx?K,. C( E/^"Q).=X , k|P`ɑNzJ^P.iR z%bCK$*Xrj%bp@&^"F1DR&b k W Pb4ׯ_XXmmmBBœ9s}I`kΝRA`EgFSVV&KQׯ[ہ^~*6|^"3PŬ"?,WvB+TksT Cnn.w~MMMnn`( ,YpT [(ކ1CJY.&SzPJ  hpT֮];o44TQ^"F1%QYYق ȴwP1%o7%b e4󋋋F#j+lP'? oP1%⯯!șիW׮]}m^AÈM|XE@jϞ=FL jziyyyvsGnٲE8 ]UD 1y8 .>T]]]RRbQІO~bm'v72XrDDP* ʺMiij^[|yNNNrrryy?Ot{gO%bCK$*Xr!F/.sCV!!!Krjd2Yu4ף\=N=y|D1% ,Qj>'?vsʢ+Vp+ p~DTTT?9 @* 1_XXpBlՕk ͝˖--,lϹaZ0$$N&^$4tTG!$z m'I`jq)CONѿWoc/>|ĥ?>nQ&SzP1l^\zkD "O1c۶]S;U=}gxdaJhwfn1BywÕ&R^]ׄGkB#"]|铍o.߇ gz3>{@/^"QJijjz嗓]y|"8g0RSSy;k4Gk{Ӽc{wߞlosW W^IC# ӷ_^iink>+O5vtt:^v[`Ŕ® ,Xu=,_|ĉůƍnjU(@Y2mk/7ŋz'1o;p¤QjufL'N4XJkPbDDr7o!^!K_m3Ϭ\^p*{V\ɝtz{q:Cx `퓾lٲ>ʓ1~sUꪥH̏YȤ+WOY+SoYG&rƬ{9w\ՕUy;F c?c~xwaʕv&N%%%8Rb[>KT\x=!9(~XrwwߕD;mrhlwg/_x^^޲eJIpBK(%B!CfF|ﲅ_fVҴC]]#7notjγ&-zdB_{ [-I|/X_曍7: ,MO5~7! 9?gHk[,4aQmIظ~KCGjyL_ޖ9-y>888;;᳧1%H`2ٚTy!o}#o`Vnf3ۼM'OIh3ihhxlZu>݆ |̾On{UPG& ryХےtϿVM. V$F|-}}nu&[+XIIn%%%B١[ xePlɤV=鬺bUVVɕ5[.hbqwz? _)Db(zD%Fj%bCY'nPSSk[Lp{::CB~xZ?'sލsذa5(c,kC[e]NlnnݽOr?)Db(zD,9Dqn'c ju@/#^iF̴~J-6'&[s^nGGS=増Q E/p IDATP`GEmX>ߢ%b 7j4ۮTa48Ǫl>YѪG ,u;^y'oT,["Ek\)œ7J{׼e/c?@A ɻKKK322%bC(~ۅw>}P9?MNi/te-ylܡåϞrK(M$ ,P:W%ꕎ_w =&mɈ:;￳ԉৗlo1rSL\!xzJ` aO_Tngo*mj;&ڮxU4F +mEK&حdܽ ]]QTߺ޸$ ,r#zjKĄ UydAJ6eSje0<{nocl窾ngO%bCK$*__%BP4w\;da{l u؎Ua,wo,qafsVW)Y f>=J'MRW,Ħ`X mUO5Z gVUv3tro>.Bp.M4<%j$fHK=K<u~~~קOzWf>6lplY/[,;;GWKJJNvg&=K]Ϟ"K(HT(䈷zgM{w|%;㋉sd̙Z{͎?=|^"F1DR q,r%Zձ%݉I=yK-FmLdVwBV򹌸ؔ!X,mۥE.7fQ{xrw07%' sj54P`9D&ḒPF77ge쀇qc46ך5kOn;-Lsg^5cȝw%1$|^"F1D $ , _&*$s zזI Ѱ.]_;zƪܼe ??2Ch4 lw^u;:ئ/ D=d4󋋋F%t;>M~zϽw$ϏxxG!נiCxcX{MCzw>Hw꒒i,/wlz O(HIDVԌÿrJ{M Dn'mwZy{nƆϞ"K(HT(ѯ(増$TGGZ7-9~'ϻQw۩&aGFF.]3gδ*^!!;n*.8ң>S zP {Qh(v1ʹ˱m7.:d?Xyɰ-[Gimm 81M{%vUgOP E/^"Q)d׎U>{|Zu``6 T!^"Z.I=ύ VD =z4bye>X;8p-_;_ﳟ=eQ E/?,7NSmm7+lٲnߡ܅]Gԙ˗˳/S{&S'5?y[miirUs#e˖egg ~]GbM;?4.mB[o` ,Q\d(uwCky\|nVDO}e/&MC?R`p ,9w^"4E;.ﶾ?Mx7OSOy32ϞBK(HT_5X C_cH]ͧ{?Z;XdmBrW7{xS=JIkj V+MJۻŊ ^b?ǰ@1|wW]1f9W]1.YY6q4U#:^<5ڽXZrV8rHۑ^" TSqgI`܀l%V\(4Mt`+M]ݩٔL!z^(zP 3XrĻCDAu_wH??NϬwҹ“ 8MlmJWD^"F1DR&8}񝿕^+z'O4pT_>10^@`C(@&:;o|KWπ_O 䅂4L~Ҫm^^#Ĥǟ,Ր@ī" @+XfVd#1''.==XuJvTjD`fnOɞ.jmش 7n\?Krc>kEBK(HTK`3:ן) VZN9ژY(J/*g(Ff>X[k7wشf?}V/l9u딄HjO0K2+X@D/Db(zDKEDbG+44ԉS]]2p%&Vv{6665 y^˷)ںS+w|ХטB ^(zP }ˌm{to3uYY&lOG7sss-7*zLKV\˝,)!صlfCQ , =]t/y2m뛖:22UixI>̕)Ѣ.fnOɞǮ0:0`hhH^j|>x->+[xoܹsx㔊|ΔP%bCK$*Xr!F/QjNw P,DddGZ/b^T+ҿ{ xϼtзOc|ΔP%bCK$*X=vZەcbM|AUTTbߗvttvcБf=ן0x ,)++{`vw VLL̺uȠoѶkϿyorɸF K]&`0C&M0߈^Pi6/o۲m}EDb(zD3xڵk ySǚ^H>>zhRs_=mb J[=:Tj ;n7YYl7>i8M?x^ݥ*gY ;Ȝ)+zPJFs=Cwݷ';;̈~?L1YJwsPGGg~cwaɥ믏=/Z=+Wvt܋܇_zNg!/C]m/Ǝ VP ytTC'%';;vew;+W[-0ȥԐ!Clْ`=bk }JKKmDCGf1v$&+ksK??.D&jʚ;'s%bCKĬ"R8"drauާĹhD jY;{3FL>V-}.}ϟOHH3g,1 P9L|$6=h4_ek/^S^0"y*wdSz!;7'[%Bۿ,k/7z}36uzRx~֛5MQQQZZ0t܇jcPVV |k.֣ADt޴^&DhVi/tvvp2۶vB7#%vDb(zD%˗x{ a"O~Y^d8ZQ;8%cо} 4EgpM_[ql+ѽe/]lB7#%vDb(zD%˗J=Iȓ_7⯾DGM)լwhI,Y۝˔%vDb(zD se#v tԔ*ePo;58!ŏeP`qj\ܲ:u^OKd]F4 -)tҊc&5eP` - R%*++{gmw˲˼3;5m}H1vYf}W/UU{tԈr,v~)zPJ=Ц1 F]_TTs|`{7Y}ZORXDt?h~v\WFgwy;clժUΫ6;Nc?6cٲߖ:r&Zի7z^;= rɑW_-A_J9㮷+[82ewd,vGI14 kunIw/XSCW&ۋwJ})]D+--.Z=z|;9{T77z{dw%bCK$*/`,p㯕FpZvoBBĺćg͚5sYW^^cd?4EN˜t׼F, fjꊻvjӾ?p>n:R_D߼>ȡ.M>?uz.QϡxVmמN7WCo>AVeNKrSЗR[tvqvQ5z= 䙈ǡo߈yW>'}r9vrZ 4yQ}tȡ.zo)Nzg^"F1DL*y&q4>^uVMO*++KIIY|yNNNrre;k(tsJȍv3E/^"Q)~ xG~~-_>. NJZNs }{'/gR$]#5a콼O5mƐJKJJxw/Lޓ,kP^uz۞]u-\"emԫ[=f@TT!,=IM?txmU&qG >k&DֵSc*JŲf aNg(OHdw$ˌO9wu_d⡗Q E/pP222h4XEI=!wb….\`1W]1޽{ysGpr/I222bcc=R3E/^"Q#z{H$Ȕi!!ѼY3Wgv4 d"l6YpP?Q0<9Jg̙Q E/p|dJ6;8n@~84MffI*K zޣ[6b8Xl'e;8d/' XΎ=z3p X^pk&y"Iդ ظ~#F9\cYSTTWTTtqzkH~<x|6}[t-zg^"F1DsDrh.*//ɱJ4a=ƌi/0W~ׇ$NvG =g$WEt~7⋹s>S&McnC4ڶ>hl2}g ST򬝮[^p.+y/^:w IRXMMMot@1S(1VVV`k{IFSTTf^yyNUd# xڵk͛g:}Rm>j6'?+@\7XbEUUՊ+}VҥKb ]5ywMMMnn`m[z# N"{ik3rUTGu?KRw%bCK$*w wjPP… _u '15k̝˟uܼG殹)YIvwDh4J}}=&HLXnذ>=cQZ{ T*N߿~ˢW^%9hFZSSpB'ZF8??h42P%b~MGGvn@\^QQo|ƍGi9ONj6}dof̙g3Rw%bCK$*W`\pppv6֎=xnjޥj/M+LX"C'GWΒ) R/ C>hlQԬ!jÆ NhiڂnCNX/cl$^v;:/pgm;5s6ԹsYظ~_|#GKA}Pn᜘0(Oq+&Hd~ IDAT Db(zD.h4 ڿüO,<817ǥ"ڎU}Yg6%B lf%-" R]~ҥWW=6!۶R \"vdM$`@qT*9#yqsp#N'&am[OD12wiRC?vIs Db(zDK\iw,R%:Wu٫ST.niRC~M;4xBd#|s3E/^"Q)~8:A/&KƟÖ];}DFԁqsa;@6W-3T^mrjS /"44HQj}LmCf5ibܑq۫:::GLg"@kDeee)))999_.g}'Oԫ`T4)P5~b<`7oJ33E/^"Q)~``5je瓩-8>~/vz~$(^C}K+q+J*3X@GIIի-w0I <wd*+^INN./w 谶3zv``E~~ۧE,~ھ}G$Oc|'FQ\#z׹J[?%Ȩ>8&E66!,1Y:,\pbOh;S1%0a X !wX{g2 %sh݇ﹴVtl@ =5X )((; <"&&mY]]]RRARԯrfI^f4^ewRie]z 0%ھ HtL(1~NX[@jn ϔ]1% ,9zNsglcƌleܞXZr3So^xY,5rY5mڴ/ҥKžܮ'l˙փ/mhk32۲;6wЗOnvku- 5~b<%cRg_mDb(zD% 222\LIf2~--}4)ۡ\(l{$Ӧm``[R}')zPJ.9m7ov>{NQ%6ŋ¼:,2O`fr|y_e|>Ȉ+ qJZ{$8ߣɊW}_7܃}He|>۸ud,-9{4edE峧IYe{ߟ)oq gNI_p7[Db(zDKYq\L/7yO5gOxrغG͛/γ^{K[SS} ޙQ E/ߥF ezᇭ+ZmAAeٜJl;(1ɥl-M[?$˗/g1z7##jžzf ݣh|U+ش,M[B yksdzG_:Ӕ!@.?,E3 F9ju:m[V>{$&s|7 j);!OHN^$FvfϾ^37Ge0FLbMJr> 'Ӥh ]ٱ׼'|Ǧn?ޙQ E/pP5ssQ_^{x{̸ Ͻ}4)Cqiqf3۾3yvUޙQ E/P`e޼X٪2j!毰 NkS釿tjۍsssqU \")ɭc&UW}5L ?#S2G:;;WwUt: 0Gnp<6 'g %riR4iC813vv:Db(zDKrd;tNne˖7|21HO&VQ;9 +hri.o09KkP6#h e4+Outtic#Scz fu&:rrS#ol^kPa4)BYx]mC5Na`JE/^"Q)aȰǞHg]v޼yf͚szgF*A.Rh˗xN1DSQYw'gǸO8}5mB9ܺBA]z??ɋ}42[<W*6:iApp(N-Dܺ@ `ɑ^zs$As bM>)^kI$+;ZZ{cu/,n{G/^"Q#q8OĽ>)h& CgQ۟.Տ DLl˦~{lf[7v C ^"F1D%B9JMMzsz e@\V3h$OS|4),eSNN/["*uOVwrCnoݐ<%bCK$*X =5[m xy~ _ [e?nik3Yi޶t m0 7o/zh5c]:1z,_j}TTTT`wgP_Ye3(Z⥬afϾ^37,P2񪫶vZ5Lj;iR(Yn31=߿˿&yvm޼v::MB^"Q)~3X44Էީ]==sŊQQQ, cg׿왛rV~Gl{_ ī"_vIPg~nl=3//oٲe^ܭF;]:=i)mk/潏VtV\"ʮ^ UêvP&}F?}Oy9ؚ'?](HI=9O}˯.6]&I(GDL泼6[[;v8dnUv:29M¢^"Q#B$jnnWo^71M3p`MSId눑F,y͎LJٕiPJ KYsSjW/N fVJ4LXza[47컓[͛gVQQQy,+p`Mׯ}wp̸1filٲlTW\N {gLU?\3``) 'l:=RW!QS{ j 1 ipdUZZ!(d7͛aˍ܃Тq^|4)Cq{7, o#ΐ^/.5X@M[tY1wp9r1n>m2g"i.=ww0kPI ^oE'\z8" ,9&/Q{iǶ*s&Lp ,9RBHD۶=08lȰH)§4nh,ߎ% -ܗltj-qI,K(JFexO%r e0rss5 oTY3^U{H겲˗$''{a"iPJ+ı])F7߬?P4pkžzfT2nsQ5k̝;ugW55O[&-୴ZNæ=Fl_ansQGTgܬ;$VII bUWW7R ,ŋ'h'dT5ut|܄H͛NZvJi#b,m/&Aۀ;Mb"&P&33h4߼yvcJoz?&A E/ k/??Ŋ~^UWf{*VO5j1ޭE%[VbE4ĉWnll>h***oҿ@U\RwWVRV;Ѿtq2_ejնSVE n@]Ee_ @qg2כ{~soy!<9XFAgtBEEǎcO>V9֋.\kW^͹B5 diȮ n„rB/_.E:OOO^# b\t+Nh4z^ >%D-ܔ{zp/LR[[.$"]&BcDD$A~qqC{3rȐ!111bϮDq,E_PE+$XBd8VDuJZ=u[<bty/QEDDT+K k乵NgUX9(d)/"^n/_fL&Ý] _.S苈$(fi!L6KM?2}kCAMM!b^9&d)/"^!lVRRv=Koݹ;L:IX7>>pio~nd9zAgCG={\n]ehkLcݲCoԈ'ӘraKZav H0{fB'VpOs+YJпUNJJ… CBB9ݲ9[!{_C&%<<>>^ٕ.苈*(fiUؓ֙{?Fd. x%D2y7nX|_e˖@1mܸqFEY0qN㲗"1ILQ*?真V?(%lذaժUFǷ#f93f 3?;ajeE]2B_DƠz ˟x̝W }}J( Vyy?)S8/gtQ8z8Wֲ[$ƬZ*!!!;;[_u|pf5;{L/"BiP P4ۮk#XT^&/"^ ڈ#xE ۄ[Q@yY9g=?--p5`?\UnJdGu @诃etYMM?w$sd IDAT z*vӚ 2Y uSZRλߨ1 uTĈjH)''F=wC j|+[$+߈mx2!&芹)} W9ju0kEd/""Πڬk#rWej}AD?,!ر n?γgvDʢfqI$/M `` Kf8JҕnrHīlSJӑ=?i)Z!r鞺ŕx1=N$VacG8M-/ظ[`!$XB./LJ211qƍGrKgf~DV/(""" ʜΜ9sƦ:gjb;!d/"^!" ¡T*?裮]23p7m˛8眻k.DY苈0(sjOuVssCjz<|eʥ{ӶDwA_PE+$XB.ڿwy;f|9Ru]8/(""" 7>>^&[{L1A1ZWPs[--kL/("a.n|9Ӗٯ}@3k*AL~򉕜3f <1)O T,n 6d^}]gLLL1]7sNT'獎y{M0 H8&Mxمݢ>V}AAEFF9Y}C;@뗧$&&*J{<_&:D s`/ >5eZUV9wZjj… #G.}8YGC1d2YBBBdd (4 ^=NvV]OP,Xms􇊋,XP(] Kݺ |5ߝC??FIw-*KrpFdddVorl/M$g?ĉv]2}{~ Z͜z.苈W9X<15]trٜ{ROWcݰGB&]<6r~?nQBHRRvd,B ,>"^ť&5=${Β6Wbuuq_om;wne2YVV*#$w+S5~u]Bfy]pfa9 Eo|zx!"\ Nڧط_#:VE苈tjXӧnyowWY :e;"F!U[L^irr̞;ȼ.RL6G_D#_jULLcO uv)?8sp+ґ.D? sA8`ܝ΢u:6œl.Ooʒ!#sKf9K9X`W).S_ēy8lus5ɛZ->s8yu@ҟs{ypw^Ss_njnW]8W0a"FH ܘ)1K8䊒Fgf{\rn:@. AXr1mO}}ùuub G1/D? sUƸP@8=kj9cc4>0t@2vnavu+BQqe5)Dr~ӊj- `uhL^ꫯv=66vձ HKK#h4npVN@@6]ou:CM:ݯQ` Qff~Jjj#<_VVV[ϜSQ^yT}rEL&6g'";/("",(zΝ2p kO_F2} # o;zGU_kE;DdE_D#ݢS.s *k8I苈WH{vjJ4:󽟟wzzzTTE? HG ?]Ϙ9Р:[uttOKǪq.`uP1чxʭ |v azҥ/_w޹ ^ZvG}`BGT:t͛NJ]NF>y[k S"""F: EI$۵]ܞ=$A}`WM?}۶mye^{k3_[1'tE_D#e_׮]7oެUZyy(dgvq.D_F)?3ό}3C~>BtQU{6XZZZllo<<(KޢѨ9M~ŝ8b~Ăx% Le>BCS-Qx춲˙- RYaaa:lQc9'_메;P= R&?4nvUQYpj6#5fbVBB† ܹ9\+/9SQ>MAI!dÆ VrP {t;ohyjd0ձr͉ܰ8!za&"،׈苈 (c fpǧCC{>b)YL@_DB%Dk39U)w2_d32{Fd7E_DA^P|2廦: . D^ 2} EDDi4ğ34477BBBBl"'/"aI+g:HݞxB$F^e"ɼC.λ|rʨ( xĩݐy#8sNlȰ!3-*С JK꒏465?AٷS;źc_15EOo(M t(H&ܔJe+Z]8{BNP|m÷T*}eSaΝ/9cc"sim.(D_eJMM]p~B*c<,ǟ$DG PsgDx'sѻ/<=V,P(,XיYe/^@q栛 tOl;At>~.shj$x3nRH_MZpozj`.vĂ3o|n9fužQ`)$XBٞZMʹ8z}n~CDk3H jVUU圖WulM~)L@_DB%DUVV'W7i_7}|SʆOeh(-MIJJ={z`3e%D)斚#ƾ7nܲeL& ?_7| I =nj *}e-WMڥ=F''\\܉&e"0ŦP(̩ݿͩ|3oG6ceH;p9O>G0ΡG%,F,F+` 6̮뫒O}|͔!U(úu!G756q >~\lM:$X4`o;9щ/pu:ݡcP_K}C[ zAmN ,!>~իw>"u3MԕKW]4vFw is7OrtҷHMMՏe"'0u9XF']=+C?i,+)nF8'9s?QD eL ց̙cЀfXiT4zM}NL&%k5i99IGu:ݐd`"_!m0Sǿ?nI>avŔ!Ev1117&8~)D"~R}=Puʕ~r#JBr9gvP*uuzwGr#TdK.2d~svmG$"E_DAH~. p''+}t:-iG\&Q/"^ h%KBCCϟ?8gV'͙0@111V'N#/"l$::Z&vdcCC Pl2_[]I苈WBd >l;=qK8ժהѷ`X$--mNA ~_"yùN{w .3b  I999 6lQ0{gP(O=~Ḩg &squNoUKk׮M{`׵h""">x<Ä ?>(;AF8V˭W1hZxѣGY}D<$(؇F$(֮]k4[  qLr7hޑfC2f,܍=)y`ßsV'Eff&&z(p駑9}avuځ}G233srrZ)ycVR:efOprΙ֮W9sk #!}L\cc&Cxy<=]Ww{Nl+**:s Sn%2'"ѡ/(""췔GH]'x=Ի99y?'.(` aPC={7>>CuIgGd9}AAPʵԽ4DdCE_DPŞqfgBf^>>sw9Z?̷Y/M E_DAir =.3۽MV x%Kg;%\'޺W'DwZd2A>~u2g;P@K:*BRX*6r_ øn<|k,Q*サ[ t$ b X kx _FtMgNBBBvvp+*}e/!av)fiWll  0/(":B`43ƎYh4+3`@/;v͖,OG_PED+ʽqu:2jCgqڋE]]RE+qO`"⟃EXK'_5:E]Ş|ܰDҤѣfņz^:Np tVRRٳ&VR-222;;gG Fw$N*3d2YtttXg?uI oܸ[7x4]ҾrwCu{V+/7+0?d2} { w+3y2B$>^KLLT*v9okTmLWQWN}333#"" /(""ʡQT*׭[~n h9BQE7],|EDPɽNR\رJP`C5%P$%%}E_DA gne,*(TFvcxxxffX>m2B_D V+ě`_N** ~y&((ƍ:9@\ 9;>ow}݈9`[(4Jf.(P9E_[YZ $Xv v{rJw .{}Z}.ef!0LFu{ޞ?ar=rآAL1z9}vL֍`b}P("""؟ !GkV~[pïeJ>V&-^xĉ59XP(]٥ã:T&u֍SMԈ:f!0ű+;vTVV&}HῼaOȒ~[lWUU}_|fM`cgk VBHBBBLL (F2ڹr^ž FkxHQWJ-YYYXm V9bӑw2fW {b+BHaa!>w+Me^Py瞾苈 (􌉉Yj3ӔiD4bT2'C?owupP :z6zO IDATs' .thmW"D? (1Fص@|CfP^'}]Bq){/"BcPEDHHЧo'Xj|KGN|K/WVV2nVĠǦD/7$7uu6lXjU+IߎEDh  SKgt}j߂~Fod?cEEWt$jHLrx| xb_{c,ݕkOݦѨ & }ޜ5eiIvΙ461JRZ|Y`,`mܸqM^cƦ#?V&!Bʤ_nT'7(kOܪ/Æ` IMn=Y]eCG7W2߆$%%@{TT4lpEnO}ӠpШ( >r1]i4-nw}viNvE_17""4E_DAxEwNw o1]"yh=W2up `P}|A2SW9ttSEeBlizr ΦN+)=qk:"4s_V=OiDVdahK{/Ѩ.]ڥK!, 3|%# Vt. X@evu+BHϞ}<]ʂ>/+#cw&^ZZG~Ga1!2_ D4x 4uZJ=!RF={ҥK3dE_""4E_DAM"ji;r+]4!^3fj 2,x$&&"'j%L"^=qjkMm mW-AAP"a ń Ӈ9+yh] \&Q@e3f0vqXP}2凜} \8 SY" >qS g߲#TȐ`d_Bآv V}o~nnn7bmܸq>/2qDJn6pp7,Eꘐ`dBS]0~O*y;w?Cu}gyfҤIp z!D/u3 No.@eu аϬtjZ`Yyۊ3!AAA+V߿ϝ;7a>1(""J$l{sh~}M4 k*/ٹg4u.e$X&Ya 1cht6fMԖ+Yn 7fsr5&zpFCC]<*A-C!2Ɋ_MbbblC ѧWsWgdjո p ׯgJ] y2rTgjUvn%!aBe3/ݭ}{O uUd2777ܕSw ]\G 5z.3dTVfd9)]~}mm- IF5jŇ]8;K|Z,'V^EDh  "2uǐ1|Q#zz]IU߹{9;w/kfe$X&5LRyСZa˗^QJeVw/ͽuNՠ;TVVgggܹS})#is [2$XieI*WԥKŋ߿y[W̍AAP"!8U:ݮ[ݵ`PQyP(d~ayyDṫ![毼[٨[pYQw/׍7VR?(͛HHHͬYڦ5jj<}PSsEbŊ޽{SDQ`qo;Y_7ݝk׮]ѽ%""4E_DA)ʽ{:[eC» isWi j2T(2Ǜur}EiA:.GHVXqqBȴi6o,VIbccD6(EDh  "zxʼGG t203?JU6\\IKKs]yqmtO ?_&lٲeǎ׮]k3m""4E_DAeq>'''3󆽼uص.rvv[TƆje^+MMM M Z$axƍwEgLc'X6m|2s=ܘ1c^}Hٟ%苈}%EDXA-, )OhHА^!!=\nCTFZjiTMM jMJliiVkTfeYiijhZZ*RV45BZRU zxxJlh-ccc)OL[o=cǎ_>99gI ""4E_DA}rrrjaaa:"spPAA]-hUKcIUB4hZZ'B45BTu>=dBRSS(!tN222؛+>RgI""4E_DA}˭}ӧO맜@ ߴiSmmohPϷs`@]|}*p F\H|nBHxx85---mdϒEDh  "",YD?7ϷoOWM!,BHRRٳm"~Գ}/"DA4WܯІvu͟S( V@@@uu5aUUU```C#^aaa ݍqqqUUU~^^n>^nn^nn^n^nnn^${_~6~$X ~:{{FF%lewO?p; B!ŅǏR*\nnnn^NRWw]%uvJ]ܼ]\\]]= !.RwqMϗd6Z f͚sNvsN`)NJ*he<̠ꁗ\^,B9g646&$S4.ٕ"uvB..'!~@퉅2nС˖-Lٲeۯ_e8b P`B VX:u͛wNXL@  1$X6 Ɛ`,}UTT4|_____:ʕ_~_[TJJ… CBBo~RSS-[ֳgOWW.]vst?uIXav, _HJJR(;vرc={k&شiSll:"zM6oڴ믿n>ɢ-Z|򢢢ɓ'ϛ7}[ _"g-^ݲx?Q՝U(իWkZׯ_ݻ7\;_cyyy<] jƍK, hiD EAZҠ^zu+҈̙̃ z*ݴEAm۶~ :{]zj"222d2YKK o]Eiڹs"Ν˞)!5q;v[m&lHKh tҤI'OkV2޽K.oEA߿ĉ4Qvlٲ'_bQP...`}QgԟzE~_~_~ ߰a]zjJNNޱcGEEEEEۃS[B"+wСCO8s׬ɓ'e2jݻwAAEv^R///.fxӓYź+UQQXUUg׬dQD=z8uԩS={{ֱ2>}z^^^Ǐ`Pm;4 4얌:?uM4̘1>:u*F;/ӨQyWXT~~~=8%V;I'2 5h tR|MLLL`` ]EݿԨQQFݿY}zRy9??cMw5k֬;w[v9gG")U^^>}?xʔ)v5y.\0`.<{AAARsOMM{bkC/y1k׮K,ɱ{bezŋƎ+y"##ݾ}nNӘ$=zoy^ݻ;<~[+?;S{>d*S);͛w>۠A:vi S"6m8 ?{Yf͘1=!!aȐ!-C Yd_'JX⪫ka``````(..2dȜ9s*%8pM6-W_}??M`eeeKӦM+O@[y5Z~-K rU6:.XDw9pV6 p^P+F_aȞj8HI$p;kݸ.8سNSHJJjӦ͚5k~ O^u9=.N(U|\DeKQD&,3h PRFYΓEYPmZ|_ī<m&Eq7*;c,ipE.~YLlH#T5iEʧ}uJPR\H5vzBEpp̘偁 k49>ujf+OڶmKvv@@2~޽o%V퉉-"n7mJ0`o,edGVőx*m֕fe)6VEDhdټS%S ڊDuzjywK_NSgE豟;ryUz*T1hܕ:m C_Uz-DǼ5SEh Jˮ+-WlE{,`ᲢpntTCrwFl=jUdZuDKD(j{fPzĦ\IʙY_MЄ pDGܖϴ!F/<KrF+a~Nig,˽rGZrJ*:JHC-sơ IWޞ@wdީt\{pUcb̝[pElԱ2_d>9c=/|~GNNz|VyWWr8'ON_ V_Ν ?5'w?%ekd_E&MUWXWS4zx"}|tr<ܳ 8fM%1\ T%:iW,H/9Z#YYQJlKH͕笊LQR=)M(jz갧 *A+4 O$UH+f:ezLվ?OydRG0Tsed~e le+y:$ƒ|R aU#:=~{v5X#1%D?uk)R"NDSSD/kV(꣜rk;jYQ%C!C*TϜ̞^EXZ<@x`ڴiu꟯Xv}Wٳ6gDZc\NڴIT*ҳ@FU0JO.3IUp7:hӮ2DW+VEfy;L`F+WC늯U}b_>,xN[P[3U7fzywa74Ed}rHWXmu3ם!Cjng)n&xǴAs^(Reу ޥw?EIr)7]7Z^N9In , :ܧ^-=VF(;H)/{$ً8VzIgv+ O5UKKѳvcO>!:7BI[<#hZ}YRVƌǫ1J/όH6}䪸n*)Zpnn`1`A%er8?o0`ejyV-qqGXңV^^\3ȅ[/ᆵn;O?3ug]?t[okh㠠s؏CBlhQ+wM۞*{~~njҭ2?jcT1cR.T -S11;CBvOddҘ13g*dr:KVȺvεn]8cF6ZF[{zi޲$Y=5XuLDi %@QYSic=˂ޮ<*yR z"HkʍhJsݔqi44cKgQQJ@?\ljg,(.9dE)*9K\M*2Emųzע/O't2ݖ*sլx|/P5=NqYF?5kq'Њ1ںOWu*J;P:NN̒ ªJ?_ .߫<34lHP:zKu/q9G.GKS2кe 2}c˚D&4{qY'@ ʳv@JN`߻n6[SN;+|U~ԿsV^^^F^{I&5iҤN7As/fԼ s]#__U\$"U ˭+4CDвPDQmvj\J6Z| W؝jXQK7=I]M,)١ªuMdίaTrQgUrJX鍚:mvy0qN$9TXDSKQ{>3R~iQa=T$2Z"NKH8(rYQ2H;dA Y(-㖶Ms+- Ir9D}>_8O?P\X}u_鱧Գ=˂ '}׶z2X1h|K%%Z8X6~Y('g B hmc~Jg"`Z _h%K<"ZC)!RU ޙeJPr:7%:Ny_tɫn}OO#2&:XNO%~9;BDꑊxݣ'OV%Qg]\ݿs'O?,,,,,?Yf%0pZZ)k j#ݻRM"RSUX(+|Ppjt?}꩒ dS$%z=?g|g=/\(\#, ީގbaUpw}IH< orJ(3RֻQɵ%q_x*9]r}o7M U(H_hLbӤDn;REQKvIYɪ pyjҍr[ǔuR~^FޏEȑ$C{SZSްҬт?I?iZ#š7h9'䶹z*D1:U6зresRB#בrJT*D ruKIxDe/Xٻ;< QQ %-Zx ߼Y01#jԨ .2`ir,Vg~86o޾i~y ÆCl5j)G9Oy'OiyQ1*j*tKbb.KNLLJp?ޙV!S~ƏW@@!!?^%\?,5 ˤr}wN;>/V6ߨ[#-:!,rH8$[X>zeHHwy{N6J}y*eE];Y#h% ^KS353Nqs4;<󱞊W>y< ^ۓY-=cQ 1;t2Mm.OH%;$$9NƲ{'E,U*J0)#_0Y V<2xvIޣ8RrHV z"l Ƴ\ht>ԲSKQ VFwRfE<}ԒBC Ըq4rKÇƌIV=FD:*ŭ;9˗Vl!!{I0 =>BP˕o޳}5ˋu8t||/X9K22r.\逸~l }P;~bG(MMZLlUxis͝޶[޽,PK?֙6L_GڻC{Սs(e]ƫwͲ{&b*EPwuX1(~)q`WvnjkGhE%meϓܯ Ul۔}gecdL'[XiU"_*C-Ƣw_F'(Mt!)KV{ӭ-IdI.ifWj\D+Im(C]u(J*m:vSHHUU13插sw ˈKUԫi;[9ܑ1mfvۈr>HR)ocTm<&SNƅ21 $<Gl2÷T SlLg4Di-x.8"$Sg$1?Yw-djMn˵8zNk2c"=|> IDAT,s+[|վǯ@iLa/犕6H˞N[69 |ƲGqS%wMúɐ pHI$ Os}dF?ǃclpuѱ')%8fϦKo_?bbO M`6xmhg;q"l9}wڽ{hnݻoE):q"c͚͛3ػih@:u##""ܟ:u"#v_bGrss/ Ӊ% S.\:&d2ݟ}Nz>v5||&? ȳl 6S)Ÿ7P%y6~>6\$m[L&jT{7Jlfu6ͥ*nͦ,9l·J |^Gׯϟ<رp7LSO}a_Xߑc\V>u^{vGk֯_ֱ:oϾ}Lϗs7Ǒ41nKG74g,`sf"Gx.FǗS `îhQ`O7:ӳ:\`bgKZl.LL:]` I:Fb\C8t;" \lO9۸<\^gQ7)a{_v,'c"bN"Љh 8O(:<9.r* ~>P =JLD|K,o` h.q|j![|pn I7r犧8 zAo|E9ToȰi(b4<gXv}ĭ=cIJoxu4I1qSSp.Lo=[7oNL CV_;v͜Y]Bg6&7 h[p'J)LHpMTN;8ciӇ fFs ЌyىX©ݟ2 | 4r٘h Jّ}0p/J}0>\ECh[rK_Jөz _9 [ɕC~b֌Z ys'|*7>Lgs8oYo_ǻ8ugFKk?7&%hC`'5%>qK@~C˕S`A鎃@~118fM69sҩSXޡݺth8ٶ՞m.IIY/ѵo50xn8\roCVmuٍ Xog>{dxF5hy}{Knw$.^ z];eC` ЎE}`Ĉ3;h*b߾-ZTYYdΜ23=khcL:G;)qzOi\.K|J%{,{ӈ }8m/-E|ԃ-BSUNP1HR1=v֊ go2rpF!}2gZ2F ֓1OTqS~9nZZnfsAVj ΩzX3fT+”PY8xPC^AƦl[(xep'5x7©`TB31 / >#E|3 nB4ֽ^8 F;u?ñސ^ogHspb7Kv.@> {wX1ϓ0M{)I"C"c_e]źu̜ɢEed -˶n]̙%l͚=PJ ^l'Nl\eKն'!!]tڽ{XNy{7wQR}lK/L7TrpIV'N\g %`;Ѹq#|}+L }47>{Ϗ(o?qVضN/'+l7gge 2~; ~z 5(شqy{Ju'ܳ*@M\w-pA 7~adcJzk$}ɹ C`S5Fp# ~;,4G8RH d/u&\Ӆ±IfW 3L1ankJXppR(O<~ZytFXLR&W`K嗾$2:.'}nnnRX{? 9ŷf_zDWܡ-Y܇)">þiw5s2\OjmO0->Y60n$tɫiYGINfx3Pnt=LANhq1W_5 WӦ犋m[N*D¾"oATR&3iڕ|u5bL*Mdc~1-')`@h@~)-> 9Y1'۝?}Q*.J4w GM3{krUxn>)r?r|WQ# S8HT}&&pqlOVKF_LN\(~h_|J)OHkBx2;ԑ;'y%a4d€fY7ׄ m#AC`6py xΎb.qc+ %j!5op.;ƱM{s^}Y/DW{dPx Ǚf\|;WGq eP 7|{]AQQ0p ՏYE't&}ߩݺwDn/ԂMέ]<آEɓ>>uEF7IS`/ ,?}n:}C?Rf9OڶYtc+K+WX}OnK@RRi&Nnմi\`0g1t6Av43&7 n1`ժ ګ-8ss2>mަS{%9>!PG%!f &Ꮸ]IFțwy?}P-OR3 V ɶ174r O^W5WLl-ܚJ7}5Lް"JQ4NGT`ʡ|e@gؔAI?%PH, +W: Y*+]H*>pȝm pP8Q+;3ɗ i|n& >-P\FZ wB ;Q>D qq=%f̡@U> `" Zh8Mnp9X>"{<½0$el^P>'q}?zyuU'V{o;N.a0ԯp;?| aa?=F۶s9Ϝ\Yqc ΤvS*ݻ_{wp1HO/ش)Ƃ]%%%j4MH7 ~MS[5:/w9zGmxuMo깧~6ݺWvjMl~ߥgO?7p`/hC`yNfSVW|s}rr\Mge֮ޫW(y<ڵ9z*B\эs,C<[6Gˎ=z>8MɘmP[>:LFjrj]DtXޔ[\A H6Nḑ.U%FHѴ+_`ӴY2dI)~--\'۸=큓ZL lܭ)$Wwdi^`WL3y>+@_8r `NV_\ur5$?\zd>UC9A 7+c(8˺H݄ɇ6UyI|7NOq[B~: U^$g-?=:1]w$2eSgy,Ϝ8l[/pKX3+; "88V-5kJ7ovGĻ1k߽۹e hhؙζح ?mZ>}.Vv}Z-/ݘscM(fol}g_PKQc>or4lsgvWnyt!-^ 0f1&o}锲ӇgX`Q y'#~ ݬ? kNd0'*|};3r?Q@= ӰJ8p]2H̩dl@3"bh}S}_()@}G ,giNhדfLd;@x'ޝ)`jvRpJ8 0,gÓ6AS] jlç _ȼhzHwVLfZMmثt%^GxSXz-'c:zd9'ZL`Z=䙹T͑ySiCXHxsq؊3({YiaP lZÈ{!%`@z51f իc#FP#Fo_ԧNk8P;%%bX(nR0eJV>Udt?vlIB+' jժJՇ 5rdMmC]7R:9w`_ھ=);%F_ ?XeM 8hfHwJ4z2g!srn9ٗ8!.~vX`8%.?Q;.SU>ZäIa&L!Jy!dXB#:BfN+Y0sxv[y3fH2c qor~Kf͘<3g:u"73iӆct|eT>R;--b1cp;vL}i5jdt7rd…, ۀ \2 ]W:Pi?/KN嗭ү_ŋTęeW G~sɹOy?wauvA78kwY] V+d1X3I;lּ.~;?Dh myUBRvZ83VH:uͱ۱XhM]oL~1OeɄlذ_$ȟ3h}?47~NQU΋ّȫ}iq1k0+TaoKl,L̰#w@WCV1 ?Aou1~C`! z M}34Ĭ3Nx06v|6YJ#-C;ٷW 2l<ږb5MtoLLhтnY9[yh,(H/ ֨zӧFTQ*TڋչUZj<·< 16b~;ҽb\vqy';}ڥg2'*ヒV-;kڷhHpqӦ=4^ dB$bNZUmca1-Oѧ$c&JZlMݵf~LjڈӃ԰L^R-iS @- E0bVOcHQ`,\mDܐhY- s?L 2 gh2{$YKoA_;$VzQ ls}0@@*۳IQԍ  c>L?@Af#%TQpeCP籺L*&q0Vۘ3q`21jqcɽJpk'(;/г&?ak+ֿmO hۍDsd*/a_kq} j5AG9dи3c6RUW*GVاx#4&?uP-\8Aj$%P6_oo&&D` AAVӮ7n`h[K6 IDATGVT]\|RJOWUڟii4UFi]_kZͬ&Lq`kځYb1W):X9BJ߼w^rW'EE-ZRi,=8X>{ɒ%qq!'˗@ɋ K_fXqbBcpb ykԮB|R 2X!:<C1m{4M&J.bׯk}&V|=.1~?;*/w_ؘ-hՊ֭i}iJT ӣ"zx|:EyԬu߮P`uRSGϛZ+'G$=]qK#FQص e EE5e|FwJd_&R EoSSmBT2 2Q/iܙ.4GX 94f'PK(TC`Τй i#!E6ZPp :.CGRPu#=8bHQ$*昭E@zwrZ RN5C WŷsK&|gQ nl[|"E\kzd&&#(jimvFqB/8Fŧu!}8 /' NuI $)"CIW;;d>FlHӟ?I۞Sw+WNmJ)Q“n XS}- PQlIUm1TJwo` ~}ؿ ,ţm|iO+*xnNMu)mҲ%UbcC*ڟrXJT⿆˓֭?G=ڳi63T7`=z۸N׮M2嵻AXGꄩ*7lՙ3V=zaԬIdd E*aGcYI#Kμ_qu" 0Ր M"mNetȑHDDJz0ln0K& S4IP@Mw ܒú"_gzb`$ ?#JG)rԿbC P"2Qa;G w&RYx @r5cIM#"8572 ϰ:8d>F@$sT؇yU {xE92YTd #(rzB43:һdD9VgZy59gA@ 8@ x {PbE'u7!}…)>Ցnkra9<=*jiK5ЄiQT]j'rdYi&tȠr/cVTwr7ݜi?ʍe8[uY;;,-]Uj+ųg3/h͛V2޷!W:X 8|QL4&FcGaì[W0yrnڢ'OTx{!V1ujt3S"nbcx19^?^w˴ϵB IßA%<JNkJ]d2}c ^H WΚ|m P'lጎߴ9 8uC$@cC~ O#uKRNdpg9+@)֣PDiVflsw&KIXlGk~mF e FhE@7x("2Vg7hԤ'~jF8DE{wxL:.p0V:JAΥ0 t#RMOq."  t 9$TAtQR4Z{Hyc[ jr Mr],Vb"ׯ5Ѥk_DT+QP#wl%NֳgR\Qal@蕝-77(>@ 8>t8XߟA]ȨLRWzX|ٳ˄gϝG,-yL"לTJIxt7]/3cItĻZ ĄE!?8Vչ9 {G|9wZY Xw (hNCcȀ0E7O# X!ΐbp%mT{  O'rU p( +pEH@Ɔ8.1nsjy?gB3ZfC@EvCd<RŊ=4O2tP@D'!<oTx/ 27tYHBeҥ@f"-+IEXD&T ,iRԫ$N/$pjvZHRX9:^hއiԩpd6s~EU7c.UYY$&EVIIoO:{l%X4}PXI!v8ߊg`͗vl5mͿ|Tyժ%:`#Gן`U:XV7>C:Uxp2Eremf ëԨ!*˕+̘%q x<:C{oVr~fIįX62~=wh_SEDr>?av@M0ۅ%:-!/؛'9x` Bk41~e j^'.: v;z !/Or?!kve.`;zԤ/cըBYH-Ʉ@!Ϙ ։f+,٢çp LДj"D@_REYmu13|wa }xNkry?`]k'@oפWy2XX,9#CQuk 3gZ뉋+itr`8jSrGVMƂ8xq/ꓜł}%kPՔ켥m6dK/Y Vs/^xɑg2ɀU3I<9V9wWH `{]vSHIYӈ/fu!E2=_y%V0ȝhȌZ {( @h@u4%ǹI-!mq?!jܸ5 `Ss :em2߃=IQkx3=чr}Vf2uW@@c_ff+. QВĜ9 h#댟ۖ.&e2NɡˌO+rvݚd±o~?X{P->I*|N.Rr+/<ۻVU(ԃ|ëLrqWt\O>Mn.^̝:vժl|=-?_}uev%/z!SFo?"(O5k2*ke _N eun*>Hg|\A{{ٜH>b&_HHjNQF)Ƭ6P@-ຮ~&,4 (KQ,S[ 󄌺X.DO 9}1qt#F<1f5˳SA 0FصdVL,$J ФygLj4M#̄ 0U\h'A^k,#ҕ) v Eఌ_+Bu9צ YL6* lKoZJN&GPX:,F_;UϹ%A!Of~\ 1K;8GWz .tMHȹ=ڈeB pqkҸ5z立/N ,,1[;-˿Y"FL B |tyYE2@o^,?]! ȗo/GLʳ0VNo ~5;1*I-yu+ƵF%H=kؠՒa3 d󏇟yS`i8]͙41r 9(y<'kñ'uvy^]ѧy*}~V@*zMfRɘSNF|ospBVqo77aK ;;27'k?~OSu~*$dՙuPj'\?/1̔;9*?nWٟ`]_;XjzŊ3":vr6aaEb "sy|9s<<V )WIt %lwciV>+wV"N1 t9Ro">][јϰPiDp6ë]^̬y䁝ྜV@ 6=⯉E9 oM%08N#'LdzP<<7|80:%tj-Sx<3T0#;"L]Xe\#2ftu0T0hwKXls UE$"u=؆@ُ< _< s{ Ɂ4_En%ga:7/ZnMK9aY91;{piū4EѸK|\F^m{=ʘɤ< !7yYj64ha2nA׸sBER]?`鉅=U; 1|Igw{Ә?q8 QRօ)z %WTU; vY[S 6Vi"= o$۪aILa}2Lfq?y[H@tzeRk5Ņs@@TBUb6Mý* f^zz3SԒǭM- ؿo;XJ-qHjk"..5o-ގ+i&Kxq=zT=stT:X\NM=[S\Ln =:Zv٤IenWSv-]rlrpN\?{74>K* Z8^xݩ2bir,]/h<(T9ŝT,"Jɻ3.ŌZ7dUb)$ !B#ts~~܉tW5N=iR7.L&.΋nkqjS,K+x|Fr7  LR:"uzʓ< ?Q% BniԊƭiکF|9EvI$'EN)I$ENҶsE#y| k0Q;C~1WݕM?x0;C*8#Xs\XrO߆z*U;B.=IycmU')''|Xr wy9/wOmb`G{msa)8lSPr.,c5{*Xk5ӡIö?hjunJr Фk/ޅ)~U77;Y^T?u}G:׫kd3CIJk,:[>IU3YGlaܪRtozd މ-7^){o0m-{?m_F~Rf+[kggjZvֿyo.#V 6թT*Uݻ]>{tƌ\ssӖVV%,\\%:h\=BV%od4p^$oA| K". cgNB,t~iHpm06'`'d(6dlk>@F$YwjbKiG CnONRWZVx` !y)4i-BP^X`<֘R{28|Wz/|_@JS$q,6BUdz6}ՙYO0(jrhmU"CzC.tcIƩ)XOLR$^XD$vw6WqEU'M˓Ư yŊML)~*`楧AG;5nIV`U|5:5v2s& *8] OD,:߉}(͛_I6y%ߋzNr`Zzz#Gbc ut7Jovoo/uKlY.%ӧL^5-eGQ}q%YY8#-kÜ%kdΝxVQ^mM>JjYNnv$⎜E:`/h$jHQM#&9МjqS^E !t]6k9K!`[c@A*PlW H},Ibz//pdԨ) hgʆ"dWew` WZ3`< []M ^MܮSu"j%Ix y #-2D/&d9!CĆ4ɀHGVd=jd*߼N/=wz&Dg!}HU]迌e>/|ěM؂eԨOfG3{ПڌLi IDAT˄elj&.3zM} f }j&90Y4m0.'Uu_ɵ̝ŹjtnQM9Ś_G+ E4oe@u]ou2j }w=יEcmy2NN{#yWy;|=Ȗ1֝Xq)^iͺ1*r5~/UX k~TkA|Ї-­XHJa_d3ii<>ǥΘ/n x&u+D c쇟 &/xq*T@Zd }@,VchM %%(1u9! *7܆:xNFM~BWT_GɽLdo]BTO1}x4.cdG][ܚĝ-#ZHAQLr6HL̢HĆW 3 \"t,ORŽ8@Ciԗ tz n! ‚ui,kc N$ Caͳ+vf~R{W`q&QXsLj' # כ 6tYKWڇimRfب}FM-Sr_o{l]q$881tkߜM?r *2l $+@_ Oɓ)joK%JP`i1}zmm22doZZfδO/ҠQ#g/.]l`EsR\iMO"!{ku ikKkL،\Xߞ]Qbݭי^H =\75r<~lm]8Q.sӈ)^k[1#I CA0C7&- ENr@gяp q&HnR tE< EXb9!FuSC}:xK;x 1a=ma^Z5Y!D?SP!DTMeKT F=a6(Xbc#R-zIdDw$q!j%/zUW=7x]OaLv$zr3OͰyG䉒X`[X&G~ J,=Z30_ⷈ&=I% f1 'GqΖ>׸˞LXFZ*ػ3X<)ւ.5Py\~4NՕTt̀J'}Tק%ltLY3 O4@d<˿f_T׏'1't 4,td<}%}/a$&?no'osnF"x.+<%{j1 @csWDc ׬d~k@,È,@9ǯ Qsrj`-MYd qK!B !kJORPrH>aN! l8'U x rLj&heHH/+C0n"` cRZAҏ$Zi{jC5=]]!P 6 1}Մ&f$ĎF_dLn)Q$p4H8*9@"xՅ@gOƽb\y BIxA+2SN׾2SNĚӴ[v8_y:IMy$~Λ4ғ6HD=U;2<5+oFz;h<!6 hifi6'V0#O~>]z:۴BeF|׭|%{ ^󻡞ȭøKcI^PAW3/=4$M:/"WrKxD/ #ɳ]mL*6xen}JU'rB?lY_OMzݺo@x=0wnTZquaT2o^ȿPȒ%KYu?`l\ ,inWP?ExKBKPv2Xt:>5 ZPkƾ"@KM"$HT]jl`M{)f^HQ%[{q`15FѬ:[bmx2=L1 #wkBV8|"D@sE~I%F3T*_&biV=lbTJdHt24#$ZpmG*Fz"c}qzUo~Nswz/DԦ)- DTx%֛ٽXdm4=ߞvkWcz؛鋅nL j8ky ׸MC=Q}SZ,~u+CGKÊGyS\1XU OD|л Rʕ5xW2Uf!!9[69m{&M"BC Wv2|(8)IZPu˺E2O';sCcr<2-Z{&Y"?s(9>q~~AӚܚH-;˥XW$B|9<, 3i3ibDNVa01w l' L n|FHTY8.HPr΃p\@U$%b&d`+0#=#ΟSIxG{Pp>0L.R `d:|CoPK=4g(J9V4hOw ٌf'*| *9+r;߆X(xS.pw.^TZ.?VߟfN.:9ݻ?=^ʪy?߶ލ֥= Kerv$*6M调撳;Nͣ`n1źLm,t+oǢƠdڝF 7u3"Xb*Q )3LGh]l Z-C'p4'dQb "9b Bڒj3Ҥ#Ix@zS_ =NqI/EIV(+UhטI$L.K\JtA] kan?2AȃAr'*8 3_`RJK]1s5 Q]/Orw:9j-u)4΃d>JpEoѾ*i`׶[kR"<'7yzmh 7,0oѼ;7ֺFV|GOh^U7a[čysu>lѰ7KPP7khl,Z{;F׮ϊ͛/_^Qj$A8sIe4˗8;kWC.^g,UfJq ]TO%NfF_.tQՔ#15-Y݅?3r.s}uL@EBLEOc u|(TǓ:qu ꎣS%rq-fxS\q)Ct[@!DSj`F3(zPs 5xڶBιk\# g]Z0w8 4˻̗esScQij&C5k3V%x.Ƃ׭ ffF:9KdJGd>tNlyBوJ9DL'.U+üi8'y*ZQ)c0C9'~[+ɉR Mдeq;K-^Zi[Ǫ RALၼxHf2/^ VOx%fiBŌOhTÇU]|]-Oht t/_T7jtӼ mw8q R[2 p+˩_?-:Zqe׮exRɩ%;c۩bc#ccAQltΨ<'R$ [e`1YuR%Ͷ(Q^lm3|1reh07m8Fa,~ꚀF=43榛'x%بy.ݘ'/Bq |ϋxè6F"PHiAvK\m ?jhTDs&{Thن!Tc!OUMN$QTjuv8^1M/jn PJ!{ xf+ys<ądlGDbBGȻ#f9}9"YH$jEXFWycZ;/wL%Ÿ"qD<| "2L$?,H w_Irz$ZaVxJ3GVxq" - b7/B.7B.M9=!Dl> FꎢF)&^<èRAL~ 7bҺ*3UXGMW <s1)*EDžiPKA )3 kĘJ<" Y B]!BS]$b;bV)T.E{_EOz!  ޑ UJ(**FT Hw$tGIp{}K${v\3iCz @ՠ-+9bk/ T 3n̗ZPŝMZZऎ*lmoVm7gdIWV:|9. px|&+U ̣hrX.ۿӣᬈ3n;=bB].:5=<7ү۷;ͭZeh4\ҨQyI7ߤ>w\\S.^k樛&>{eK`_,'eKA!!7owgiVkZW*svf]nQϱZy N⣏;K`gVaDF4#veVB**V=Y+q\q5gn f6sJynBSEo{iGL]tsȄ*VgMtɢX B`Tl k2bO 1)M#cgLX_ :K9mz vkV &rq??1֡UOv0i\uǯ=+*|1 gK{_h3<ɝAJ)* f (<W᫦[rs UcLEUaPFQT(gp"g-(ӟ[NrJF=yM'7 tfAN5s"!6D0U0!T RT3qy-1 ȸAいEPWY@V.!yTǕɿܛS}Gz'Rk p) sm% L+dO0[܊wlHϺLs0t\=_)8:AZг/ VR _|l ek6M>ϸ $LL% Gql6P<7XC.x& Bdzȱ2ݏP>o žFRxަ7RDu+ymgr>Hv1?-L\2if+ypf=ct{/XקP) R hd*Դs'Ǖ+t,a3{Ǝ? C˖WL&9vIN΋z}׬ٿ`x_{ C^G=y [V|>;\lY?> qwWWu[,y*c&;'W'Ѵ}1*at$˫9!mQDsO 2[RWQbl|49(DKv}V&FHЊVyV&"XRBExK\;$2PK&USNGH(+XźA6DJL")irW(J"oEZFKvc:9xV:dʈݷ/NZ MFEEըE"cDA9JZu"vbur"5T wܐءD#j_ r%>Jַ($ Y*;%iY/WX\Y'cY2qKDIPWQ"B%j̻:J^8Qf;.Wx]fƉWŏ6N#d&{'J}'7%fl(Hd_.+Mb>F7FI/%s{c8KJF+")R0_ŭ"EEi/b{_+Z/ ՝$MJX 'ߊXJz@މ2@J+[$"JމrY)yWIg{D͒-zM"w$%.sUyRC΅ISXXWRBEB K=D2E,]ʐl+%kT>/S6۞&hq&dzq'(ZZ*!Rݡ? DH/H5h~?, r7̑O arvBŷNtJݺRmӃ6((53RH>!8̄]iq!"X9?~5j8yQB-*k]pꪹ|9aC̝KX11.^]W{ IDATeB/iXkRI)гSSy+6lLaM4`˶}XM$~s~P N_ʧ1-iKEfI&$JL*Q ™`jp JT -g]ofuR6I yj)p1mH(`źu $ԧ~ozW!e "/c*ؠW. .-x6}xoo?}lv޷>sFv^k x|5~ BH r^ð 4T$\T[ZkILD\Tn\|>(CǸ*ߤxMuKYbLE5h2z$^AedtH8ͣOUnHiO@5*W<9Pt3($>i׸~+v:ѨSn-g1=C?΍BI?EQ4 [JHhpu wlpM#h n3@L$70/Ě[cZ9N-=so%ϕAN)O!j8Lѓ@L$b=ʪ$+R MO<@sNAW;L$N`DՉ0$! SwgQYiXwe!|^pP]V69^ _ A@L!C+-c6G42(72våQTQ><-8>uΥhse #קr;=ڱGMW?`nF2VX#ͣ];Nr-Zʸr^ߺu"'O6С 92wٲ6mrXފhт;w?c./fѺ9GBWp/+U*./:pqpja*S8(l:ŸO3.\&НORW˯Y4t\,0 ڸs>#(.k}l%--9;ۣon]ЌMW9z^xB };)O<_źJ"rwC}l+n*y)o]r=fuir-QV'> g7;_1Y08Ppj\aps0c˒\v)"j* V:zGJT1c["թ8xODmH:7h=2 [,*jwR> `)])"3AlSJ$DzWml*|LW3 ֗i=L4Ua jԡ8z~ ZDxo{拄!Ӵm-*zz\C<=|M$'~ȑGÇ^>>Γ`_-ZZpk!&$͙֮OLLSǬiiFd߾z9K\L:v~Q1 ;it~7WήE'Y],Klsq;4V0c/1$A{d\,Riȱx["mר!f^f:'wj⺝`rVB nh>],njR `–K\ruZ(끑,N'>0*6}_⵷k[DIE´']bmj;*7 |?32c1pk\-6{xhjbpMyh n@1y;YI7}y?X ЭbU6A gxE*F qOY|,8JQS*~EG/\\op} |@=t[mpsF=CužJP ޻ GO1&58ו`'ӧ&;T.'rFKDQhגٲU Nb*Z7˥T>xdžq>3?`jr~zb2ۼ[/J3gCϗ Ҭ6 \vW0n۷=uI5Fkfn*ZՈ5H]hL5Q.8zŋ>l-[;(*6kv%1U;";}z_n\f ʆ NJ6๷aBUѳX-8[M/揉 tf gw՗ [.OV@8%sL=ʝ"cO4*fJ53g+gb[o;W)e ':%lt9PqnrrRVw`5?&.*{̮\/XLd]иP'M#;ȍ#q ɫUU$}9Cᦪ=lͦ`*K͟I2W _(wY˧B rW2lHb73SɊr"H]4z;>t26[oL!e5 )FWxf.fQa*boL4 cōg+/M4p`ؠn;o,a*{aEJÊve4.p]8"Zg1q]>rћ8)EG aV.d Z6 n*]8pw_ǙA1'}man |m۫V+g4iӦl`` ͝{{-ΝUJE `_јևь ctѣ`(u}\ǟsiӌD#F8,4mJN72ı*Zkl/bWH$x=oGEsyUK҉[L@]Nh#LFdwSgFe[*I&+cgo}o"W<[ lHeA%QRaG oWgه"nиxZJfn{:ͩwϖ@ 1-HG:>3f=ÚѭD8+/U5=M-'sϛMEEYrHI|Āk U'QC4**L:*A|)O=\O PiudNd%dWzmJfLUaNyQe*,[~޿B"RrÔ=v>rK0xMůNWG;?{@BԎ`4f?)׃V# 鸨t/ Ȃ*p@BA.r{fP~6*+n 4MQtA.~(&?}[Vw0ԥ0y>gbɛk| 'ɫR+ILPVSI< < ;5S䎅׽YLhi&®l*|hBiZ!7Md?h*=ݏ }-GtR.-汯fPSdz21.$l8+~3WFS)kG V"ߧysٲgU;;w,MfLܮc:vzukw>srL 2ѡor-n(XT._F8pS Cr[ԭ[N\ԪUEV- Hhtwīh 0*IUNiŸ)DH$ODu$Q\WrR#uX+KeK3g%h-3kX :'7vfd$ZDEi*]SGIdL\gRx" BD(;o(70[!Qw*\J?O؃q.ɾ(y'J"bdc)snJ:^khS+)R@~v8#SD\D)U_%,#Z7"?Sz.H,r B1Ibnm F"'{vXMe%E$#VDR[to$f$9txHhcLY.؃#ɦW%6JrqE2JQ96SVi*It\Y'E ɶ0x(leW\#ʊɝWmbM,"+EhbxZݵz*`(ӥVBSacH\$c%t͒]Y-eP.'I2%dQ//ezDnM*֟eD}(Ib(%:Bd^9D&ODmIq VfO(E"RɌ"2t2_+=Ĥ0-VuR'Ţ0Rk%[& VT1?%eIQE#Z, !L|p|F1"2p Z/"CfuO>粲 sxăJ矯 \zX))`ׂXPω/W Z68}ǯܺղreO>u/+LZڕ= mcǎu%;~GƜc+]B?f!UR4YS E2>J_S!ESYkɼ6Y h\ mKnF'tWSNGI9Buc Dp:EQÚ9sJxͤsU|Bsئ%-u_I?ūEEU˼I\O&yo7儆W< _΀çëpr3ڰq/x*xXv \4Gp-sȿ jT9lPiN}6mڅ꽩L,1>:\ jT; _ꎹuE&Q5V~D* 6H=Fa[0&P7I4{#q/~r)L7 vm c@CԘJ ~ ,!~ʭr'r DqTJs4$J?z ش(9z %M 9 _CbgH s&+:ȕ^$y(##Qxi8\v,^ G^zʢ)t2ݕBe'ˍ+|ZN%=E/1}^súWyД{mjNڨ2ӬII,ZĨQ]D% )"#FMmْ3hЭP7Z:_eJ R5kʅh>}v;FʐF+rQ_`U의`Wb;paѣ8tuxjlzEݺuW_^O9-s0V93/WGcu5{}igqK(fݓ i,=;3V/d$+2>z:\#œ/YI+0]:Jџ8mx,90Lф1E=F,DV޳7GZNv0cؙ2\Ū\r %C:wwPOOa5UL" q\2o,1DU`SX <`4|L2.xl{hv2J'Fs)q{"&zoRV86;.w$պQ+U:9*$RΡCn8j?e`*T!w'|w%|CښNהy !l%]ЮvZ/:0}wi3YkB'g+S{|!M. kV&X \a<|ҁM{ѓO&p#xn\ce&+P_rM򘒻Aml;Y\ oXs([M5`Ex|CZ\FbU^yY9X=0 J 73,7w¹"Hڼ(Rz^>ǵ|FKK4Lz!-$ R _K<Քc)D3\X?>ɘ|?͡;| ҡ'N8$V.>I^EpP~H@[gZAϘTz8ܹl`<2z\(5pJ!Kq)/ՏuN)Yn+]pL`|巈uŭ;oW*0g n/4PU0E ISͨ,n6b.*كNeiXൄN hm$t<ڶ'h' 9|ЂJeIW))RUKD"%hW"!~cD!\^[ a~vTn)*09wR62iA۪U\]Z%]1%qvfd8/SJG jԨiq \j A'1j:uJDjyD:\`H^jTЮ[DzyQg.BA')vO aE1:<.>wXV"rSn&IYB7KB7ICB >c,"n:^TS[9VjITϪkS$7T %j$O0s rX)|fKId(,6yi2-d-Z>5|U ښoU^ڳݲQm~y LVZݓobRJr JVj2^KQ~[9-Q b:Ɉ+-UEubuRRLW˦lءủd2HQ97S_TɑIU* ^(ɻSL_Gi:O*j>Hq$Mr_FHbL#ZW"%X,"cDD )0 r,UZk%4UZaw`?S.ף%|*1](9dZD&2U*OH/3žgHdY!Qi!RK +0$qa\+ޒ*~Qjɱ"TpR7Mb%$j+ ]Ψ"'QT7Bҫ-V!/Efm¥k!L:.eT& 䠲{*][ YS@wctm|aJXNJ)+KTzUWo(X'O9rd:uCCC{ap#Qbb!C r޽,Av?R~Ȑ3;$}|j411O?nݴ)#Cd$-{ 2qw7H!B|>Re.?t࿰D.Ŭ,6 3C6Nso%+ۙ KvMFR+ޱ3"Of ZizD4yNP6#y%SRՔ!#eD&' q '#$ڣRbbH*S$ni~.ծ\FgJޜ ɀh ?):eI8i+aWupSJuf*-%,ȫ")URj${DVuI(g#jz9[5 {C%v$FIC7))=J-]dS;W*'>];WG2IMI;)$a\#1ЛYY~o(x:6c)J{MyWr*9bpfBdU~`ѺKNX2 |DD"D5C6R*ll;HRVY mIש6DxUVRj*K89x!Z~dBW0YBC!DHO$K §.K{x\.;nc/k q)Rl+oy]TQz y %zuDWJ3BTxNŞ(X۷_pk CVVݻ[n_Aׯ_ӧOoذaaa~ߦ;KDӋk^c4Z_~}ȗϹxkf΋L<{v3հ)6m2.]2Ϛ'e˖1r$իs"U`1t'RO"*-uq- TI0h:^\X@}%Ǿ"I]|zw`Y#F(4l@y()T+3I0ڇ \6;0 Vێ*[TS ?DDn[|ɞ]h'ѷ%dR xփP_8}KKw>~_g > ^lf6 7I`kƇ`Pw/LR63rLB+Uyɗ5j0*x*ܕP0YPaB4ܧNT3U (MʟvgU*>I'6h[TB^xS PFRnY!^y9\Ґ2LJ.)L>D%5Eզ0y)٣؄ғwpG.kЌu7lnR<I[Edj㺙JU_ #w蟍 (cB1QdeImVYFNP,t¹L^^frSß}:daU`ygnчѪa+\͗o3Um@N1aUiH^bZ^z5k(CV24._iԨ,rO?Mn7&0βexaM&kz'%׿W5{2yO`nݺծ];{{͛7/..nժUÇwa̘1CT#FqMD{"DtA:9(8Wu[KҤN٫^-J_Re/Β*y|"'^4(2Hr` Ū-Ӕ!Z*[*~!NbK.=)Q^@UV!Q+:hoZ\zo!9';KҐ-jKdM!-&ɾ!cJ܅eUNIVB.O吔xڦֲ7%{c] ũ%"sR.5bp"k5KNܞ'g`,g˝$XAB'HvIU.Εӟᑲ{l"4_]96W%U5uώ|MN~$羖ȝ͒rLt\{]/FʁFKwk_H1;jIhZ"z)(+p/o ]DLr7[Ft,y˖k]g &1h +gCVDTFGInYdRy$$Ie9>#7GTU= $z xOO˅0 ,2PѶ;v:oJcog!LbGO+PVmkJ 3ZH-""O?ڱcs˟+,%4w-n;o]-lx⿴?`$&&VTIѣo={K糆?P=YjsUz~U޽ʝ1#eʕݶliPZ:ڬO?t*ݺ7[\tOj}ڽJ֟T52)U*үT%G!bg9zwOE PSś*-'r_ ;!Ď\5lm@M嶿I>5\֏ $Ǡ+P*y, A~b^Kz)Uq]e7\>R*I?^xM/nכֲcYk侮.lɩ؃7 =koG{GUmIJhH/H"JS`C(^ 6 ^X E!t -ԄI}G2s s]2 ű@Vgth;uDS܊VCRVɡm[$!(wMS?I|eE_${ܢ~X}'9ȷsk slFuO}J/Sx{4E?=bb2##i/& !9:{beˊfȻxѵgOHݺ_^m[^+W?S̴}A+MH &1`ܸv>ښ+E,͂}I& 8K0,K CBB 0y6mڔT5hСC x:wkEo[WBoTj*Dl??ԭ`HӎDźqx_sg9yߊP)aGg1 Qpj?ED(S)T5Hi4̲&1ˏݥ'E:QK^VKý&KH &g?:X\YCv˳ËWh WDEgg-Ptrzz 3ڮOE"CDAG*b&%ʀ8VE)|H^cUjhOH7mXjUlMuܶ.w|Rxz4͎^ryP ߧRg{%#/ze:3S9q~X$e%:4VZnZ{NS yĥ:5T{}K{p{̖+*ߩUJ:+Ngd>jIHR9@?$:BjPӇuwgVdĒ8B3"1[cIjTM]SKZ%@-:l(w}:*] SL ](+Tk`-)U^2\]%]X%U"F*l{ND)`v:/>G^I{nsTlpe>x+HNJpbcdDOW9հʗO(P>^b\%ul/P'W)ATxIT9lxQQQ_? QE4hðyх.\1cF_RoٌlO V{D֬ufeuu[ jcY0 b48X۲eJE{AZ>3\>{*8yY.3EFņ%ڝͬ _ yT4á"FOy&].j,iHEp;oX0>҅0Ҿ?V5F.ʳ(u}7˴qKH"7O_'cKSJ"4(&;er08KpIj9R1)M%ҔrAd*w.ʊb]mb*bІV=שʊ([QS\G&):_YUM;tov8KnoN߭JX׸J2V:o5t M%>TaSLiZOcf?QӽQ _2tXuQGыX<ư= $w<)ioiVC`GHbFpፘf]dɱR AslaU$3$N=C+Efv=Q5l!2xW [  Ї,v;R!1< Pl 椣KI|2 ݻ{f4dI3(ݍ,*UV>}yuϞ@{iDF曕5k֭ZoK=~ w];3}|V<|ػR^ Wܵu`}u/@h6J-E~2NT[Df|k*+TW?$"TY;򾘪8I3[~Q\"DG+T"F 9.uHVݞn2,d LCeWe9.- SL_?jH-\Qj)OЫ[iWc:9US?ԇɆ-1Z>[c#MfW~]Q ߪq%<;N IDAT]'u{T.Kqhܿ_J(ōŒ7{Htgtօ电\JLJj߃ZؤlEwѦ6[{`H)){ 䬔ψ˩d)m?:b'h}1@;jmC\yN]TߦmJtwVf#[Cl1ʊPbU7YcL+[ wZ>CIYz$4Y 2w ݩ8EF)+cLܹ3b {g.z鷶n*i|QPWּ|SPAſ-fǨ9"B]5Vev-С"RMO(UYDP$aferwb\eNI>KsN)f"V( WHޫIirϬ2e1Ӑ:u/)S7hLWދs'E]ٰT/?PEzuRcV%f'Qe? |Rr&q{:7V'{0c|Ng#XKҐIqԾ6T[-AZcV3:>E"\[‹mPNҷ*iE=;\aZag{*?Tٕ:5==sbNܪ_ UXi=K*ʕ\0-OsҪD]w\*йJآ Q _\/g-xVR*х *zFzHkOlErFxbRlAPYALHFҿb$ ,2 UƬ."JvʈⰈT\&b)꩕|cPdpg#"\C|r21;*_}%PÆ*a+L$ڷOoxB;C{CK^y(DufO_!MlWlc}- VNNN```ee .[&^^J$;ѮfhNcxKGY(c?tMڧ=yڵ#? 0S.q½w×C{sCv߀}] 85l agxViZ>A` s6 ;!.\ M\MwGFQ>DYƘL`LiW-NbP( 9]O6\E P7q3~ =-[ 4li'cKuOl?O0^Bܟz6Xؠ|Ryۊ3Sx 5R5P>;;$(+Uڳzy!H \ĺprdPM4iHy:k$\EAQ5R08-,("ofLC<0d/bQi5 J R!Yn I v%J71ԝ*Ԏ^v0Veob # xA_8a=1w0<#v&Ug&ɍ8QİZ,iQ ܷvۙB(|cbUS_I|ډx^m2_ì'| m[œ-ej<噙iCJ }}QN|3oV *nΜ2a…k }Zڵ>kET~!! rs/oSd.[j ff/lW&`s/.];•: tU;Lv>'1T2VQqS=抩 dT_ ٲDjnsv^MO+ea`-PXc?QB {ekPY3`|%}#Cl?:W-.A1ӐЊxXqYd'<+5,Jz&8]%nzP)CJ$ة=%iTD*ުewSQry#(-@ KQ‹ʉS:]Xu|FhwvvR6^ud?օJZ^Ci9KU Fg#@ŕX$ɩuJdSÔ)We c$TG /خ7)H4sz(lz'jġ⃚Y?ġS]ZZB8R3 J.Yf*є0BDO( Wsښeb!qMf?^&ᒲ0 dO*Y 46c浻4Di6cpL Ljfͤ5^$"5ьa2FLUwuK"BŠ(n6R'PU~ݴlOL.u~ɸqbۏ1mΛ 9p fQիv?̥Y ȷ[wk,Xr/lƍZ}~D?mڴ{K=''ꫯ6mZYh-O Vy)A ~ Fq$b4+V588…bn-{?; 7얥i9yU.eFywPu*M.S'zG iK{ *S XcPG]ңdƫޭJ &1ZGN%u,ˈmԮ\رJ">'ka'wz5R_fqNmQ _+Kd}_}cWj|Ԙlڗ6iY:&=v3!5ޭ@R |?\^٪LCQU*$NWU Rh*cIJ}܏ 9m$9׭jjUhz wpiAR¯vZeZst~G)|`Ϛ9nArXkTM/SQ%<#9C+ oޭz]; j}\tׁml */gttLpTڦnLU2:'bŲDYB+ Lp6nZ."W^. Zd].PW$}"\Jyj9LY*'LjP #__PURi`j„3`@9m,D5l63;+ͺb+ ƍ^n]??#Fٴlذaذa%7=zcP3g :$СCϞ=sU^J]6;g U[Qy#{ ͛ٳ76,.i|mk TΜ1riн"TS9y=vwg(ɰ;]4CD(,Sb KgTM~TuLEumшӦbvif=!IFf]PY?2LYOV| ֡˵ ;l1sn=鷌ة4'B_kǎjlN7Uu2R7ÒcW>Ģ_:L ٕu^*Is@*$u* *L)Rj^JB*ֿ3E*[2Ǵ-;]&HSGSC*#@ԡ$[e^t|7Q=Rb!4гǖsf.Gp+M,QPϸWbEF>zjܬNC=s 6۸֏ui|m&Nx,ݮݷߟ3ou==WT߾ǣ^xQO?sHZLpDڶ%;+<|<t!<`s$} 94<Cl ~9ө9=dl YYsK_K8[Rk jHr)lNUܧ`E,@': fph;s뙛C?A}ZUqa/rև<|5wbv_"`5* 2(kW*DX<A0Ō/R=3TžЋ~z'1R|R}#C]omk][qf4}wfbOĖ.j.T/Sva[mݥ:k@qT}X@,/,p'DI92%kJC \&M2]|jC y8x/D?tƆtY$gN wgXn6x+YiBHF6Z]k9hx{!X%#.R<)nLLZ6u_#uU>r"`.Ԅp77E4eM?SLc9x!,Ml] ɖtzfSݳtzJ97AM'Ϟںgb¦q"73Oc ,6ˆΣ('x^y(G<βU 0LOMX#('#Gf.]Zt+WzY"{ȐSk8!$˞۷u I+СkIOޭb+X.JŒ?| A_rPƗ_;mo/>rD/F/娟%6]V.7ݔ}m3gG|!/@dL,nu?o?7LVmV V}B5C<<8)W//54́uG3 $/k:е+nv>bXLMMQ2'PŇͭ>s-h. tPL{>Qk[1r?]_N^z 2g`ʂ0,Nu; iXVeh+Nhɍ}Ͻ8)#뀦 jɨ1H'+N,ƌTppO0o /RbDV9 e~}'2$rkEM*E3S|{ن#󯜗?Ouu04qeŷ=F2s MJŶl[ǂ;3t%/ؓ̇-a /@QǬ|fb Ue)tV_S;`M`fS,=J;95&Us9m|砸 n&.#Dpw5{8#7s>qMQ dvTkq '=}I2o!B|Rv9Nzp!$ne!fQ)NF1]q&'|8ns(p F]tj® r?R^/ b9o#or֊٦~ n)rxqc ֮\YQzMߖEg'}?`;/N9s_U*6b]XVCp{]߬Y'Gyՙrs筇̚q8֘1*;kkqq4Cu{ 0V9tLʔ)^Y:wxʋmx'xn>d:X>gNq&˟~<̨%n'qC$S^gהz us;q^gw,GOg\2] VA>9),j!8uG0D]ھ9-ITvǓ])tȡp&ϑL ̰XI$;Af1xmNs:բ@cX."SUޚD椲Xn 3/E?}^ǃW0Q4T6);Ķ vlpeyj|B M@/zC%?UXjy[=V(wETLr6|k{x7" jemǾߠTEMX*dÏ ?]1;*>\&a'joLh@l?p]u1SN hɍߠY.aI&fpG0(ɺ$$ڹmKJ~/ǩ85>EU7SYHOُpw6p~Ì|jXX.wfe6ц`;L_k-OY<2GBN1S<Б<ļFkCO~`7eU Vt:'%2̿g7ވڜh4'Gۧ&$8gά9~|U*ȇ&BB6ANЩS~͛{9C9Oqƌ^`W{\NW?Ay1O?Y!*4tmA7B)9^~7/i%zXlqqy,֭XBO>{¸ !Kn*OVC"\l*?:ωd*s,Su .iZ@3 Y#l.?.bjO IDATtp)NNVK1c94ČӞNDZAE}{>aϛ;}Y(?ƙ|msLYқZo*TA\!Q _7Pj,EkTj^IQwH\} -¤H3cEqHeܭnJWtbT ٵu;UX(5*J륜I*Z'wXAb?CIQ".4,ް*4ST>XIg4iZQ1R!SǷŒh=fM_i 3Knצ4B/9@8)Se0LVnCe[iEO95e!x[gϋ=Sߙs^TtoCш ++B)_͠T]Z,Bi݁!!+>G$5w? 8UpQeV鬐q@aD)|:1O#XS3k_E%Z]jR>ҊE AMxJ^]"I)+50K"5gy*_d>j[إDc"t4(6]#M2:IDAOעY*Up5kH{ZJ9568 1wqk{, d7BSOmD+V?+X+}Stx…GnYY2J=^ fSO,9^b֯/4(jU77yiݚt.epQgf/BOeƷ9k!+-_FӲ>{_?G\VOcYtLA>DqIœ<*,E/,܅W뮋RڼyHٓN 5>EukCG~!˓t͐.XΞH \39,ey[M}ktƳ/6 kPfo'0s HB=0ӲYZ]Y*f{X pUFx !$p q[4hl[p^[jx |Bܟ/u ?Bgĕ+WRqyEЇl< c1?b~+`Q1J0p~Uyr?*:ͲS,ua%9CZr$hC)?<Ùe,#*U2]C?N4EjnO9r+xu9Xgh 4~p 8ǑiU% v^pGp5yZ#g~n]uc;sڐa߰Yt\;3{1ƽ.!; Y VѮ){?&p3ӨUC?Kˠ}?RҘo|\$'Ӧ YY,_S.={e\Å_8pm^R@x+S^|_{tN6-NyJW"coR?GܲeͣGC¬YOӦ9b >dziXÛcXn.)/↉ȫ0m΍9#=aOϧw!x _z2s!x<!rb@> (H~mE_t}د\o۫:6 >MN`*Ҳ䴄 9*ILa9Pq0,-.\DG-Ԝ^' I/~Sl 9V;|25b8Idv*? / JN\:X䶪<HJ S{a6,&pP 71Zamq8W6 ŧ6>j]@J>8MT ߵ8 N@ItdJ$vv%`;\`4xY-~tX 䖪<t{$>rí:4VBtK(hslD*g70'0]ʪ.=,(X[?FϽӈ%}{qtktA]J/hvx d$H jukW`4xpˋ> ,F6n%aE2j0n?s*[MIfe6L_e:fu !])/Q);%+7~4EGhՔٳ Ǝnzի{ynu9'֟1{=YݻoV_>a͘1[㏷3K4[oKݾөm<7]g2ʺuܲn݀޷ѷzrڜg'^޷MV7;[+V<\ɮ]L锫p7[vT'ߥV baq>.7O' F^1 e/c ?>JCdͤ]UNjds >I֘W [6gP$ުd syy ?qg7N *,Je6(jDLmAɳ8D7t|;^=I:sXuXKnU] }NX&U\׏v',ӟ2j1EM`F6ہ 5ޙ*}`=|!P^zM:΋8OL`FJÕ+ uI[xM*p2u]X,umPſ-eO8 l"H*dղ x3YH2+U@ T9v+ G36,%kK]8f6h DZ~, 0,ec;H}6\=i<7o' >qMO`ddA vPٶYpݛlܑAZ)WxS.we^8‡ `WoZm].qVl4NĦpWk~ף\g}9yV>B?ʋ{Qo3IkfMU۶qM5ffFuԴ4O?ndEK3GSĉ^wA;ׯO{k\w?8:z-/E] +X9sEDDkW;6vwؼ97[`{)#m;t(cΞ7sZW.Q޽t¾}{1vSUDVncPw4̼noDD1gjA=Ü87~@l1>ԄFWw7k#3q`&p/XUn.{&0ś98&ry5 Jng_14|fgg׬YӅk%WO e@-ycIN>A Љ&Ы=-U?#|0:L: d}8ū$%,pXKxX`̩DB/ƛ?$* UoϹ(ڥ&.Km| /Ͽ!spJoLV@Y"ajC>.>XT/ !݄Y gvS!99]Ǡ 1c_(I ofH]2WυZh kQdl+9a!4e:Yٛ7eEc*B܇9y'Od|=f"I[Xs# 1: jaN⾥xug*^F:2[ۼ:dٳ  \NYͦ:Un_~I>lRގ\&Ah6)tEJ_X~9ImD7+ŀl;πY ~+?CXs9Na77sXkep+l,־HkSuZ랎_Fdȝ^}`T G*[ pɩg*=Jޞ:ӭslʡ0*c $ՈF#Y%kC^Jh 1G* @]:ufwHgEf$@:Bpo\BCGj<ĝ>&0t`X믉p|,(Lvz*K³lgn1KLVʃUn֫–TeU|LZ>Zp<]O@7987+8KhX !w[4??!mxWgҫ^l.v^|ز%ZO|yobbA?;پ}y I9b+Cp֬#  ]vpP*{rs{י6ii]5i?qb#m=@Vƾ lffF<0?n:H$Z`'4Â7iS~^Li8+4ӵ9'u-js}(6yZj)9'qUlEi Si 1>gJ|^!lrE{\ڹScCF{}aujd( 2yȝ O{K|6$Aj$7HVKYOs{_vc!~֣yO ƴg ;"  ң-MNSY6 P-0</L̀B0zĐj) PU2׻m<}XJ>p#v"̷eMVvRY~*Upk /yXT&iLOAAdM сߠ?dB2!ps߰(Àx s$ko1X)>3?'o q>{Euua߿޻]" X{=1DFS,1j1&1EM%Fƞ.ATTT@2c<~uyy s9s){{{3 IԂÔ{*Z^roHxfp$%zz{V%24Zcv>q>3RM=ssO_ןe2[ ɤߗh7B:~(Q*P_Z=Ǝ%;_IgȐlз%f jƌ۸~Wǎݽt͕+]*mҤ w||t_`;%?>>&׶EKK͛=52/iSԩjִy h:Ui3ɦ}5 ''l^fSaAZ7#|+֢ņ㼿g{b~ߣs4oEg0&JMf),H{|˝i!g?ea6r7h_\|ldv5~X+T&@"qdchyB"~gQuƋ|͕dT5G"ꉀp{0`h;vS>bvO#G{QRb}Z3P"sC4M'{)DJ㺳cvL_O{hѐc+zrӞߋ\]zz , 7Llժٳ||,n3ex?=Z­[W9l;hvvW]H%7KUGEettP&]<<(j'mْ+5hg@ϞCC &MrGyXXX.]lofF]|Ӕ,2v,wӥ . ru~ƍsxδvoq!cl.-ee62EB}Ub[RΩt9D4Wk"FдtkLǎ.xTVc'xFy(Nƶ|1[mK+ \l|5k~bnDxe+I1PR+Nx|@&(ɷ-s<"T%mڜ&ĬB'9Ղw1SU2֒X`Joژ<@ݬg4Vj *fڀ+ԂjsD=OM;v!$|+E0B2/"Uxܤܔ}¡CCK=߳ƏHHhm(}tY3fŖir_JJf~c0Z M`?XzVnWZetuӦt'OkݹSXRb iҷm'zx==<$EV.'ccDMa.O3‡ZR,13G(ཇlTd}"i.b3O0[_ )ua<9WѸ ߎk;lt܅$k0ehR1`<:Qc&XI!%q:B8$s/{3ɴj(C[VHCS2{r~'Fנq67K1Qz5\Pr (dNy =eK"(+#ʒVt%me?J D/H IDAT2!ԙb< @~*eG0 ZUT :n!\CAa&vVĭLds@1`#UA LխlJc^3a͑[ JSMPSeo6 ئ2@ ɿs;ЧHA[:&|J[O#jyTqa"9hk脟[^*^YhnRu"m97g[\Fai)B?^dc"5z< Y/0O&ͥ؋Fw,[u°oPXpa)EԌ ǡ9|(-}y'+AMYZHHm[je4g1"ѣmv6(:?~0l/99&Meeii?x҄b2%t[^. ``T ,% =ju˶U_VJY>>V~f@[>gΨL۸4#I ښWRnRo,Il[QM?l5xZ1j]֚)Rff0 cFbs5u86enϓAT̟x(8הʇav5D\$NiSk1X6#Z{Fm\{0DYX-+D2@8OWۏi+" pax"G&>qݲ'&d!m:0A {P1WPۙMRdj!JClib@<[&V\ésj.U8sAi蛢؉[-vAAprC\t~\>mF}X=[(bDž28 ncX9=|ʿKiMtzDqs ZFܟ;Ql[mrXŋiЀ8|ETo_{jРvv[4jdOXp` 6[˖UdݿtiXl/ֿ^~f#,-dh//;wz:;H⊃z!,yǎy*U"&J *( 0{kT&LM<|2^Ѐ/(new(>d Ot@.=yՍAE{*`* y\Ur v_O^y,$Sѐ/C=zצmi8{R PT,,gqM@h@ |I] \Чj|twd@hZcC.)/E ;Hh'-qs=fgȃwW9[wZWqTEmKBP+>ht%¨r7jzmC!L rhJw`ے7w +.+W< #?2d%k;j @t4;s*(Ϝvma&װ~~ ))UΚUio'2OY֌­M~}B`{T+U8b{aզf/j`'>Oݻ_ F_)p޼e˞je{ 4!0P[q䑰0wG.'2=IdbIpBtX<џQ[i~>v7s$cEI?BΉ"rAϚ ..200?1=d /є.^Z"006K=![) ~6wc)pb%\X+ L&S]K40\YQ$C֊Vg_!;ٝE*P㎩R݇qV3ؤNi{\Lz`MAOTHԤ2\ ҉xH8cΦ3ӿ6=-65EN5m\QV*WqNZ5{Ny-AQ:d]EO@\}ĽgREO{%[0")Q%&lEgf.sҳ <oF =ŠHJ | S࿸[ۏ |> rI Cqri"ﱫ  9I4Mx͔D Ѧ o'|=&vCLƕ+fӦ=Z>}{˗UF 9z4cȐ(WW;wzzxT!{rz׮Ս છ"_("~H__3*VbvMծ]B!q{&g)Z Luk} =lldFgbjZ :T IOΖkh*<;hXk;qWkǼ.Z Z:4Epfe8sNb TZEg~fMEU?2WPf:8 oӚfiLwE3) 0vKOP%I4h>' 9VȾAo)QFz,%Plcr,QSW$:g_RzVXucWZH);B+&_1x0T&sX4Z›A47NeȝJ/G:Zro-M<"o9r+iW VeTPPHד.+@ PJ В]@t3Hw+**!+s-A (Ew:UH4/GތAtut;'8CА`|r3ȳr]H&.6shRI[毭ZvS1*nZ DjbSN2θβ٬ق3Mi+ ]ɥw:N,mXG\}L ,qg"}JZ2哘ھ9;֗[a!Y0s&kךKu:11yL\/"s[rʕ恁yt:!00Ufͪb TT ܟ&^Xr;z ~ΤIq[>Op!g;'Nݶ_?SYڵM35 }/ro,DsVGw^*٥22VV!AKHV~wKrj>WOq\!ZiEzc?/>ɟ VpMKι*|`dB0ABlF3 "VJj,^o-&y+ :f|LoGa'#+(Ydnw Z 5 E:+Ooy6ECBn:P.}߲&3Z1+KxX@ A51< .i0PȾ76r(&S[? d64U@~5NfCotK%kW-iOL)hP.1fs2{)wbTn'< !!<τW`C_)0xdGib yE~SC*%t@_" )w椲2;9'Ut12jި@{Bڠ 0n)x8^ >NO%0G e—ͤO4Oi ޳g 3`?Ϋ_MO{{ӗHڴIHH(_mzlYn6nlf*Sg_*ʕ+Kot_Ҵl75p͚N3fTGd7nTkgѢ{9+뛙iعMXoyJէUyQK0dڼA~۾b`ɦX)tb-3YDk賝Їt  t>lӤB`B6kssl=^`̅`ܣ'a{tt;0A 8!U ob'n5E<=|h"|\ˉɢtHÉ1}AOנI}DЁ&oR4 s<7h>Fh@<(sb)~h٠a(`L|`%oWSdjL/.yTojH̏|J8Z~1v:KQbeo}j=e b珿If666 I3DDdtrP&o׮jŊs^.X 8rС'ׯ֨QD,gUH6T6mݵSy3oԖ-E'剉1aCpτw _0oef2ߊ%s )>1>m#ʿX@_3%%7IX O 9P)賧$~C]Qlz[ag z!j $8%8rb'n2q[ȲѺa5><4?wtcm|-ESr7VE)1 )4ס# PNqDIdW`&-b!{ s$؁{ZVPa(6-uPeP}.ʫaPGM2Y߸(D\Jr8x=iq pS>$ծ25ṱ:r"T@o`G/^E;k{eGU&x) OğҲ`ǣr9E 6xFaԝ_TLܹς,V&Nd6ڶ%<4#><Сcm '֭ iagޒѣse j?ɼS=ұLڵnZU!0~6orT5k/ֿ^}ooFF&O6_׹y@bW1V2;3Fe1R)"cf؞Nx <BͦXg~sx˟Rc,<QXt:cYȗvhz\F&:JɜHJ%Z)k0c&'h߰wP9򞫫ŝ;-=<3G89mϺuUPJ]S C;w6T^{VLL͛wܩRW p]W2ë,*GhQ؉F̧y[LZ.B*9 ɚ˓%tc1@[N3He-"^w3->NAh)렇`#XYߒ&!əh]P,§ Q'/ѹr)*MCT}/ʞ*pVE7K\2\Zruբ,~q:r˚Y@[GZ;Et9M"2g.BrL\3] ҵ6/ne]7L{ IDAT‰S5 gIx 8ΣM} ϸB d䒃? 6GCA3C<A~W^N`yNS/0:OmCX'|DOGF1]qGEZHGFkv.~T XHI!, od!=lƒ͊dg;>\Yhy&2 +E^`ʦFKXk ]/̵y\VwT'^kh,*[:/*~.~vf4l+M*|mOxK' /Ua`$1|1sN4NcD?utoC!$Dd '5ї֕teq3垀t̑nt?idBiP?yt~ J1XYdxXČ!Q%9$fs31*OS}wm+52ZE3ܜ%CF N Ԥ3Œ$i?yːx$Nқ(VbkǴ!mLɧܿK~] j/B3 E hab.Cc=,9ꆗhBޡ4OI_JΡ Pׁa];F򺔒6~L/>Efs odl.7~OL%MaQt.S~/{xxO T2#G6#|ud^Inժe&zh44C^gTA*,5lgFFӃ{OW5f/|G^} >|ܹAAAJr߾}K.  `E.[7lXX|}?x`^!>>UV@BBI``+[6شhTUDO%~ZZc]VI~2=Yuفguz, :rn Vl-!3F-b)xק奦27dV BO@E;60I:1m(b =|hJ' !(54zߚ08x T &~GR/ sx U_K*O$ e4[JPuԡ Y0hgm@Ll"c'yGφQTg@KR67MM67|OgkjrrZ7yTFؒaBc7ZҍfUץ&?X>4nkA|13}M"sPe$rq_g} :߈LBh7a/{l}:'*,JCEh2- Ch%Zn??]zfDWe(zp~Q`!].;BK%`W].ބ8=@tzB g^1N~Nlo:Jg}l/}QFn82M/)Fcy!2<^Glz&C69J*Pu _^Jсf`u$DC}c@MeĥjL be%JvǓ_Ė/y[Y*Qq7y{ [*8O>vm_ǭ5%E52nĒ֭4!4y6<|5o\i h˖͛ٱ5?KֿXO>mܸeU {ﰨ3" (`AT{DM&&F145bX(vEEH S(r&⚙}>sf{u{բs<(8%iw߻p`bc,X0*6֧\9I./ZHMe\L1א΅8?쥜[C0Q 83z ,EIʕkfutH[9Y'y2 juȾN"-ݙ{L$:њF=@+0ܛeDTZ䒪 = *u@  eH8e6.Hj]wv=tH{*1+Z9{V>r/8L.ׄn~XյcM}42*װ ߀A .ܿTT+?r6}o־}#G=w%KMi\\kԙ}ؑץہM[.]r,GЩR).PIAn'2zK8;rW6*1޽\8RHR/C %aM@SF_<D'hL%=^ !!`5πdtgShyk19ARG-|+"B1!ۥ!)>'J$c 2RA蝱@n[Lq>@^hZłMnFM6`uaidB*bw8CjBHR@U¼ z)S125 9)(PMTIV@shߘ\envTddt H 5h /9ܸ%i hP.yp)N=i`ne @^l"qteqf&-~557V`?77=OD"ʃ g =,^-bC/DQHO(kHTk)-1*l{ CvGOq]̍ӉiT+wS7iRa' ɺ?ZDTQ`^Nʹ}j6$&qXS׫%?(֭a Х˅ll1@Qbf]9Jf~gϾ܍_^`{'zحo|>(?l׮رc7o啚yGEEիyy'nPƂ@ǎGf~ >4cT۲%_?3*-M_}3>qWWe4 $*P[#ޚKO]K p9 @b}m 'fߕJ[Ev|2ZI$;5Y/ͥ>r ºQ!X^─hʅ?*Vjvg2CSRVW03A3h[/qLa![%_Q$&|%.<͉V̪E43-edp%xǿ>kQч" 3Ib&I٥߶mϖ%Q\*z-&&?H -RL\xۼ Ҟ*C>l%ժq &z;(ˑ: IDAT^g>/j*Td2ҳ1;O3h2"~w㷀vYgݟ9~1ӳ]Ȣ~dh[̧qXKP!(.<,*X H]+0D2]29SA!Z_R\us!rFQ7rIF];˘I W.qIǾ6TMe:} 9)% E$HPBW\Gh{<jt*vXR*f‚ 4RjN(*cF@S)CT)5hƤ*5''%)iyt|Hn}E燆LnO|ْŢ %nj-Kg?)~xP@)8;0yqfoq5=ضr4m`e_ѰqVK.hw\<wm>3j<ٶ~߾ TCc(?7?sֿ``ڡ_7[{zY jm߮j\zꔗiWi#GhָuȧNj\؏ŵ>ƚcѢ)!Ɠɓ3?¤Qqt[L5b-5G^ (zu y@_t:B˧5YT4.3`+ag$=īt [DCU+5!]X19@"T-`i!Tfi_|ߔJE8Q hC H*5Д0SaR@$!ԧ~8eC?[^ 2X9׸v+*T3ε݀JL2y ~4 1簼ȣee@3Q\KȾ$96i*ri s`+ʼn5t%KoFJT{(Ɋt8UEs$+iؗ&# 3SmHyn^/n}̙!C׮(ܕ];^>\}{3N33N`\̘aBIîJxir\@y P2nLPEp;GB}4Z6=.gE2C|Ԋ=t_F%ӆ}h*v̑ :h: l a"[rњ LZ>ps\ԛCTD|Dvhɳ6-F2A7R A/O`7#", $a7!ULOyő Tm5cCڥ MC\!Scь!?3qmϢa7X[G@{;vyRBsHOLy4H#J*cQt7y`@M69e*%6N5?N6x/F.|-^tϡs4rh+ؼ&M8sƸ!pqlGڴ1 tիǥk.0zEURFŵ*W9A`Ҥyb^D=oK,+uop_R(*m~?;wVĶu.*hb(7_~^ݍ̌QQ.]rRɥKn:φ ݡaWE]ww,N.N<&sgv Ul=Vx:Uw9?Z¶W+ 7igbV[|Gk6xRy pb[(]uEGCXQJGٳ7f`U!|J qrd' !})XN\<@eFQ3\\&)%EkъFT5t(A7k;~E:f''J^hxkkX`BESBRIj*%Te  !6iT77)x3ws_Ul,FBj2"qiP),Ff)asaL 4-&ۿA>*b:ʌ6kvDy2ҚyϞÇi6o׿Tʕi^]߬XUX `ϟ;qz/_"o?4eJ|@͛<< ZAׯ+?R5` eݺ^RݣNd26o} N\<@uTn!IN7_bbVDɥx- UENZ=鑗4֕}/l84wzA`IsƔ" 0Rir MaE66VL5 tcxa`=t4LA! Q_ 7G;"c5Sd}@uosq|H8ɭ\-ֵ؂p,IĥD)R) T%|,cjJӹL<~.Viexm#θQВk5JyŨ{@< x)bSIM!!(3|i@6[r`)T@f/# AO_L,D81_>+s"tPʋP37exI9لҹ1i89i;D4*Izg`izNڊJViڃk7y-.5iiԪEn.+V0bq+0~|/(m\vp0 :%k&A*\V=Hͪ K'T}oGNY@F_ʥO>k޴ CL~|A@OM:jt;IIb1z{߱twH?Nl,)% \>+\%7q@ß~/ѡU#W4))Po uEP{:klK0UfUJPu{d Os:Ѐen~k$[ޜ0KuW (jrW؏' 䥠sE2LփQ\W&c%y]#*td%}YUR"VU մ[t"|95 1 Y{a밵xZWq%/~x4HH` ̟oc J\vUVr8wλA3ߦZ-ԩsmӧ[$[:tuwwۛ7[/o؃򰰭Z>&OP{k7{kX`,`ɒ[}tF >VVϟ Ꝏp-ZhO.ZՠafkE;WܲeD™3ލ2z}hߞÇ hҝГMKwg`/J"řم4HNjƴ)_dj:T˂-˧!W=+,BBB^\Es/Hvg{qqے6Ky ) 2J>ª T~I?b:ܺ#.;|W)rZ%EN@Łutđ{TpDGe@F5~!jm LCg^SlL3k?~@7{5٧MK3'3"pӘ ~DҥP>8zA_[-{i55\ò7`i4ɲ͛o?ߛcp69?%8j i.F^P8LzXt?}ksip,^)ޛ]i Z%YF3?TI'o;; ppBÝLz-V:S:2mj K?b̘ vj\\o)ZBZ:уn!nIQ{ңq+0lXArVΜ5cb"#u:̙M-V3&vٲ=zx6N, &B\\߰03Ť_X `\y{Uݺ9`X_E5Ǎ ]&::ZV 53m4n}㏝.4CܻΎK0Ym{boG~j=U-mp:YVU};i>|ೕٻ VmoĬvN8B N K?]h%vlHcu4YY[T8!g:ں0@c p2Jux;246H܃2KHS-5e< $/ @T|`+666if;RQ>4`. q6P IG* "^HjS=@s/ǑV pog P6C#$&;kbZɴ4~`p٘ưhgu걊V{ϧ/GRZT`>V_ݞC-vGTza{"Vz. '=Xhq=-ő S-ʦ^i44mˌ2M,`;9:J]Z̳ ݾrE9~E]+hକ;w|v`7&YmK1XKWߖPn]>̞=/{x&$ȷ֭y;r$+WR.HMDVoj("^eP}2|}j {Æ Nw_Y"b*^>kagc5e'?Q4{ Դ^L`cϰ,W)G@>MȴtaW}Q9[Diȁ*j-Sm-27ϠV0/#C33ǣB=dQ4Lf _ƫgc9~AÃcL"I%Q/\FE\>AOs’@Xb>C|4w5hQ5Mk3Ȏz@``1xġ@5'T\P-@HŽ4X@oXLC-+(-<!=Z Ƙd>,LfS"$_L?M-ONSq HV?q+ơSi5KwiY#'.#tzv̡zX< 69s u\LZ5k>~HhqfDm~z4eJj ҸVΝ>;yr Mi˫Uk~!!^`D3^5`u,`!CNܹO*}k׋fS,.qڍC{;` ..uӹh(R*H\aB)+2I'K# F@ bThO~O5@X-sG4ۑ6pWtIh<#J߃X$0MB@o{VQw̶<$B_14`V|&^('_⫓H;Ne*"sr Ol>MH9.[K>"rY|9M+ꕽQq_Ѫ OԿ}ءjOYGD{+a1iS_KHh09sgq5-j"m{ z鄈˗9ww4…f#Wgoo[jmjslСk֘9h p8Z\F2)'Fdy8;6䭋 Tt䉷ֵ :=W*B*%b5rzVcǻfc=|8Ճj$)Mpg5x=hl9PzbrUC|HX@E! 0Rː|K'sLtԔ!R=C~Y$/RRMi3 ; UKQ|ßmv)1OK&AcɟNFoH IBBҀ( o(Oխ>Qe*;Peo4hJ .J)d85Zsy+m%.+9 t#شN3Pwc?GsD_Sx5q876XPB8lӵWy {>CWG qʴϴcbYe.vAizTr[A]XK܇bFAr|831Pqq܏'qj_7hߐCEJd:Cn)u=-M_}`ߵks esV __~/w]J":ݻڿ?eZ?Btb/ ƿkX`X@ݺ;oYGx]d2mX؉ ƍu{bݻڵoҡy E|RcSҬ/2lW}O̚GH.S<]۲褱@c-]dg˸,ְ|#<&!Siϛ];QRKͤ{E~iB޾\m#baٔTº`Ua 0Sdh,a:l4˟fb3\~=uh%G ;ThH$#<֖2U%Èe}S*qP>, /{)JQ"ɼO/Ⲋ"E.+]B6 5pD`-sV[QAiW"dpe`"L|9 {j:%QM%;PI3"φ4 Z><{r-]PG}:v`NN ́#zH*39&Aa'ڳy1=سwёW 3ntɍR=3Bի=~]>x {5jT5kK.]zܨn''ۤeq^42Q~0 ݻu11 M!k<>Fovv?d~yZpNNf)oS>J%۶ѷq=t-8Y9HD8g5STn͵[̦-OěRjwA1YyrL}1KW罫-uyK IYRq& [ZqS_\e2*SX @_X"!_BHNvPiP&԰Ls(#¾:U&gAD2H*W# rxEIKFFB*[*US5sdIrӃTdz3`V`Q# @vP[z L - pd906Aq*f@>uxXҍ^&NJ屖FNYoI+|;rBjD(fҾ<!^J2Z>8=$GFI$e0 O4ޱDx eܺh5Lى?a +_[ ~jqilmѪe0f;ۼuѴ͞:KVttʕ+;]zc L0ȑ#@,X/={ ͚am-i* Mekkժ7X$oi4BÆ6tgOCJ.22;ibm%>]hʹ3Bpǐ莫=?NN`M֥`ƘtT8QXP LPA3)>Vӄ F@%Ȇ `dP5AT\ZAJ)+bt2AŖ3dZ!GV4܋#=B&IdƓ@A4d\2~ ؒQ@!BvH]pW2P&%Ē".+@~=[ȲJng%Ia;hBKs_w 5G!!EcL=mAIh!P#B97e5H~ͥCJdqfUf='[H&,̸;.3i&Y6wM^O^́Ɨܺ9]n={ڕ`K[Dd͙z:{$ϝ&~ `5lpȐ!۷ /_:u[o5k,@.שSgذa~!dɒu]~;`;z5AVVgjȼ@(b ŠD¥K-Ա8Z!*bp˖%WxWj<u+Mr©hڿNΕ4ҫ p)ն%[֭~NOVǻs}!xXKxD,W]H)l5Jwx_r_bbeKL0c-2Ӥu{'a&0q%RN~OCG%JM^\Fڄw: :D& >pbE6WzyB(5*JAKcrA]Gt+ȯ^`}a+X)))ڶm;mڴ;>|xΜ9ǎ{ja11}TcAQ*u5kJNVΛW}„PKmpww2_G.˾{W;yӏ?}/^E 4vgO3G96go'Of9,m9[{2<[aOl٬DZ߰;x2Vta@ާ|d*5e`cW'VGw_8>=^`\ ~ij=U:zcK=œAl 7kVT4d̖v)m Ba0D`XMyNf#hǏ(G_|I!\ǐmx:| 2 x۬Ru̚-n8;׮4h+Q,@B:yu++EF@lR!P:ܫ<>I=S*'ȹLUU9mQ2*@%nhўxM5_b:+@g越~)N5q>!% q)v0 2\Cr>B=ŭ.0d ,χϻ'oq%- YqqDT6n1UCxdfR.̚Ōƭnrml8sƻQ#7¬O?}mSpr~I$\м^Z-YsgSnnҘ>*߳7nL:}gʕ+ST]̺ufddֿmoֿ]jn.]]/::Zƶ NNVש_X[.x`/.i5jٷϳ[73H`<&MÃ+W뿨ekxS HV m\LtgL#Ɉ$f`>7ҟK/(|Җ_L N;ʜpa 6n}N0Mt*Cf-Pct [ry[LV@@k6„?<f<<>@ =mOa!&d;(.:`ZB塎9[5LwKss(l x(-%:\|FAgxZ+ilrd:}C/tV/#qc; + {~{ V)Ҷ-gж-?)Gk?~HO&Wկ_T߶-JٹF^Zgy!TEZ;Կf@U7^W,Iuv6*c3|~+>]ku㆏1zfn4g%tJp[+ZM>[PkBh10eD{tz~'&Wc1j-33K*;ȒK8rh -*{2w_Lvw]$%/#Qd]zJ-I0UǀmGa<晓|ST3(|7Yf<@<.DxaB{Ӥ$'Unij&^xU\m|JkEU)T[sG7M_{eX.dǒ{T%cgS]P~1i7u9`»-YQ|hN`r ~58d^D2RaIvMiHX]M_\gEuD*_Eu\ˤv9N C|%?ޯ3sVW0+K^H*Lƭ]m4Z6F?b;OKq~~ƭz=:=AO+sNFhΥK>^$)͙4mZ|p͛;.oĉ=w_,2Wml<f>'3lVVֱc&OMcX$yƌ$//E@W?3–,(Q6 sD 4T]oJرmoO|.(?`| oZaߠ:s̐!C={`ƿ5Ǐ7#?oOcQQ, 4 GX,;Uak+@-tt'tItp&C?,;72~ ©x ;M7q]B9Z0R|{""I-/r KUv ֈE`LIz[82WgCksJ+ D…W B1^k!]BX"a+( Bm02wEBZ_ܨ)׻_sۖ'Sw-.CDId1BcqsGfK["J/9YQ+"axT[@qwJBEDDx[u//N QU@B\0, E …u(&!V;"H-Q[?.3/MыN>5a~*q^4U0_Z)3/X8~&Ɂ"Z.$ZdQ{hJjDua3>{&<=%Kd !_שT/L!_RP\M4ƌ֭/7wÚ={#/Eo&&&ښ7oرc;vEzֿ3kGssS*R${n}ԩË_݉mۆX[[]Pvmylm._&,U077~h΃\^Jfe^_~o䓈Rn`>l9*f^E[(Dқ)VT[#r-314aZ~r{x#Tl+A/ibp<ǴX8G+gpr : nC?z>/qEMn^T(Z>eLuIVK\Qw{l.[U*^%_.r67K0"f;~f{ZgKLIچP|sd̆`>J D1%ݨ/I w ^մBH %8*"c4|ͱ7bo_;%1I4-ɯ2[L,ĕ2ObNᚏ]Y3.^cGe\RRD&Nt\\ !XPܹ,*3iӋ!Cnyxyye6L v-jĈIuD;6}[n}ݍ72)Ԯ]{„ t{Ms磇=kݺcrRR9xxV,ڴ=?y2X1ՁmmW=fL?˔qI{ \>FUhpm+IeЬMm#[2kKuz| Tϙ YWG~M5Iqg---B҉Ukdv?VɖzsfV .Cu{3_SC]vSBb!0k9H::`;$`#8.ke$n'|ZH۷$5!uE<憭 *WT.\uΎ`LD6]X4IClƌ62(Jj1Eg7<]3 DU`,) ,Mr+2X/v{9~ dm1>Sf_5"vPm M)O ԁtʭZ}r&$&HjYfT Et(=K~݅˿RV\qrA*˩'Mb MXf IDAT|hL~~ll,011 FE6o>pe1o/Qs@@OMPVxk%Wa[mێ;~Ǐ3gκuڷo$%%UZuĈcƌ~駍78::ӥ~'XַS1c^Grpa˔q hbooQ.VԹwNi,?#;fL-;NMm6ZzsS v6ʭC|)]P:-Dߥ@<_J|?aFɞљ uFg{*%gl~⇆V>a]L^;[THNW/%&h0s:fCnt O0f%b#h`} f'ZzN3=.-b%zA8eᄍ;vNؘئ̃]l]=uǢEC<MJ>fcrMFtmDGMf$`E0?88,`a {ΊLd :(A coyJIZ{&oŠX"JyiJxG-<;GRҳX,i +i6 z]?E< E$73d6DPpf˼TgI-l ⣨90v\FN"V .모a yUlN~KԉDJO^k6$ebH<>Z`3e" f 'FI݈:=qhu(3R1%vQP(P 8U)kRKADL4a$3?I,"^*Tغa!}ڄkh?sM (NpʄG-n ]0j ]y&i!@^qCQ <&- ;Z2%)D(oN7Hh+=C92E;f/9˰" qt4/Ⱦ6Jf|=ۈLvAsXk{Nܔ)U^G 3'X :eKHd՞W4m-(Y6 RƍKtsSܺY+D]}SS/uVK5tyMN\򦒄\DL_a9)s!w lߝAxHLdV^aQLoV2`bhY5ɜ8èCZ$"*e(*m5R gRZ)s)M:"w˴ 'lQIc`8Ih-w_R'&,e&e7.|h8u,tzNиiTxPAA ̯H 4tIףݞ=}{lÆNΕn0C6Vz S8g„ W X߿txOr}/"7]*=KڳfUGƍ :u.^l'D]RTw;p@Ӹ{wvIxJp}{OGxj6_wRW}pĴU⻎ڒl]t"Mfz8o`VbǩԒk70 zCsf x?):cGK29SkpsX,(0 |Wu. 201SZr,ueJp&]Z $9@"h6r/-ew2$"&wQs+(}M\'ws+YAeR>c,U^ II Hep/ypaj) Ň8 ġeQnSa:LN5߹^reYtfs dOF3&Z[v ALI0g[o3:#+6o8jZ.3dH6ث8&aù9kLΝ+ի 5+믓 Vx#h8߭#GGŭ[KKdeԩ˖=RYqtxVJťK]kՒsxk;؆q x`Nn}XT\صlYUڒ |yUƍ+[u3ĩSe5M6Un 񃣷uk VVcW/Ԡm$2w)˿RPryM68f]| `sU/X kĘ"S0B䈤M(Ou{%UX_`dsu4ol{w0&,o~hi ()1n JODe0e>$7"!gV3K|lτ3WPAN~E!8yңys8:PWW=:+Xĕ+j}k4de}P/]9!+xh)I)8#SsH8*MY3Hϟ$3S(/)&FmDiZpl`p<4 ntXZ.ە+W0&a\YWr hB90ғUEeRؠfN&0%.2f#fì@J(F@ rJdMuT r\ ߋXAӹ:< QD\Pt#e+0.PV@'Xf^ Wxtߐ*OSwKqX[1 sˠzcoL>{X+IRBXVL4JMagP4~S)*QLn9ÐX?a|\H#:JKβxf0ص=eřU~8wӂ7@ޏwkĉY(֍FQyɓK~$..]y{GլyR7w9܀0.*˖Hٻ/;t{Dhk)#GzYc&b䗚- 4pҔ):wkfK'qI4Ν'4Ʊpdl&)~:VDwMD/u7v[x^Ha {b(T!ZǰT5i @'0ęXŠ+92 9+ &adSnA}9Rm2n&D([\%џ8 Q~9S >d3M:?Ī,upSuzYq~nQ8.?aEa ,01FVp911=UX_wyɈ@g[uJO'y5Z#j01ob`M'K/:Ws$BnM$}_c0GLrۊ=gPKBWV;c;Sd>A|石p{5u؜?ic!Ƹm[O\\oW,Z4(>2nѢw4urʞ8ڭ[+xOrr W{pZTTɳzu:u*l1#"B[ٸ8]5{T Q#X5>\}{?Aϰ+}/^m#}&. 3ͥ{C9}bv~ sFeoi/jhԕiیÛez=-Zp<-[r`jر VnyJR &WҒOS+UMN6pFXc>8|0Sv~|yb;Wݼg%2Z9GCRx =YNHrҭi輍 cϡԗP(!gߚW0?~7Iɚ*1H Șgl[7LN ߹V/iƤNFA gnF}9W 8ö؟- C{$"em (`p:nظa k50aO!)o8;SuS. I4PC'd3gD |# e/E <qSG)}DNN L8Oh{Jp=e$VtEq;|g&SE2v(Mg+ ?%(l[(SG,DzeKr刼}XVhQ*޽k];Z۶gQ/ѣǣ};vt=tH"Dzտ[s$4Ҋ;w.v@ۜXF3xklð?W_0!i."(9 [7)VBQ%23ʬa/ b&Ζ+rg<$=!N*&$xPX1!ߣȐDo= `pa~l`}4㟣6QΎũiSD\(fꪃ}:DS>^dݨ7~ eƂ(jMMlgCz $bFQO2G"s*lznf 9*3sA33&LRA)1kߧ07׺fg4!$-F M&Yz:ahnTsΫ26AQ:c[,1Д!}T v{::]nE4K订6z.}UT]Ve;a>+VUrNG'[VR660+vKK='T.10+( 11Ttgok'HzBlH! E{@Q4#&QnBR4QC'pS2_ŒH۔¬% ݰ`a,t"{ ЅbOjXA/ m!hnC,K.A3V+M]TU'fAb !kmM=VU|L#L|] GO)ɵxk~F7I9-g[ZLˊ V=*+.AUl/cZ(8J0}}aE;[Q=ţD\T܈~r =*nr1Z>cW@Y;+LG?\Զa VϰR(X˙))^aY/$[P5ƶ6lr3R7НC6}Z`SU=TY;C`-@-`$tJ#Ă4wlVL;lزZ򋚮Ai|8N֬HJ= ܋@ l!Ӏj(~ *%8)~t"?')UKpk o|!?HL[8vQ(;g9A*MrMr8*ǃڵŚ5#GZ̟#K]ɲeN R6/]B/No招#Dl̈M ϺAHXP AK ixũ;[QYN c`-@/)y$b_WI|̒4G+82)G aKZW0X} ^Dw ]l(cUUl 2#-Nzx9>Ml͟ȴWkSZ&gn[1tX@"ޕx T5TE֏%QH?vyiog۔d֓WڀudOJ\h2Wtoe#n+qՇBrYΙ3Ypv%{wwh`7r06}~U&)Vzo1&zx޽ٹS&Lîm3mZbC`"z̼hRv_ +)/gp2?Sv~V^$R)/>dlHq9EP,,ӬĴtals2#/1 2²CTӞY{%BxKxZ?tid41b冕+|(pEUsWPƂ "0%`J + 0+slkMcl*[,J\GаY P֚ݭj&x1S'׃Kg-5*pg+:_n̙ _- :)'y5{n&X,yÆÆU0K}X³ۺI0Xp'-v\}>&Z4bhnG"1ozE+Bn_OaOP:@TusS$UQOh{s@xJK\.#@A}~7Ԍ΅dZ,"ČSZ>KAg+3ځ9ŜI-d-a$t$`/6^  /(@ "SXL1b0Ead~GXv^(/?l4QZ5@ykze|g~8Dc6,* cMFeՆ\ ]Fg';ZQZ!YG]}]i'a`B0uߞ@i*_s]L9$ ,&8U9rvTGNe(Bw=] x-jYrw @߽{S8 lj˖*RDufTsGt~VqJܻ_nIܼٳl; ־w s3l 4L|ɉepvR:~Z@{G!\VٖX^f{om͙3 oñctȶm+35ZʊĢ݌)+v v*P|Q)(wN{EU<&PJYv?ݎhd|rd=e]J47_gZ)Wʷ =)baQ F 4 d "S<"l)cb$ 6bE^coz[yy' &@n9ՠ%r`#n~#sxn8FTV⫂X p&7xKoh/G5 ;ˡgXJ|cj$"۸NO IQg`Fv^֚MPkhb2vETDt$wSNY6d6,ICC[H&MdZ<1~?X$C>> ;>T*Ξ-۰{QfD>>>ǎ㏹˚!#܀\05r!:|FBи "fϮrg>9hyy(KJٻê q'xBA狳9dO)+= ,,_s,uZ#n 䛹 E݋#V4,KTj6B,kD:s ʛh *҃팸OS܊Vɒ$ß X]y,G&LlREM Պ>w(Ɉx!#4&ee )(L1ihLiѩ(LQq^n( X^vY&NE3.S]9ed%sZpe&eGKJX8+\ V.xIJލ#S7l8%u%RvI"B~poXN N&ݺM \%I $ɣphmڄ>ԾH~1_| lvr5CF5:`!~~`M߾'sԲeπ LÁ}S%{.!q^1tǠZ4LVa,TO`iN'Z j))c~)( J ,D/:Oy[{2^ƊeQvx!^]')lNJh|QjxTh $> ֈ[cBo+NFY\E;fN/p?BLO7[WBb5PAZBLoAB- ! a(@cV1w;a=U`AL!TXJֻIÕׇP7F~XdhwDFX/ M7 拎[E>g F S _֊_ :VmZh7NPS ɯ$:VTl*( uN & "$⌎( Eѣ5+ *b޽${# !ȬGfʕaMR5x |"p)r x"\s4j$W,sG-7Wޏ[ZͶ5[~N^VV;~i|YߴiN'vtCysX#$=ٵKP>xsn3:=]?E:KU<s92_޻AXYMO>s Cl)@1Y2Nq fUgn  X ʓw3#/JᵕRT?p9NQIWҢ;WCjiVep-Ңt 6âiilh#E*Ek-1L}Ak+{U!,*V҇,΄5dFijgpj9-qI20nbnS>o,㶐mEB/񻃻@ 6w&O7QJԩT^BS72|866?NfzXVtt믝gδ:s&u!ĉe[*o2M/?;|xf12#ҭl۹܄s:p~~~7gϾkjc4[qˀ&FG\Gj/&) -V%Cˠ wM7O~ z'Ǥ#5En"\. *tN7xI%)&=ҫbKbuX+X#Z/-܈kbc#6N!D^&XJX!s@>-UX$"-3@BLB>J!j 1YBM' qBbmpz3RUJaB*ē?fSEa%֤Ll~_fԙĚ[(A7EЌ$]ʵ5p !EyήcN#EDe6^I, 0EY­)=B RE`sB ֮8TS͚Q޹s،W / 8( ˖=Of]5-Zx. ouu} ? Wo|@9%|WdFK81dԚOSuXܼY@ _ٲWzZ>~1ٲr5:=qsZTgTΞYWg`rvֆMЂte>ڄz2XƆ4QClT՝p0a <ͫTٳ9mtf@/B)݆饙X[Jj&גudHazau3w4*qrZc[k`2Ѷmɓ͛;8a *6ySߵݾ}4V1avv=K]ՉI U+rv/nrWlk`F݇RA~cmH[W`hқ{==ыj^2 '^bjUֶ(i̔(Ґ;Q` NkYfxyk3Pg&[治4/l^ ҞxA^p-D+h(L{M=+(2WH9X{;';?TH_>g$ PΉ/eu`d{WU!D%Fw][BU;0V]]u-Եu  TT1HE"TT@#Ν;՟>cg=s}=8}&\Spj _!ovBJnx~ˑYpu 1]cQh{l?PT%~q,iKv]q8%dv2ѥ5|wW/\ u΄'d}\e:ƈsxuUc<^@BXՑlMp;̘ ec<.;}ln Z%Rl\ė -D `)ҥE5txALc) HU[ [c/^B H !q0DhJ9/\s/ `1&”yqb3| A&Px*RB31C98Wb<!`6DoEВw-ߋ{su"W uDpڴA` fhQ.9eetٮݻ?%כɢeˋ9sbLLԞ?/$"X !bdUabL0Tc{&.CDX 0F]J;KQ( u yۂ|!NA*׶Pq* j82tIZ{PR?YQ p]7xQq Ð S^ig^5m0br/K BWDR+8 og rv$Ӈ}#]]hƦB#I ay4f #WGdT]o|0~ݫ|rTWҲیKDJHuqRkȼVY1 f7=JI#ue gQIurS%QF3 2UxJ*$|(JB " [1 %wIUtr&@x 9"H>)Qa~hUnyX喒h-2>FpA>ˬt#7Ff֎zG|z@_,x=E IDATY?RiO-'m|I.6a%UUpqF"ZHORquM=lILL|9[p|Y.Wkw}?~(޹OiNvUUt!_,007ndȮ&"IÆ@ԩ$*RoZ} mhsմ&X+}]^8Rʐa!%"g9a9>F̹4OGIEMmdn@b_H5d˼^4DeJ[XF CVTjIәRJ5An?dMi&4>S6[?~+EΒhd$q^dKXt;yѶGB ]Q:ÍŦQ| ̖o# #7OKr=hs7j4&ҍ]bp@"Mb>? t)OQsDDE7v.fP$5! cXQX(47hРS?eH 0Ҭ؉<`7i* m[K}W {Ѯڵf lmsڷ99iL څy`i WWt"% ]aoc|4UK~Tj.,Ca qr.ZK"Ol] tmPa{'On[7b h1Gp. sc\j&BC{Z\sR30HGV"E! "D#tÊj,a'(%$DB!MY#ث+yT)dD.#&<hD{;^X #˼1=ςC=lF IuBSKmf8#w::Y - 7u53Uʷ~).x`|,Xtӧyʼn'N,ϛWcƙ';[<|ѣ6l`Ȯ| /A6޽9s>y8fj`}`}{ 3+$XT v-o A?' = VƤ (ii[m4sXjκ]xl ʕ˖"#kf$ eÇx~]{w%hbܽHܹ_ørqd os;S][^qpPܜ"ߊ+aЯ B~SBܳ,PöNLpQjcp9Xde1<u#7V$IU"D,G*󛠆r ypD1 `l^E'PPoaŇ`ȅ\9\h*픯+Ȗ"S )Ȓ"S7O$*S ?`͇ JIag&`ZpU%N)prpY0!DdcF0B2X]k{a%䕣! @'RQ., ,2*r0`BbQ[#C0qڵDX2IͣX ANMUR#38z Ò-);!A2y{-&&og}Ժ|1T6o^M ͚ivQ'h«WEW_Ȃ/``},%1yrqM bGl;4akX*;;SХv5ڶmW5ްB,=ݹSԫWͫW2/2..7qCB7.`;SSAMìePQ>@0 R W B8m`p|0?HɇG !"l:4` Œ`F$a~N3un1uZIp*fQP5gH H81O)ԧR@].LU`….*ϹyRJ'EiRJGUK)eU|l=O**,Bj`.fVV @p\b*wce$v>`喘Ԃ%vqh J|FCt2T3w%f2Ľ>[xwK&am#207SPF c={ܾ-lۖ_%n]?FF43c!L׮e:8WQܹӹ_] |… 3i|A| %XN.>x^ҕMXzV ?T&Kܿom"I==U32D ee~R wbyF*2 WI6X<ǯ 172sѾ%ny)ڃ=P?G_Mec!\{ q0 :})E0ġp`@cbc'VǬ碫J06`TEؕKTCH;@IH Ҥbv)+=DȖ}!\~f}h|؄[,\+RS 1Rʭ).g`o"⋑&>N")v`Y8 qgKjm8{bUwta\;zNXfqz2,>NDx{9| Ԏ=p6\'M%7$5ʗJ1r$<<`d@4caܸcLMUBCatz{ uk+L{PTpe;ϘÏܰ!˷|A| %X>-eڍwt6yѧTVU2K*r8; x+qcK./*ʦ~}5޽[x<< XlmsD7/EECDZ?t@ _yt}ۼHA< q}1puc/ND~ . ]}. `zGl >^5 jb/XjM旸<3P&B:`54yR$]S%($tW-s`ʅ ߫JW+1A TbPGh 8gسT'P2rêp2c K!xf-Ծ_pz` .`-w!~[ص?%ON,58x|^JIox.{5qLlmmܹ }ի,)iJJZZfg׭3[P,&;AA]ҁ~s;uXV&>yȑM=+C փ/Ї_w]J}UswmQT&w^}jڠiR) xu(K!mݚ׬(i-%E\N:~,jт֍ʘۛ`BȟY,'-ڌ$XIoz$8$|7h)˺ҞA3&=",v{9[|zNp#Ş)xWdMosQ:\(ӹ4;"ފ;DPL)$X(%DZS7ZJ)֤QϧT#pi rM#o@"Y44T:HlC4eAt%žLD3 1SbRgRFn~op&9Lr\Ke ťw:;K3܆`BS!sE3ٳe\n*zLҮ] HA..1W:7x"agiӂ?`~W]8ЃpsWO,5(haS1{NK4d`9De 4Y! Ǝ}uXO?iܻעF 퓨(uNI ) ++$%a?/_S\k 3aDBW>Fl@,pn!jq۽7څp>3 {FCa&<#!!jpwy֪f ǹ`o.hu ]#@PQP+BP1qy)uJHW#5DW-t:JkIīRPb@m8ׇ-(aC#Sm05c `Y<`=yB0ƙh]ho!%['ˏ-į#!k:1$D=Fks>=?]6 **#)DDllrJKiYN''ߟݠ?"\tprqvg+j^99>~?녆Ґ[ӑ߼{`);/%ɽ5쭿+ҬO:om,ŋ `N^K;v)9RɆ ,/\(:41 ?ybX>,N"8 mb( @ Ę%8wj|\ ?JdC3\Y C晰rji3F^8Zc4ۊ8Ea.߬h^Jm/q5We-83hVgk#[_TU {qlКzXWQ T⹄" \F7ap]Cqf(crL9Sa G@8,%_ODCS\*~8¢Ѽ1/6fɓpr3lJcǜĉ+b'Ǐ:9TW7oۖEѤ2jzsj^7yr/,-3Y X_I-aJބX,?-LVo1[j/Q滺>_0NOeêiyq;M0ʚ-^HCs~=zÕA;G"ȩ8C}9 )T& o>< Mp}0ֳƓT ߇'m8-wa/DXüߔѲa%j(&Jp 0f6D#%Գ'H"1Nb+<(.\J^%n I<<_D#N?<5ձ{F3bLpIUqooי1CWKw4I{”ظs2r>}}|a}sR &Lgl Sws5r=)9̝86J5C;>`)P+JK=5gakpζ0$pek,'O}Ui՝"َ:O喋u&J,,ɚ5Xf%e֭ˏ07d^*%m,,x$mN ¾}8QMY93C'36MJ1cΖyX\-u,ɜOGaIм6NOFEE$š(,Rp936" ^EPۻB|})(:0!̔nL-s ĖA ]`ƒ*tUS>Lx纪0UIcBI'Ai"d$H!EA ~B).e`o"nfݍ#͔UJ;KP$*f"j^9e| g#@>_^?F2uéPg@pj3f(ܱD_{~&3 .^oF3$~ƭ[={ruu5B&N?x0eKݰ45?B?W0K| e9<Z\ ׮["?>ҲFz(r``nwR\֡woE{ߟw^׷ fInSgĎg:ؽSBEg`0{I)F`(6(QP.8LԻP[q*zX<cl @\:FÃP7dڼr=$.X`usuE5QX@31Eb`m8GP.ŽXRB_0R*UaPUhLl)z<[L;| EZ0}8_u9THSLkJ6+e:d@ܛ1 @+؇V^' og( +А^b ŎyoHH$= g.@wΣUsf$T`ɓ |^nHiK驆hؐ6mk׶X g$qS]]޽A²0/o`q@Umk!_ړ5w݌ɬT}X&,9PvE QQ6fl>tQ۶iiŋMVbNj;w˓.XnfrXuu\[0BA9 v8Aa zt&ԔDEq>7:"3.s,1PGké[yp ř`k>u19{4t%l~2>~3Fm%('dH!_!CjW%,ߢ}$SgJq#{1 ZJ6^K{ ml1Y>VwЖUoEG=vLMR0\36(bL?ZڸͲam8too3">>\G89)o*]Ҥo_=z y3{w7:*zyB}6&{T`%Uu % =ǏxufK&~~x޶Ndb~刎u: 4R)w'F֭ Rsgg ]x E6ž=sBrw({,A[oe Ex!ص̷7ELځb3y誰zЅ(L:RéI09KEt:7>ʰXt̹RA;S8ñR!1#KF7@W=+B)("GL1D#G"Te-Fc5ĕ@U0Tj<~%D 8~YCkmj.Tų8dC Z^EX4:)Uwõpp8 &*b>.v.f Vaaitdc*) 6VܥKN~t+MPBKج,K(.^fͳڵբm$;_6љ3JM+ ϟ7kOR镩{yV,PhA3Z5sVS::zzn ,E@JJ%MWd,HU 7oHtv`ĉ<||0a!ќ i{)_Cz91R_4TըM  ґ%$`~}U.RERbp!-'~{'co,$A,ژJq!;mƚևД%#DP.rY5!`)~uaO +ŝTY[j({>P,; &?ŨHeY[0ơ#$=̪\%&<(DP.s-ˉ@m5ׁ `&~H (WvQxS*4ׂ. aϮeU.CȬ~Ul{3p..7*ako(B!_,d4`Vs``\\.6 )0Э+Ѕ!K"ȑ8{ BC2378Xة-} $NMڽ;^=~D䜑!HK^|Ѣj+w򐐁mV{cŊY[,Hr׮Σ*7u}]4p~{ik/݌ӃsvdߩU-]odemjUT$!..|c|Ipt+(HMLXi)zFPZB@ ;Ъы!l @q)F(tjX3WCB_ x=Ą)A]Yu!A&{R­TWU\jcR LhjIqCP. GZ褃z҃ԕuz~uxQ*cTAy hm-X颫tAR\z"sYئl=%^)탐d4ްe@f7F-ix{IYPbp,_Ƶh\<=}G# LkḬuN)Soj;h,-!`X ??ڵ]dNR]ؼ];7z˶ӿqyyVΖ׭ 5DFfwtQ$|vJnd+p(c`}p W#"+_juĢ-[|{ ﻺFh5X]]ek&lQYNqOvv~_cŃ~~bV?.>B]Pj fzY[) a$ è|.Ò [%R1AIzrNi8B\?Ɨf ?c\VH*[2VmVKm1-;1^8: "ksal"}Yse"zW0o S˼@/\WWhhbD8СR}}nP~޽L+K'4tP" szG;ɾgҞ=Y#"ݞ~-IL88yz)PIH1r$gT/Y",\s;VӰ`<UPBP!b\zz<} 0R!|*`_'iE,!Bd #BYBeLTNĈ xu>6OTyBnwsQT>]pn=j0sq@8NDQ1ٽdpy?hƌkגZ=w'Wm+E'NXԩò dc_^.mHFK<{&iTIՃk)`N07ŤbF7vnM6Go+(BWs42ƞid^>ӄPiݰײK*;˰CU_ҡ b), Q$l-n)@LE"G(]+{^Cj͗Q1#>jAWRd %DYBd )x}orRGZW]ׄBH^O j*pfzCOЩF'% j؛c08z g:f85m)2>wS gݭXb1(]5k0{6Ç, 83nuT?ǏX4thijg%jP*Sh Uo_=ȑ7CC[,[fYmGϿts{4ku=R-"y2Ԡޥo 9[wtonP:g{[Xԡgll~u7 %1"ܹuIJK$){ SP@sg-)$={s`&Emq"JJg^W-@Cz* p&@6p$dav&F222V lc'#l DrXЪf i}dq)U2޼sBd ޑDG]ʻKV|`fÀ'ۋ4>|eT ( U TeU,DS3߲%8(HPF-}}IMZQd3,EkG$ɔld5u&8:vŘnQg3BR!xa9u9@m=JX &P7/;49})_P>E"z^B!t9$g4 ~J=%O)o" ӚHyڞ WSWDAMgXCnSqT 8,r#P:~X$Y mOn'YJ䲊`BSZ@Q9ҥ2/H]ŴԱm[1:xWsDA^ڵJiKTkq@eذa;v 8Lbbc͚5k֬蘔>8 X2&ڇJ֡* ڰ y=$X_xZ_=.nn~T tu؄8ԥvl._jSZ2{z*nK i 5DO_(|@SuK4z@N^$!2Mp&?hi/e9Ŵ.IXNXN4:ų8 $ou;쥖@ [}j³ AW5Hi/'{_ُ_E+)@%9ke3:r4 j*=Nd1NJ'IԠ_n7:R L_N]di6$IpӀEGKAI^Q\\QVw6sKebۀ{Nbq5o%?hۀ| ]PPPII}U5nxչWnڴiIIɧAޢ_?o9?ĀUٕ;FW%&rqnܻ۱cɀƵhWSVJ55#/f5pLU5HݰYRQ!6mbi3-"/Pez6N&XJ{Z݅p&BpS(Z!{@N18M*I_9/ Vn, 8*D "(B![iF0y$P=/QTT!U*:OɢޤVl7(Y?ݎ쾅f?KK[2l~Ȳz Pͦs٨(%ƍ#K1$D ޻So^&+˯wMqqóܽ_xT`?#ܹsU7n~We˖ѣGW}g۶mO??[<{VVݴOD$<7fpUv9aT,Vp:J}?""x}\;wRɓ^MW6vK Ar2~H)rpq8ᐻ;KEgM=J{%Nd djqbRlMXEO:>m!" L-5o#~ 8ch =>rE1C|"M%ˠ|:ܝNSj<@?qfl$N;% MSө=LPc< }}h)@qyyRg@>>ݻwO??;MbgTzmƔ̐r-1akK%j0aÓՋ)+XZ^WfXB]<޶mLq1%@*zFB'@H>g1F}ӍYNo x $(Y]M/ Tk8 b1.,ыUf;ڞޤѐ`B&P);~]>r$*t.''6Rw.+c'\?d#l&lۙ %DO0~OF.υ BΝ/~虫.TWxl}j666ndnڵwϿBCӗJCψ+-Y\nء |Ud%ZuY*pAn!{2[JkF-ZffVѣ!ԣtqݸ1X-2R_={> iz?wn%oo=E6b1MB\P.c? uÈ, jXfTd,v\Fbp+W)f]u\T~1%.B@@PUlUs l1@A@EDR1@ i!aq@w]>79;7}Af86%c,]˥<"V"AD^H)& IB]VVz ,FEYP^|冫5f2SC% mCÈ\8\)c^/,moPV8 .쌥T`/-.ۗ&&r ~TSIDZd:cG͛H: x¬edĻŝG2xpXHOexc^M\,&hu#_|qvv>tА!CD,,,ԩSuu5]]> 3??{_ӏ,8𡜜TR$}& Ag֧TVr7Pۼ+s=q+8Ol%<"O -B*A$I **wлJ"l.{58O\I& eė'52bSBkҩ%<4+N$n :! -aT61`5K_և8@046!Ձ8w0Gl*߷pu5Ʀ35-*( q @M?- =+ ;;=RY"yP+2 x*+_k]UM8MH9b< H 3< O_0+\pĄ i@lǎEE|m<oO&/xO7$&8.o"Yl6ҠF~CD7CxСf?\OXzDZcgN̦f j5`5:V^.І}رc555ڵk7cƌoR222\]]n\]]333[ko/;7t:3=K][VvvKgՅcs[`YZv0" kmm!3{;7U 0n\PPOIIag,#C|`#FLL^u2 :@/ u,L_0x[PP  \ن$h`s`H!0h GL`ˀo}(D^"sl$CxKI.;F&})JtfQKYæl1M:52 8py`1j|Xd@Z sk:|r 1mBRaX|>ԺP9W_B,,,&N8qĮ]p3ʧLVQ!oJqNş[{nKbL= ،FΝKrwSSؾ=>}K8A=?-6=voGRy:2皚>)550AAPR;h\,ZsѾ- u-,-x4MƁ5L}wdAAFaDPsMǕh@i aJ_,C~, :O@8I`[}8vxr4pxx_( >(O[ilMH#uUj μ@f)HaLwĐHBp쁣aA}sup}(D6i99@Pڋ KOf((?ְ%sz{MA8{`v Tagm1gZZW!p>4X@0b}h6N”?.2ط S E~))l\-+IĮbbₒ hj~}վ}G4 "gW..uuľ}֮d#߾OMe߾-0>C<{S HҞޛ=@nw2w=[./  [ۡCD`钗mh2!.~,s^jxșAA$ܺ.v;RYUMG<~VJ瓄"fZo ~=u%%wwD"U#fzkf27رiqPUȟl]iVwPY??uYY̱cXR@TXY84Ł-sj,؃O`Hy=C$Dc2L+̷x?Ɵ_ @i`{m$.u9Ur<*CO ڊ;堼LW! Ljy-WZ36$%iTd6`#h'8Zdoej=z%P̀i;><¼ըA{8k1?&OѣyYeK4pq!w qtL[f^Bs漿|9T**'Bq_rVb ל{Ch3d!C K/)+25X&''OVS#!?yZSӛÇS #d󧅫:]M \۴ 8sZ7>/wVL"I}}n"LJM LiMuyz̙  !8?sJ xrRd/^8}"M/\.<`@ox!ASX}L,:柰D^@- GcmTBZ Ke Ŵ$\8^ Z@vDG aYF QG<Myh)@S:R,l0PZjPʨ_Pk`#Q@o֛ʧl8.D d0bx3.?k( 3c #č 傿B1Q M Gs?.< 8upDG$]S2$&$ۧqfԼ|ِ;w.dLk8sgq3pH_r 8y. ޚ/uP&ۥ˭̪g'mE hAk ۶m)*J]͛ijLㅫ7W{4dW*+~"ρ~i~tz}ܔwכ>4w-45s|]oϞⶠ([AKi0m8w֭r&&RkhhHdfVϜY5xqGd*('FςNGDDHJb D>@[]fj'Y,7`i/p!,`$o5X؈{#|nMĺynjnpCE%PVRD/`>83V>Ʈ0DbTÃ4eXڰ选!o=Wa N (Y="N9c="-IYPo06dp]N9LtwnAq%7QR UpiiRj!$ge\݁.,Ra= Qkdqt|@U.xÅ `3gJq;w8sFɉEzuehѣ.\0(QQN((H9ӍϮ5s %N#dW;%|o\n3&#y Zީzz &&rs}¶m~5շ\ۇpkGڒ;|~ɺE6S?V50lXܩnxXW^#p?:j/~..bǪh۷{KU3ϑݿɉܿkcYe%j*BX[?D#[Z;ӱO%spp IB &z?yfck`Ս<wq9جXE~--%fE0f2iuR|U  0 *۴Х-ɢ(.jp-'C%t\,6Y]5ݍm*\Idkp i$  ZÙ}h0ݽ ̚E~7kMrqܹQYY,;lƥK|1"Y7AaB[WQ:~z29ǚu‚=>]xkm9r\.01Ȩ{wر"%7,Y>D/#K޿CU[qR i-[bw8[K~xpT*SjwyiM NEo}˳9QΫ-Q?|a+eehW)MTOݰ!I^^2$dT[eyy 'BBX˖ыyÇ^&"-prBVN&^&Ա`agh5aX%lY ]ʡ~1˥/N,#l܌_2裏1 1ϓ2S@,^bV Y>'@Kmxa0P6wxL,Y,\w` E2SW3qdeIvݝ q#L/l{䴴:kkǏM(2udrrÇ}UUl+?kxΰfRߩLNkL[KZeD5)i9s_㯿2,1/%X€߂gΐL3 oxHOҡC;sYuU)9k6}PIiōr>𡀿|gq[2C6-;H뱚b-?s&Mٗ/m)e%,]}TD`K<$5fLYu5,{떺&?#G;#$v@\<&/@j&pz/#RSW2,(c 13G- bm0`X49u EUxIEJ;3?JKT$AL6¸nVdA9?A;Hq`.:P#0,?<pÐs)c2qz/'R^1cuuܿ; Q1۷WoVE?׭#09ɟ>1W|DYe 'gJvUQUw#ƌyݭFTOtSG-x苯sevvQ1*9ԔR F [`D q_'Xl""ʊ16-ƍ?gOXoNtfUUW%Ɯiӏ%lIˎ’MAk3Gv[>T<5FQ[˱-:}`w` gWO+GFZQ,:wDEE28ؤo_7›7#ˊxI?zE2Px )UX7-Rs$|Dc"xD@3,IT !ߡd+Kú0 * )x)(^`!?"p/,h4L"'JV|$f`a<f8(/_,ZF-Mq˓5/NNm" ݻrli$NV?֯]>$TC!̙ʕܶm^A(Ѝ_VCCի |4u3}S$S|BHH(tn4Rk'J`X$BYRt%F}HOFGv@Rtllq߾44dsr)(|)Hv(jpќ8n%='=+Swvx]6(V098]$WTT/nJmd||ed(p̙7nI>{fګ ==;|xYj*K }}ba,@F/ })u6-OXRӝ ypt ,(+*PUX>B1NDpfד-[c8v@?sFDz "R.߮;8vM'X[U 82@1 .}mUbY.*2K'SRƪy3&>Q"«#ssٍb3fTܺŔ]6~<%33/LuuHwHٺ5EAA24Ԫo_m͘0ᩤ#YW|pYr̓bJ!r|Ze-ΛvBҊGkO8vmbj_ jh4x<`s&P0u8=;K~ξ =-ށ^4ld"g/Of ȂY,ŋsef2 ,,7空|s[oTh9kTm[@nH^ eHڵ:,D2 IDAT ! rػQl< HKaXUr ul<mRW}8ZAe6'd˺l:v&du!$U?!~;TO~H\|j&QǬ!X>sbiCJs`bhQ =͕RhRXYϏ\J?ɓ:55$72<'aaƲ/^mK]ݺ7eJF{1bgS}AM 1k*`}HIbѮEvr&xԚ9RNx5VEE*1ѡm[ӦtI7$飰X+6noXSB؞σwOVEuTIq/[kDmt2).]J;}TM w߾.kRu&bq=JxajfFα**xcƔ%mlȿǎa*x#$R|2~7_ .8\g MUlGV!ěT}k1KўWe"Sla+eaN*D<$PZCG`k έ@8xg 1 nvƽhp`s>Bl-x(DgD"2 q0AJr"rh =U+B]eme+}CeZ6kOG נu |Ƀ렰Sx|{tmČe0ňZ} e;Iˆ*,YڔMmyxΈeyyܾ}=&ع\bԌ[Ę磬meR3rÇ}ōmۛߴmm)Ğlf i}$CMrRjVdy3mʔg Ejk/GXXa~_Kp{nܘdbo/++R\׿b>LJ9!f5m~o>YoވؿQZ]}oѮot:]C~%ȃQQ@"S6 QTT;f̓bQT+Ē% NejiDGS5 }fMM^0mӆWǾ}WhزEi6rIxLMLTQ'L7fL#PT[>u (X7 T+|P=DwrBUE)GIz7&Te5T2Y|s8Rn~f5[z'DE mp[$R;ii~~,X=waAc+WR~tGQۼ딻2JD%dHBhu߸hPҎe=m)Ǭy{X7I 6&/u6wqska.J6T`QݺɇjjRz3CuϔP@^|z*l.8!䈜4V zPW5\mkļaX f%"@.8;)(-*Fr>Ξ`at}>ͭ$N|\ tUTU%M;fzwjE*{KN]sBb6wqi"[ŷ@\\IwdrsJM|b}7$.#t\^e_釅98DI~hod$mN*-S?.INzsS+뵵Zm4WoXyaG{ƞxy?.콰ߔb$#GWVSod$v֪*QWk>yBU t {TxT]ҥw9ujIL.OE/FM Y/@J cJJBÊxql Q!R0t0  ŋ [?q­}@kDkұ AO 1UYlhQN3p (ОS˖y<,[x(* (m)۷(+KY!6|,탇:ĉ bJt$xߏ 6VBU}&yYKؚæ TFk?.ޤ"2a -śTVܡX0FgS z@c"B#⋒2ÍS@M)&nnȀ*<=1y2ZN!mAb .\ȹt)lY_}I͛q/ f` QNX5,,BR(*50f>"zX)䠥UY~V8|\MM:0ʤ?YBȮȪ/`ټwή9եFZ 7pC][ /:)~]n]L3Zח?'3׭K^];M ek\]Skk)xɄhH RZ\d-11+0v,JKTYۉ0z,X35 tFmxL Wyg8`kSPR)0SE&M .`k[s8XB_/#F-*kGVcxc6|HqxUB̜'O@a2<*uu̙ qpչ4oo0FG;:d0[n֜{:+W;eeu'N,]*C3 m@vMq5k6*хMG<~@ (4t`+>;acn]\ VHz aK/ "X?>GXYEzU?ݹY􉞕j`6U4FT@M;u4x΍1C FK*C^* ƶKm/6T:UZxbϔ}JAU׷#iR#> x#G}ӓ z#;Ӧ!"ش 7\r6ε1AH(`gU7ŤP;7`s! W->t1G?kTWO|VS/)vcw8X6u].AQ8{"_N:'=w) 3PP\"P]MWiÇ궶TmǏ-_#)IzMb-UQ NnN:/6ggˢnߦ2}xbpur>yU}=C> ]h\{H^ѿW.\;g#lmWx`#?V㧿(0pu]G#'sE+*XzȨyQ[ӧŘkxfϕ\#G:P JnP7$:>yyŋ5j?y<\PX  \ Ŝ.fw Z},Ry|̣E|Bj~v)5lj :Zɞ |F'Dd"ʪwi*-`kޝij'X`sb(a`A+!%Ss-t(,!:RRظ[4 w,1sW͞A8uJB1SYF%'W_`S=:HJJ",lSX鞦5E}i`VZYލi0+Nkх䲳7y=`==AE E9L" q']fzIx7'إg=T30aU`nox'D˝潿x1GKK&<ܺsg1"k-b9:xy%HbR3 II9:oURTY طЕUs΃Yy^uK(>7Oٻ*PU4',KjQXW)LDG,`; 1Z*ڪn5hQ(8\T䕢U(DI%* %`q +: R=;;R|5Y-b]8}|`*+adoo v>N,ȶS=ZuJ1B*+9EQ RVnήNYYߓΙ'fN&D{.cU֬]ps{㓶aCݻ6UչshI ׷ 0%XĐtW$iVDd]I~[iLΚ?3nK@κ2ԚU-piw;4IIݡѩe t]8z4~Ӧ׽{k:eka]6pu}Saa@TDDKԭ[UTq22#ǏcZCI ׮D-h,?d \uQP LLn= )',wk>hT[J*QXb:+QRrte'~[t\JW _)_pn}lolmQQ ii,CULinDwtRVURGM oG芊7ovtv#߿PGG64ԪKf&!_8OZZrQQcLLZI |F53Lu3}܎~S6,oW7d~0}&/Ϙ2wleϞ׮NF`$w CHKKw۰ᛗ( NEo23u]U2eJ*>>ҲI+ais IDAT.ek.jopSkic09bĈ~~åJsccffJVmڈJK9FFGhjJ[YQ;ѬѣKJx]r۶o/= @.yMVXT35 L˔MocZ _ 5?`ssp ,+ ! XZ]Ep fLIvM^BGxxP}48FEEUkhHu!qԩoo֖y¢9J.vۺ5V^^3g+* [HL{ 7p,Rh3 VEm՛g ۻei雛[sʕMSXXױcHm-{{KƯpjj]׮zGGW@駧h fvig ]%wݻ33WjһLz5@CCC,Z+J%Qm{W?քW_U֊iUhj:,\LnUU'O쩚\=|xLi)H=}j:rji)gД:yLLB^%!>s&^F׮HLD8vzUPTՈ6!5k2e>~$VF[cƮҿ5 fBU^泫LLZIHHMǏ0׮A^]egs *SVW~]:dY['GEUDEˮf|wVtPPf+omb%$hׯuRO]M.RxbK ٕhB o sskllڈv?t(຺i]X<@]dQ?]ǤI sn< W_Q;O&#GO*yX?~.{`d?BQQ…={6c:J ) EA) * TرPWſ.VĆӔ&( M){IHB~"z~|HέLyyTU%>40PLI{UUG{Wwru25eJ[<6VMZTVrpܴ >..hh;Q+k罫91Y; VF8Cy$ƬIăϋ2\?{2t d磫\`&L~ L__Gy:hPyT 4g!P T##٨IX2%%g,MMED.Y ?t4"rÞQ"t&JKo/Ὢ؟Ibb>_"};yymP ? ;w=QUEn~ w]H$4}z}ǏѼTBkp5QnTTPOҁPښC *$+%ǘj??AԩOY,…QNN5CI &6#~g,fg<Hؾ]ۛM͛t\>}8X)>R0{Q[)I\]PZjmB_Md5#m ri siDNjHDD bTWInɖ`υ `z3i%%X7o,ϯr*ز!2)SdΜQVSM˩ex.W?INNc#JӫVW7mg s'sFZu_7JߢeP_ǩS#/Fܵ+{D5 ,Cw?Ҏf&_Aw)|_z{J_&Eؽão_-Rv ۷O&//>}ɣZ]~k' pI(/=zg'N_2RRRc{[[}B1"GU'O,G}fvf@O2uܹU99LEER`|,O331{6 ؈ɓg]X-t Ca?Kf %xNFb8u9 Yb ^5ąyAnA]?mbCC`=v0]NA .>g0;as(:8wAFܹ|작3:9QZ{|t4Oͪ T֌/P6mzo_ÇF/C;:YHH,~{yQ3ޓ&=y0OLh#ɣZ]5ʊ;ݾp"##D}II15QoHAt:1p໌ =7mݍ9E d^Yf1LU/+ #¶oQo% ĺF!6lOURld$*6?aؼ'#-R2. `k-ĺJĥ!:!%[փ:DU !qz|n MʴȞgSPY 11 97M߹-[NN.?2AA WאD~*4Pag |UG` ?RRboO z]]޾DJ(l=k59;*/UTRScGW֘1Ϟq7 h~#F(L2/ž1c22tezjl$(7n͘V/N2޽C~M4%Aw8GL]aMzZ1;,1kV͛wd>| [XH;V#"Nͩa(޹W/llۆ{wxzbrA $p"pYE. e厲*Jm"[I` /)㾰א- /;a)z(I؊Oq"BH1\` Ϫq#""_? G~, []L"?m·u̝;%%I7o;8ΑUсR->6xGU)[kX˫8fm-=8v85 -/x1{NX,ZvE:VϘsVܹ._^%0թ*%%h{~˸q_&-]=`mws&1*Iv>Xw}]@kPL[11%/^8(((?Yoc[\L2f< =tCCǏM`̞]׻9<7") ͱ?FQT8TVEZ ljؠAy5^&6(|%[2RsG7MhB]E(!d (,\LBdʪv 34H3unG3WP^ J3c@ cΜ 55lڄ!ƵMK]\)%E:wNg쉴#XÈitnj'cÆFG[qiJJZZE~"XM3]_?Lf%FcP<,En췘mǎzgafewO@q,uFVTЧOr[Sw6е'}[}.O[`ao`&|&A<>XɋAk\,+buĥ!$˖~/O"#U%*:ԛ>*_Ν1itTԠUEQ9 [~.:zRoY A)7.&, LƑ#E}=r%v_͓3$$gY9O*(]>MnNy3!-cкL&ų<T<&hUu(*GaU(IbӾ{dU%hCUJ1iv~nb,,.Pl܈d ,4T]T;wNeDSn.mܸh{K?}ڷO-K!QUݝqC[זHMl'ZTEN2{8u$2,+{,A9,&Nϧɬp=_g/?{V;n\xFa׮\BٲС11}ͱiӫ}RSIJ.++2!KɇCڬ7lcyM{&8q˖}bΛWCmS?1#9f͛^'ܺU<{vAG[$.8WfrI^f(o.J 1"H߾`mlڙ9nO%ڱc[%X ~*e_Xz#Grv̴U )?Fƍnr=-BD:iC&y1XE_“w)+KEEM0@&O~M֯} Y[W8;b0ŋNfGXKT?|g"Gw08{(-3w/w4CN_¹"  HQQ\ q⯦:E"//@BKbNh )p&ٹճK*oZ.'OʦN}M(%'W ٳ'yG Nm{`5ٵ3' oΒ{zZꚶ)#Z3Q:06~Iݷƍ-'X+x;VN ~,]S4`lR~ZNhUUcd0kIΝ۷]>%e([VS'd*V"Cn;Kkpx//=ooAkɥPXpleh(q nzۇݻABNa6( X+荸'/""y(VamS wqIGT<HL>:pYų!WHlǏ`g (ʨhJh6MiNN (]3AU fÆ $JhldMٳ/}(P+ "t6 ow )̔SuD1͛M_%1&׏&rm ` F#SkrYu5=jWdIgGGV'Sz*qV˵ag0&L="Bpq,7n͝`~~[G4Cy9R>|39s?|`ʒSM|;.^AkWxya2k",nj<(,Atf\6nDt4`> CcΜT Od+':cj#ϟM򦡁_=K#ΟА*X%1ᯣl+vk*җ''=,%畉Ԝ3,ZO .|N&BCFn>#+`u+5al,W:Ss33 ti *+utBփYmbrqƘ3 N=Ozh|ο}bx%64CYu;RRvQc~-MZZl.pO􉮯/q_mmFm-jUMG*+* rƆ 8L&R3xDơY9YX`%FjK`2/b(iTSX[CLԲjlT[7bBk;FٸJ% %U {%@ ~vJZk,An.vrJ26V20P Ť9m{UPH^=O޼E:4ijH]A]ZEa. ZKlcUgs۽[ietU]@@oƍq6ǩ^59pFN 1RB;?5c~LLCׯC!K5M=:&تsX޼);QUm˖A~~V@xxY1c4n4ST{}_]twK%oe226=~L!ۧr>>v;8NNnU~x|.čMysd1DiT IDATa,M )Rq(E,*kTYYM¡C}PTĒ%X]ϗEXť&')<} Z'< 04{ m$jksl7k@XLu3 4Q//f;ߢȋ:4}5y0j>E&&֜:e|9R[۬;zzr);ujݻT+_._# U__ "D2]ҥrgpIm?˕Wk=eYvXޒ%=ΞI"It"3GNNdX.NY*vԝ3L۰694`'4s!6U ;5>jde׮|Lxx|ٿ 0~҅ Pb ef2W?^,XNĹs6 /2~||ff}^rOX LRW\ܨ)_Ǝ$3ʕ5?2̘!o4Áx 0a`k۱uKj"[_#Z] UtԢZPirU QUU(*mjFE%6icP ` AqxAv6Μ--`h> س~^2Bɑ]]ϧϝ1&^B$QBaΚakf&,R9rjG3 _u@:g^=krwU|4ssѱwo%.+4ۻWKSӲT޽J6)E-S(g=vmؽ{ƏPYS&uCe?풒ƅ =%n} Ӊ@g]]!%EZRWQw6p$@.ŊP8%eEx4"bdC^;e[TLS drr;m4U|Z~PQnfy0ÿ=AB8KTWڼ<&IV߹Sti^UG+WzYY)0TV6N::R_S ZY+.̙{,(G!瘻q?YLBRof߰!?u4[x:QJJv-Wl,yذ eeTU[{m>ii22e$˗G SNm!??ϟ?0f̘l #-- IIIӧOu떉ɿ`2/^T?{钒'LI4襜Ojjqذd2s֬GJů_7cy,-޶$FTtWnx >>OSX,t*奰|dly;|PTܹpu)JCYJQR U%e(-GYEE`ԏ#KO 5w4>w@g hAC ]4jjp<D^cVI`b"4| JؼˡCLQ9{VS' ?AYnVV]=тuJ jkz½V-F4yEStu3 )hƌ7no?:vl^^Z-c*+Yzze:M(ͯOBH$ҨQvibbv˗4hɒ%Wpر .}VNNC lyy|o/""b!!!^ (aѢn324Z\v\}ܓ'e;vI Eb+*`;4IJ眉+'a]סl0A`gfDFN_( AZztqeynL()͛F7ژ:ssɀaÄeL&=¡C m2XY Ӧ kD xK EH$O᎒p8.^pv3: m`Q(ɄڵGdeQg-EZ{wwWWM~iiuq_P?MlҺFᓄu[z*rt(c6|M]6֯=x0u^7off IIǏZZ-96_ZUs8eg:? ;$?~MC{L>Ç /~ [`knѣGo޼ya=>}W,m|}[&XsX99F iRRb[Ip]g{EjY0h?L&1s;wwңPF OOzP^X(ѣp5x77~$0sJ=z`@92uXd iiȈA]<pq"mlıcd/BRVء,Zƍ?0ut\=d6i^0FV}\II(zrpx]]);w@l{hpߜ8[7)k_0]v1_%%8'բEoSS,-Uƍ~vv-tƠAe޾`W`y^!fժTO})={)MF f̞uU&Ӹ18%SuGm._me OhDH$O[:%[]]>$:Tje#ȅHpty^KAZt:U_ۻJvҿ?PX'``{w̚!݁Oͮ{7tu1kBBs8:]LLkkj;;$%rs[SÜ>]%)@`vuv q553>]-{ ǏvvfiV݂]0#.?R({Ȯn( K޹s+gJJnn\ ֮a0*/X?ЬTzz{ ={֢qÆ FU I:9hĖ-uzyuɓ9b*ynĉ=-,4)'No)**Jov:?%Pn1X4p YYwUNXxv΍f22b}5+Jeݟ&կwo7o(+[w$ooŴ4 GG20uj{?5`uXY'OA31E,\=/_Яl"8~v6r̘t?$0#jaqP=nmޞy3g&P,W^׮V6WӧMyzERjѩ| }DzQN ik髫sqz{psd5ԈO, TVVn۶N:*++;zW -%%,=ZNcǶ\kϚ{z\"ΝtiTzΝ_H,3'&5p qpk-;leuӧz[SHS_0FR}{pLQ[tqtj''{[95 GK<ܺA` ΞEUt ggLA~x.JJp۷ !Sv-F^hu5Ϗ| F#TT<<` (b|2տի4ʥmk))Ə92k΃ٟI2aOʌ;B WטÇ{_fKvBZXWCf()8jh 'O*;;Eȵ}HQw Yfy{{dd3]F G,YUUz+Ws_֭u-"mII}0kل NGFbxu`@2k~]*+i ?o#<'anPPŪU @>38{uee, ,]*뫨!,Fի۷PR`e Hjɓm۴|}[F_QUgb"zsG6˃μÏU0UPP0q6oܹsJJJ_ϋMLL:th'ګW/ccϟ?733墁odž zz1Ndh(;}*ڷK$ӧUT$+vsH,֛i p V~9%``葽DPPo?WHM̬P 74}jaqd\f<')ە}XII :Ə/^l/ @̟ѭf¡CHH|%H v?yaW55 vʮ(O*(gO=IPXXhoo arrr󖔔*0ٳ&Mvuu}𡯯p7_H{(+/o%& D/u*g>5kJJڷ+rJM5R_KIO<|JFR|A1FS9v@V/ k]#aiyo"x::rVVV(ÆET64}X+V|Z06*1~tUݽȨ -`mmPP\O#GBQpsM^-d"='Ob,hjb^˗QP%%prB VZؽ *ꖖBUXYefg d;;/iWV6ѣΝ_ƗhW:{vھm@;t0dTUYbWV$ ڼYы-sxQ̙L11} uP5ktvؾ ꪩ2`:23GvĈoӹo )--?~ѣ[o4iRPPP󖠠ɓ'wVdl߾}sSS o|v-+̜{fd@{l֬Wj%B%wH8u,{kr4,_HGÕ+" K0gN|k~6'_?^ A}{mnnw@r-)A|<eѯaeQ vwѡc)) ATJٰtw01B>L'HBkQ= L`#޾IJS˾}ewv(0تW*3k;w.灯Yuػٳu[`Z#$|WRRbII#'$P~///kԂ`Э+ddHkhk3oLwI;wœHM򃽤MMM7o(`f&MLQ-[ IMS9sF2(*by{ם>M:T+Q..rӦMKDF"6I=0bԠ uuA|(/GE**PPLDE!5;>Ç*+227=K!44I<(`ś :Ty:03zP^̰i2lmoVJRR* β] 9;d&mejՆXO< }n) *^n>/sp)'O[ZDG[s㉉srrb?4_>MqvC<#CCN뾍06FF H?yALxlٲˁ&Mb\r>>>A ߬nXzze[TM&--awRRbtqϞ͛ҥ1?2ys\!^T&핏4gg.u%.dihDFNO4ōsuMgku >{VyUU̞=\5lh%߸K-]*۽_e2F Gy9ϞBFu -oZw/UU_Z|%RltHH`&ߟTMdՆӧbc +I(K o!+/g,^𡰵8yh$*`Ag Pȼ5c>*64T rVl\6ZմV&K>h vh}^mld%'00 [X))ᆆ-ˇ.٭y{]WZ\̺vMӾ}ش }Ç_Gٳg;vLMC2G~>ΞŒ%l=~jUM^i|3+MsNou޻+/blq]ھFWhl0*Wy;2hldMɓc IDAT{+EEMΝyӦu|͛avNmΜ7o(RR$_nHqP\̺prtFvq:UFVucEF(/GYYG!SACPWY #Ӎ}9HH@Mx>%d*7.^ldPR"͙#bh1oW}&qNը(kkC>_"\]{`$߾׽|t=Iq+7]X4 wOA2t Ǐ7ϥK혯d/rr(vpN5|o"#՚씔_?#LZK38BrEV rASPif+a`aQиk$-ԔȑuҺtNOԩص囷\3\pi-^ _[^xP(1cĔuzrhDbc^WTml\ -u:=A[[zϞn3f$F F;}m*F[DEEŏGCC['vKAZHY[8ּsgTDPKkk)gg3e{gAb"߾*1{%Y[OfDt_9&9Y__4eY1Vʪw.W`#k97G~~UnuҎ4H)>~lSܻWysݻ1_}0W73Ͳx1.\ɸ{oD yqҪ2/EA`(TT`lȹOX9jٳ*XNɡΛu+wE6cΝھ. 6˵k‚!&ټԼ%ȎQVFKW5;yy<:{x ݻנ޽d_:?5FBa>BAlTW]=JIIiGnzzr&&(/GiiJRJ!co!+q(9XNSUUQf9cc+*;vǓ_"KmR5 tuM{>!svkްaCW))!! ʃ`Yb{|Rn2I25MiFR?`\SS1_yS]-HN}IIdd hwww:f8߼MxE~ "Xoan ^ ϜYu&u?o s>}/ݻzSӗ 4ȈEE<8CdrP&%`G6'jߟp)t>}wpxZic񢊥adHL9yx$Ο\8E}ήjj[ǎQ$֮[HNI&)B0wz9,D²ecL"-dDTs0đ#e>>LiiҶmZir-,޽=;E"ԩ66"|WJ<|8~(a2"{Lws)7ϒ/_}3Y1"&2=;ڵ-[}C߾m45-'eeiji}5 ĎJVGc4am4 F")H8rBwLnX:ѣ70PXB$Oy7c;wƓXh֍_v)u nM>"pʔ Q=֖sǜɬe̙n]&88i2d//-qqPdl~ڿ_HA%mm,kmn%+VԤbB-55D@Oӫ $STeDȮ""LM߯_igh%<:q⓹yTZZAP?!ڶ)RRb8 {`ͲC)埕{dX؜]21ٽ-Ɯ5K]vuFQddMunެ&[Fsg=AEwPWƍ"R DGcouG==v Q7jTD^wZUاOXeeǖkq1'eeû7Dk\XXkӰw|!;~a!e̘u|W4ehxyBV5ez 0X,<|H=tJca++)77o6R.^lPrr:xZPиuk_UՕn"He\zJ'F"]$%Ů_2EGT j#W_i5r(k7nW4eڹ+c'<萒RpaxC1m'^dgO0vql٧gW8~> c2))RNF׮_L&Dz:ڵMZx;Γ ~Y8 nn xx \UFJqwөJn F[CDiRR)SHL:zZo" uZEquی зrx_N}J2߇7􌉱W>=n ?̣G}ӫԱc>|DoO!&;edh+(fUikz{s cT~C`}֭/_oڇ %iYz˖.+ӿK\]{ʽ_/RsNs; 'Sf7Uoa0@IwJ9&l4Ƭcq tQ!D OY-Bej0|nuu ' ߒ"8rz_7j ҽ TS==ϟ5PGS߳g5OZ,RS;wikN\BSV&gdh<QFy맻gMwWag`@@aâ?| *'&7Od!]vJ :UGTG 9g?}xp $ YWO47q#:Vή12ӎ#?>8p${Ktbվ}I#}qUZi7 4`Q )dZ_wT|Ç~殖/66:i**~m'%QΜ^WΙ)=m'G U޷C@ {} Ŝ散z.l_+!%=&>\qB(-}Y:Lfphzj  aa')nQss8PNNJJV : 7B YÇKEF$.]BNECYY;K]?;iO AAQQBѫ^뵢!V,ATDEJSA@zoK!u?%CfgϞ=nΙ3NZSUiwtkSO8*6K] HzEǝ;Yk|/TVFu?மiVVr]FR Kim%'с u 7^*ñc`f\4w[ˑ{<*(كUZѧahkCVܾA>eɂuu+W:8P(ؽ[QJ _O tptT17"=}JJ~Xw+@f_)6Ӳ=8#G\l.##C˲2NbP\a+v I#GJff6E]Xke`__uF#::dF@Ȑ߹Sl( ȧO7OVUNZ{HSd$i@<[?R7 -ed*rqio 2E0,L&3S~q~XW--#GFLxxus1Q^UJIa<1xѐi]/6H]4L!!̦Mºi`G0+,u DdW^o*'5^ӓ~Z_/`PݨyxTb9\A@vXU.=ہ~޼@O/.?׃UY J (PF>SY 0iuB2T*2{vw81ZX9u 5|Pnm Aݻ}I lEPfĔBq!lK]>+5Ϙ&+^CCݻ9ZZ}BF۳'ӳ.T}XZoH(ۻҚjFU$%H܌őHQQ/_HAsPI&Itu:66B悆|| <}߹GI eϞU튔',ؽ;LFƍ~xF_ln&/\CZZ0(hE( -׆s Т8w^Q'LxTr,b^^#,SRסFʕ;֯7a"x%ln] (KB#< Z}]ǨAk` eD_ÀDGpHIjHgJaז  .No̘.g:G+U}|LzۡCǏSTIJZuo\e4J$4gTNmڄs(`}ÆO^^R %$zX}P;uj86;RY;A?e~ֺsٳ*QP(R`33a@ - YOK( '9nu K3L,yp0q:EEt~G]~;W9rH|~W]AA~$|bajCxL:"lL7of5wyj`Sz%'Ohi,Z.$䇴˗3'Muvaaҥqqx,uC}Rʍw}QJgUssA Ӆoao9")(//;{旟@aaӌo45%CBfo.=jX1CbcIs{?k>wp5[:ƍ{vWjNU_.bAfMÝ;%zV-~ ['["0 D eZ;1^EdG[=upFSƍ|m^4c\ɓC*;w??u*K.-m11 i;sf<@ll9шߔY|aR.$mŊO a| %' BB(33KKASSA `6>^YlD%&sZZkkIAAcmm9iN:#8dΜ` ݄ =*͟BC]F&,-*pJS-JEl~=A]6i:>˗W'ՑUU>=iRc@c#d:"'"20'\=[، S0 CpháTT0h^Hy9x-/M@MM =RPMm`-MI!/vg%%eϟy[[6uJ`tIAdE:v_N°͟O2gͻuPh'V.\0G}Y\LwohZ Ny۷q]֕+E||Xƍx8yc)GD#HC'PQc` <XHFH}ѭ[e@ 0vlMBU9C &EEu/QcGxJ^'v;С≉ddwn]*949V v%>w 2=r+cpvrr۷y0qxj*a{tVd$J  derrZN--jnFTUѪi55i}$&5@MlPno //c%%!&%%eĈ&&xaHX)LK7_"3~ƌ7٪|q}X|?de\1Zۦ4DD4޸QE==g''Y9 K}MD}޽0F<}_{ZZp Hurzi(if .:UMfzfY37oۖX4*阵ᐾ'2AYӦ|@pp_p8ˮ朝 ߯:U""B-w -,L_ah=Du z"<*Hl`s*2aZxV8݋,aDX[4l{ 99-[A1#'4YWhyFbXFi05}D{w\rk95Y&[Rl +.V}~-Zg|R.2[G/zݔ1cϝ73K!g&\"`0%]\̑0-׮57,_._&&,)!ۗa)>5΁fJq8惥 ^ѿfylzDǥ '7<8.CA"&&SSΟ7رCNppٹd--Re%MS@@~35e9.Ǐa*s. hiAF{yG$w60w"p bPR RXB?VUCh SR¼x9WKJH>4s퀪֭jj"7nFEEugmm)OOsaaL@@/9DE1hTo.Dh ^D_|e]ғ}jkNNum^ ++ӧv̰ZRPVطO)'(>^z9!!TppUjj){qo?H?~x{47LMEtIDxs@@J.!aү[W\GuΜʢvʺW2Jq#72+! o8+Yv|$!!ãdGeE7oVFuFF{Jg [551s [WIIPY pKD'/A'+*[R ~_X L`?[E>BJ3} Ɓ8Xd2UggSq\xbϞRф}Xdjb7ydI'ywdOu09iJ$5%6~9AiK}{̭[bbGz945Q.]*8q"*!=tHUܿ_UChh# ,mݪ0ZPQA~J2Z%z,7_#0[Q(ؾ]Us0~f7OrԡC{>aEPZ1 AV&]2NdU&m6O&/Hy_\L=fݽb߾Ţt;իѣYȞ=Rr1 YE0b1? #̳?,>`aoװ;7N },ر0s&47w$ ;v[3קh6uuV.oCzQɱBB;w7E`Wt! YYΪMMݻ3"t9&dd۶)hjϝ+M"||jMM3,,<=QSC Wa)GWVGV3:q_obkeV== g]UMT\<~`mreZW`n]19= Ͻq1 v!l>G #FH,ZU^ǎplinFfb22smX68u +2G늎6O/.?chnWY$M\zȐ!dW\d'e ꪡ e)a>)xS Cx9;]ʿs9s_>FC6oruRU5 oh(2{;|EF20pxnў=JFknwG7j =7?fZXX޽cd(*&(V*4T7իe)+Z[Gd}xJZZ0%eʴi}OVVjjW2>} pMpLJIEEdW^Y5QQ "wbI P/N*KsJst3y `ZPas]0` #«O 3k>;~wWرK" c 'L)S]c P#F͂ZD\|l%ag8orPDD۷%: SqZW kwIK1س{3uժH| KLa()}Ñ#mmj!>h#NA[QAǻijvmуu5 1X--ƽ{K2M9}"!UHmm-x1`DP _";#( l쬚5U L%([L$jDLnM{l:4ÐHX2FEEyz#U6oZ,u׮!SZX.Olh3WNf".`A{" pç['-~ 9Ŗ ӧ,x@@Ç/^ܶ @\\ĉ aøVhZZmϞYװӳg/}?T*K_b5YnN#ͯ#,tѢFʳgӥ[Ѷm  .zꔾ!?T[*a)dc#an.nm-ٙ5($9SJ426g;mK{F|h&SFg(X'Fk_NPX`1i;}׮ͮM͈jһwf]#g iܶME.yy#edϟK˚֮۷a:qL<>5zl<*DzEh~g? Mj!?Xh8D"$((W`).,79sP\~,Y I= =|pTCC'XD6޼9yZO50ڳ#BsN=#*~{-FF2oTS{0Ǐu[~66rFCAF!:%,14q[66|yT$)aTEG7 !2117>]r@:דs/\( h22l٢5A"V|0WP=uW E2W71ʋ~v%tК1gC~ 'ji=#};{ ȑG-,d>}U[\m$'W6}z]h(qJVB`I hi ^ Of fsS+,Z? ֽ2A{%P~gXۿOHÝ'fh O ؾ sAYA-6{\jݗZ\޸q\\$MO/ѣKWIޒ% "K$${B=,9#W4] :=PP4kVpVV)_Po3kkIt%$̔a#QQ?639;T$3n2{d.?D4| 7*ƍ=+|l5 UqJпbi _֐qYpuLR zFD}=92r”)T8#-p\6ղ yyylrח\sCK"GBm@X ,4 Rrm{( # #Æv!1\..**hx<%t߾Rw ĢRߺUnE23x@4ettj0hcCAR(񨵊`eO?J=ztn^U9֒˹|FC >yRo ^5s ĘPƉYYI#*(/Ê/"RjJM N|&v?ԩKLlز%5&'\d'PDD9;Ghۓt)`LZ.eDGYrcT9玕,yh`G"FZ抽{3NΛ9S>8،•+[kj  qf00J;;R#+*@SDHN#2J+@{"I&,`d X31?ÿ&Ծy փ"ƀhcС ln#/ 8{VQA״{A EaD{{ z;/806+ˑ߻]N&q^cl/B99=yR C]аeKj\NtH Z[i11QQ-?6э-==LF0pAee8VEE+VYY"%%eĈ\K$"BjE,Xŋune0#yʤ cpHI$?>||. +W,-eٟ;ypp??pN-WX…{Xew3$5F"<*(?u›hpY3$7 h0r$\j AƦ6"~W B\1Qkc+ 5=׵Cӧk޾=S~ҟ>h(*!\-VwA``_}mWr9?hwgTUXԦMǏJJӅԏ##())Ju50 rrX99"*(HJbh55*Ju5TUQ99vTq !KKCQEv׮j^p6-_SŢ ̄xfYnkTYטũ@PBi,Z?Ncb*-,++d n4䪳{g+LR,2deU+,JI>][ `ھ?SSA -tۗ `jht ,=2QUZ rnBh4FDe8,F~LdAׯǏ9x8Lڕ~\hRdQD}42YN@@FͥKa 8y%۞ %w ƭ 8mOPx]⏁'Ve=(P`;Lmg ldWV>v3$T*An.,~ٹ 6_2Ѩ(x(g#mO~R[ͬYcjӚןncYˇXQQQ̯_T-[())x効v7!f{dTTǍ@X4DTDDhlۦ~6_GBBҥ99 ""Sƹ1 Ѿ6J'M}d /JnMU=XmmT='EEwN]F^gdc%%77xlly0:+˰s`J ԴJ( :=v i;v]\{Us+,xx{ܞBQi/ A~Q*..ޱcGhh(L6CMK)BPZr g2s0\X sWBP(J$hkCq1| vv#`D9Ω63mt 􍌸lzzpɓx fdќMjs hl$mQ.8;k_j!.O$w܀fprR]Fظ|i; wA`P3|ݺTNOD34=zd{ۀQTf1M8U?WL~8}:?n@"т*/ IDAT8r$UUUxϞṹ'OuU]fkv2~/ uEi#\!Ӛf2rMw=Ӻ8+ĩzXUE8}:ΜϣuuFQ]%ܿ_kː!vq|%69~sagcvn`YW%P(86a)_ Rօ g8997n{1q6*%㬩C*^f_}g |3<|k Ik+hh@U{Ӧuh10.-^.9VWSttRojϘ?Q]M9CE]xbm_8LAA$'g1Uo,vxo##@YRr+۫Gdf/[X# ޿ԡC9<=%55$F)_?Z>>%w"z\Eggٳ9Y/<}yy;ay; k^Wr8N+&6l1o<*涌ᨥK4=bݻ+VpRQ /puTmkMM(/fUgnc,~|?ΐdkǃ5+VKVXȏky4 .v$1pÐ2 8٦$RtyycG KIIi1A`Lz^Rpt47W";}~@h3g@# ]y#Z,W6~n ==y{Pѣ 3f)/΁00pwVLF˧M6,|ތ"BvOhZTD>WUEww/)3SOB90}VKKEXWdBى_.cFT&{qΜs.dd߾ŢOˋ>,_LYRݺ3g*IF:9q!vߴqp氮 (/ѣYvgmeYW? D?7A`= }70}u' J(((TTTK˕EEE,lٲ ^¼5E滱!qvn؃2b%ih@p8Ku>D$ҴR_b׳ݺ5 HK+VP^""xb/V0?_e BVߊPi7vp6W()RP}z%%w\ p 4M_4XG2ڃ'KH\R2914zSP8a /,Jd^zFE;aI53*uU=+ޱiM^xH?p֬7^[F?A d IH$e'IJA8D"!Æ!H` Kʈ ʐhȸ"nCQ]4 @ )Ϡ50 H$D" v?w܏? .((($&&xe="鈀- '0El6$e&RA>c F%K_ZJ*({_@BR}=ό6 =^WGh/ӚƜL1FePn}(Ⱦ3gBm&*\eo/(WT|{wzvv@u դs "ËBM}nIKK?~_CDE`Oz&tꯑ~ ! 5&:սR/i;\yžlfb͚B s;jh R PvzK^^2r$Bk)` UW"*3vQ^-C [E``IUUUo~ȑ{r" BPҨo! 9rHTTԱ %ohheEزpӣm!?ZؽQQQ**77 QQԕ+ ga!.$Dy.ohhhAH}(aaϟrU199 5RRRwc }RSgtE3Ymݮ;1+͔W]>] "KxxL@~]<~^WwFfΔ7mb"YYIĥKA<.:tYnj)c3y%}ΉLhIp8/ ; qqKI1v#.^ؼn@Ҟ?/a[E`{MM30𒓻=4j}HCMzModzΜIyllyrT3ߟ;7 ~߾efʄ˓B @Y ѵ@@%S/I/ED!gW/wC3h ~ `&'w=wOGxhp*${dp=(@weHd+ 7VSVPXǎh8|Xݛ+*89ƍ;W`c_0qѣ Z㉂a.EE?'+vҪ,3e [{:`xWf:8h ޹ƐHx8ffW(,>{@CC4'5MM-5-* Ϭ<7 [Ϟ~`AXWW7n7OI@`}ffzz+WvF '^ܼzE-V"dNܬI(2 }پ}_^59˗ Xɓz\3KKPP8zv. {4ɰjȑQQ BBp(K%d0XV",c۟oI%=  5lmm}}}%sJ~~~PiBT.Cd 4 0ꐂr8xk#wО`0p<$&r^hscǚ:wԩ!X,˫:?\ɗ1 u\~rrc7 &{RRR'Ys8d YNpP^hpw Oз ==S{7v͵ okDybҤhiiNKHh@,^UE/wqnhAC#"02?USS]PKKlʕ--gg?As5 Mi#;4rkeMf:vC&SaRQyq8YIyEGIIa mn{H!..) }QR\uwo)Ν Ǐ6qq} \\A`~c^N]ؿ y@i҅yY٥ X ]>R1H uĜ~e~6u^Pg7 %RSͯWWyգG?{4;Fll䂂&'OٶMcpfJXX޽c|RV]͛yy71ਫ#?^ukEPGDŽ7ӛdd̤X3'Yofƍ aaD__K <ݼoa퓔̘Gkms=nɶ6EmӦ>̓¸8С"wG|&99svj={ĕ8_g@z:?O_Aj& ='{G]X̢}Bu3@0ȭXӃAJ4 ;vkkkaX/̢/_cCCՁtu{ЂB %x 3Cr>S}x+@s<!9 F3Ԛ~+W`&kmpjPPbJ&#߾wYYZ5rz.u ;>9(PUu`Fǥװ͟Oc}:UAAE(9r^YUܺUVRN,da!cc#?ca,:* 36'*8gc#on33 > ;H$G% p~~6Nop d3NbRi*9sg{ v۷3%-/'oh;cd|zjgS!,y1O]a!Ak+5OKyÛkaȹCd@_h Ѩ8eьF`X !Ґu Ą,/Ph#yPV Avm7,| -IIHO! ~iU Hh g{WOϪw,ƷiC6#RYΠѐ9s޾}[2~Bd/}cm#*0; ίĥ ڳu`do )+c45EmlellTTh 0$'7ՄUTG$2XI2BBmTcGl^^iC |W_6R17CT5t[$B!K Ӑ30XXӊ'>ĕ+i[DaccjoPpR@nԎ=|Xp#X[W]TDsGz*Nk^+LJ% x @Mrb%q DКe"nwMYpp1oe]wnE5rhZq9GS3|d?Z(Z||{&)(@=/_V46ʨ##oKG?qsr 8?r9WT D?PoTIHtGESoBE! ,!@@SMX_E!/܄dU:P! 7JIIq={h… .,..?OQpq1Pp-3X3`;۳06 Aiyʰj1PpҳC.8AP:Ls /uuU{t˗űzl(+L^NCxU u ]2 iD}CC\H9&&M˗G,2l%45EׯgZ]==>~6?ƍbGywc|ڻ7#(s aSNW*(NQBb05X~ҤqqUrrΘE_q&(@ӼU _WV0k/.YEuq (vbb(Xc<&v` H(aб4 (|?{g\v3/` =XZ!&rrxtٌ::5J+v޵iCsq7g׮ĵkce{KIJE>wiO%$O~/!~ü{H:9 o13<qj5))Eٳ[b32KI)URPRikKjiI))I7mm)--Ig--_ݐNg1t6NOgV|錴4Fv6B!U 8!yy]"f222ԥKM׭] _'|+Wb亼\MdyO!Tjkzz&ZZ*Pt2?kgim'N6ti%CJ޹S9p!-^u(D`V,+9N$gaVGHJp=eY|eJn߅D"QX?DC%p]{ ;{V25mڴ]:::f @rL\3CQv,Y1}G= kW}5ksg3x5',cu/ח>yr5*DSژ&?"p[~ߗAﴴdBCjkԲx.ڴ$'Xδrm=QPP7DZJK9sw((`ɤSwꦩs(.=}yNI 76])455:MU&JР 6*!!!frrXYYlVLfa$TQWo_U?Cb罫kh~>L&ٽu몏~UHzՋ?s ϒYа'eVBCǪ]diEPun5N|\ޤITyHL䚘dsDDi%KjHzpfxçCS # %eh; YyxxHi'HLCO@ȷH$ԇ&P1]7o߾ >|sN~KhVah56&/W]’]0m $o)0  E N*sV>*^x*ܿ߾{@HH~T*)<ĤjVp8>ֳƳg#h](2ͭmN F6~_GttY=<7woœ.Yb~}'yF q5)3Ҙ%Vz:bckVn!c0SWRQ_-!\OֿW(* (pDޞ#SJiT8)ӧfx.%EieV.<akD_Lo߾5rng$+K n^e172>>]] "6`۶J]lF! vo|FOsĊaA&C c-Dm<+X}ݸqQy0 ( O1##SN?/*X%lH@^0 П|܀6 S:¸x8sJ_ KzJ娲#~~Ed679|…5= ,dkEZ.deYY]xR{֪ϯ#W|sc >%+֓TP!yОGz5oqcIe6o3G|&?R. Uafee1+>Ƚ}[NSW0kM\|s:E?R._gZ:00q]^L+s~6CnL?o?dĨ:]xx2ΉgͪȑO FkiIQTև/5mn>/shy:zŲΕ%%$kiUzĚ5GTE >0{T IDAT"5demG!LJѯ+A pg3Z@voDA;bPxH ?H5jԪUt钓swwXXXh%%%g͖c2?y??e Y^KD˵D S E`8a`ת:|%NX*#1p2bBtBBWC9u[B"BI{NL|ӵkt TFm\\Mq+lmG߉uvx6[Z8sx\{.i[bјi>oXomp^ʴɏ36xRQ3 D||#>JvGniE?_C0v̼9 _u43TW,X^ ~tի54r}Б#$xD9@ږ-U~DqN%9EX'<_ld ۵B_9<0`W/Z`fZm7r6>22׮ g~[3t)QO<9ۑ{Pv:7ޭS;=UϝHH i v~5e"e0x1@…6عH37p*  etZĔEBI~ԇ%?{稨d~e&((g|ҝ;ZN/zL=v{GD|Sub?3,VM~r˗Bܰyy\e F]Kѵ+QmZ!!n:BP(A`8Pk 8 $my VwۯV{tcUUհ0ZXXcǎ۷k׮%d?V<WBɃ)sV\"@-l9`rCh;%qTB=-JgpΝ XN*tt2KJ,KX tΜoVdrML~[ ʐ9unsaVmG>U*x:Fnhxʕ$.wnjqG={T_GL|o};YL;)z*OYްv婭p}2.W$)yLWCG P*5k} >޼!(J%+ #Bz!,7 i!=RVh*y+1AS~!'O3FEEJUJNN=z4ѣSRR~Y"x+@N/!T87"$<K|HN$`IlC@heEU*nKre6&DEE6xLZ-zrM.')y'6nÇciaauXa'8,敩cuU̇>|ulF=jjz𱶾w~ְ=_L_EQ}7Z>G&=vmpQQ(f]Vzs4δCWigD͖c6VVry|w`dG-Z]C3:ӪUm[Z] OLhJZTTk#7"dZ%1pPń >I"JȻiE'+XMɝϮQyBCA @G=L"=tէ8Ag3HIJǷ’%PTÕd2vR$|hժR@$̙j\(ϞݪE }t ̞mH&<=#~}:AC̗K 4LYֈ JR‚td\ѣ+ c|_߲+d `gt*},'Tw-99Ν|)vj̘:Td0y2cZ XO0 / ψznԣvd?}U546?m߁5υ#w}$L&DRwbl2OL:a#?Iwt%ҿN;r ef2/^6_Uʕ %EAvzgfWw~7Fŝ'ߟ<.O>w5{[FY͇!I9b͛-UT3A\Zf~dm}ի ήmp'goԮD_8#2R]@ H9)v%jd"!-jdb4z3G=G88d2sIukBf&gO%;j2ޢEY!Vn]!A`"Q ]ʂM%  *ٰF?*7H ~LwhW,.\v UPF ěr*\^'_<|+3CAEH&37 X+- Zč(,Ѿ=GVԩt m֬Fukj`PAױ o۶\7,[tx1dm #Vƞ Qf\uo.EOms~@8ee71w?2.Մ((`ݺ9@Qc/?^G񰍢we)I(|uxC1߷͛n+@YLuw04%JLB^J - Z˕$,Jz;N]|M!h"<WW0`s K*įߚZG`YF['d6 wQ}-L]W:M#+U"F l(-4%%IO9"vkjH%$0<<2" t)7>ͺUOO>22]: :WjFA 0hP~L$ʇ{~YK))=z4lVGcML.qoL4ٮBRRsH/X__a߾iiӼ{VM(`n37V͢B")q)h3IJׯ!-hudmieբ611e^^d2i%!!f6lSR_u&aXX[Wii 9hxey,^6XL#M(`v~>d64]42q#ipc;KHɠq!>e. # b `:,:s*t:;;t4A ڴ̛'ڵbI||ZHpwψ6vY%N #C=tM p:R gG,).J&U*j  `,)I}w:wvh,gSf@XX /ϲּukPB¤eLYŶn/((, vkW"D~E XvvmnjiSog޻$}Qumx<̟&.TSse>HP.'$ P(W ' /A=aQ rFC^>dkHPq䖡wk :[ vI;&OSW6Y`r`QSBlF^v6`qu]p 7_ DA$I$xxΝͭ4 H'O͙b |qpnYYʅ /^VHC2E18&V|nU荻"CXN烲Qu`nc2ãlxxzz\]rsg? ͻ|9GVVΜ@&޾}T#F&5o/a8 k4Z_qS/IV'o o͛){{ԩ#[=WW5j^GfkjJl.޵8{Dҕ~%`1o+uqraQ(|s@Pruj-px   !>5Ӡ4uk1LTC1@`klfmS]6Mc Tl ۏ#Idƺ AV:c<ps$ ۧϙ;P奫-eɓzJYT~e^&iڙ3 uX0tѯiP+~Qvo娫K]k4gfQeKιӟп߿o(,dy{0YjjR>}4F-kv_%R+j rc}lҴ˗ؽNmlI/\ئ6uR<زE yV,|9u}%`ܸY٪.s' 79:h4\  !  =$xաu3HSW($"Ma",:v=[b5lx^4SE vU 2")| ##FJ w21e(*R<=u^U^VH5+N(UU)~y'YY9FOJID,wIL۟G5?+H<}ATxvvm9ޙ3.pϯ&qvbbeAg/}{}zL~6?ߕgBsNToJqGW ^efڳgW'?LwхwVgٲ/t:wq>m=T66.niiǩ#G>07m۠L9;F5qq7ac+- U iKxpѴo1L9A!; 9_0ٳӧǎǏ%ӧGݍ;v}.edȇ '7sf>A]~Jϫ755Av vx# :adc!ط-`H(@t*CJ΃ Ã%TYn}X~&DhtTl0A D!Pa rH5ykApGb;4U{Ex0܈U `N*GBUUrt 'V1%%P̑#P(ǏRirq1֭A#F~!&%Q/;Djhˋ 1h5R XN%* @Blnܿ>=/> 00Ӳ ̘05MMRX.Ϟ=e E!8bNtNeiiK)(ZOdߛ췴cn~%1pnkt~r u۷Fi^nUfVZ33{ܳGw  /3lmiϟE\.:vDL %Byb LB-q]߄w1;H^ǣ*( @y~QX9^ 8=, BS<]#,]l@Ѹz`PȤ=Ċ0Gcx+ LthC~ XLFe@1h)۹$x,?ǀC?ES''݋!Cpn ˻w9r͛..QQ&՚!׭sw!f#UZuVr11vǍ9S?޿-vDa5rr7M 6qr[J%wlkekic "יYUumm[[#[V[#mDY᫔$au0'Z]\zϞU޼#QxY"Ob` bXr^^aaT-fWT$EFn]iu188@OqqxϏۏ0k"N _E!" 7[lS CP>y 68W IDAT{r* йC֮\PUO4+U ]"h%lC1P]ùh؛.!q;4`v 5Kp菰.A'Txqsq.ÙB!v@c'(**rsxǏ+Ξ])CtQnզ-!CB>C4ZmC\.ѭ 0::Kл*H`rTŸe㦨d {ڶU5ML;Jaf;3,$$+003 ͛,RA_C-g;1d a>>UZR$h+R(.]xzeNY,%8ئCEEYYrD`Qb\~嚛ӧ[}+& /ba1x ZoL, .;al0#8AVǡ=\m4܌h_#$Q̆E·&>'iS<ŠVB"4`iO"GLN3!0QB8PHɇAyx3`?w'r9d$/eaYX#?a/i02<"ꊛ֯G.dC633p\ٴirrpU}}1Y!!%={ƓH 5رZSDVWSݻx.**Kw.%=}oN|lDkޯ= |Բ U53xB*fPZy6'00# # #?_)cejcٿnN*d׶o 2JUllUݤ,U़^e h}CLcpx]ϩkԐ^L5`cU{x?3Rׯ 4 ߱6Tz`a Iػ z[°5"/@5°~* RHv,:l]`:F\P`"ZnD"!4&`YKq'l q}7ޥVШH؆J0b+nxt\[vu7Lr}w>&_XfmM{B"һxÇu 2"Wo +]digUmopvٹ3\9$dLJ7%Y'͉ayl>,|̴i}lVgj=h  \._'D|FSJq!2ӿ|`de66zi)*-w!_x1;H—y#Hqć6`MliSBTxiچ#--SRJ/ۻC -rtҲ%-&D^^̏˫dBuurtz'oNQPPi]ol D4>L t# ѿ-L:X Lm7 x:! HCnX4S8G1>ڶEllz<3_ V1SrMLbRSG?_+=p 58ĤZx8&<+_:Bi\ #~ux~>ҏƧ,Tbtg HI4:q,).%E_ ",","*"*+cٹ천Fn.37[񁙙Y\\T$4iiuA͎UQ_v?`*-p|9yfds3ضK߾ͧCP.$FAcb趶t&ӈKJϞ9/z;( t ۜPKCC3?_C{))dF,D֖ҒQRTUryt:NgҴR򍕞^Z"(&#,!ϙv Q^%UO!PCFR^Ni)gV;׾c}ƎM~=Wv/=sBC OUFX,%1a>.aH ޅ&(" u;p-H.3ΏQoL,)*b'hyl!uTփ&йI+hV8"#> $ o@ h#/a) 3{ xǑ_ۛW%&v(.}& 'p]B;U,XPSja!B72jT['*vo%%nbb&Nó~nrܺX|Ce1fj\/%l ku v3Ug%% lHyy\߶,WK}P8rr****Rjj|;k];Ef&cܛyf wa#?J1?y#;1wѱcj߱ k-6주<{]]1E;wmKP48|̜'72x0`s]E_ 0ؼ KJΝs8..rnnbV>fuS\̻uKĈ>|(ſQu֧cxĿ=۰}q~ͫ %\.'tMm&`*< xWrrzXǴP ΪNgRQXvlly%,%Cs'aN:l%ڬⓖVjm}3%hVׯRkcI.l//+k~噚Ƥhd Y{HW޽~ΝA!>Z :Bt,\Ta]Gx#t? {AmnIx+48SBC @Cl1:SfQФ'DM (ZJWu8wY n|^br t/D~ "P.#"gcڟ< BN?B㛈WXgTz^gOʕ_[tsfƘ1T*ɓuȬ`?Bremj߱a xG.+ΞPF=yyJ Uy;驘[4L]2dOP|лN?>OUZ6h Y{EDvqÿS_t}[7"Gƍr[y0c)-h1υAs6Dq{nA !=cF?ч!XjE|*ƉޘeCq?)FzʹJJu]Y0N~q2Ya(dhBGLh*m:dp @v Sfrhe 6618"H_A5kddH2b~;HI̪zGtrjKK*(C)7lL8z4.2G+$2yǾ.  }//){}=,6LCDvQo+  .pt f{wp"*vPX14;sƢf*<42LBth+AvѹƍbOQX%%8; ٹxojW\BAk + MCoSL aPź?P$SXj8HB3 I9h!PKX5y|F>v!DZ Rq<jx~JX?|PC`kWxX<OBzP(' ƚm``Nb~NlѺu$qRG{TOi qs0Wڵ+bjnY[fg3/]I-#,Y"- 1CB۷gdOQ? +D+ƽ3CE5sJCV@_Ff>,ވ`c $ѱ+% Y8:LXc!h [k=Y5yEr8ؑd1%M`{Sw !:$l=7"<˺YPŭx,NfC"ذ<eA`߾{!C2'?u֢fvuRޭ(&Сo٭ZQ֯(` :w0Yn f/xb$z"gg;w6Mʯ@$`PTP_9 EK'<6#ֺ!PKm=. O4t"%A? yX(TT i*EWS#xELuubW;+lmNNknY--˗hd/(_:mG+|wd*Htnfvlo&mڏڍ ӣΓjݷ21d;aI ޾Eu'>KJݬ6L6ۼ U` CE-=.ނ$ fayHZ.-Ƴo 68$a" ]uRX Syk\#?ÄS[+Xu K:`u[hH"83`* 0܈Ze r# QP"JҰc?=փD¾c& db (+=<XQ/FZPcG$gfN&N:ƍ:,ScϞf~S N"J uXC9f% z sV ˚qǗg5w46rcML,IǶN} 9sDm33Ç)ҡCz/_^=Zj1_[˫|VxX:t5(e``Xwiy9`q=W9 -VṔGp7)EhVꁦ`iK`& b>;0=g J@KPĕ()2*>q l,SBUG؍{€//ol.ffCmPފ'{FJ7 Zeڶ)_(˫G5*+0'q9K:!ܰݢu}ߖeX" 9RrJݞ@X8KYqvDT))U# iiU#Ǟ<ߞMs_44oTj|V{w%',X M,Zֱ yb i^o} 8yŸx-D8|BeO`,N= oW_Ņ}=EllnL&l1\e" silj4u  !`AkA\1~0j8룛2KFJm .$~L{d={ h8y1yglllddP`8(!)}ZVdm-7y2Bڲ%`˖꥜άkD!vUxҤչXy;z]r Igf]D%4'ͯoظMz- ٦[mc˛ղ3~xwZQꊩZ-6ZwSۥ[$dj0[ļ/S͙SIz9M/uEoij@ kj;`rӬ8Z&F/[̔çf&LqS,)}XjUBQ='T812"P8x 3 ޷n}E~=n٦Lv9I =h\볠؆sa0VBg(y۽CvL׹\C=DCH|eǐ>Y@@RݺVÆ}X|K -tUzx +V0brd2n(CiQ`Yc16JN\0{Z!i֯aI|ÈN:WlA}Lf]RO'¡/nKl$S8 $zMZ3m'=OYzAsrsc<{D91;-"` D1o`mlS+-I₂t777A{x 4tKjpذ/.֯oxq}`@#xorCuIdf)1=KF3\y {BPۀ IDATq|/O;[Lv =SV?v H׬vܹ-[>88hɮF9,mܤIVxzFfd FZ7Xv&e= ib[i:@O U }STݨ@"mbD`Yj?XČĩڎf6D)X uId ehz@ƲS^ф&F3eg/כyƮtKF ޖ[8v.NzTQ!6[uk~2G:cF-CCݻS*sSc(45mŅB`РJi|!x_}~Ee"*)[nxs>kyFśs^9J,v ^/cHرa#_,lQX3+÷o45[Xp'S%:NΛ7Ԭժ7`$dllT>e5Y/;IVзKǰ55}M,[_!Tn412,8`&e#x"m (ĿKRQN/!'Is+ w&L0q xxiX-+ѥ6rFh]-ГjƆ0n9Z*bjDwȢ?:ux#u\e榦ž=I'NdHرqSg%KϚB!ݺ#{f-ۭڔEkR eZ=t5m~|%7y\B|&K=\^?B.G_yOճrwDq;a`& t8/ʼn#FfYǎit蹒}Kɫ]#ZjM3JB %5]wCvDf_C{UʧʭPӻ<- °7B &:[\/lP V+ʴ8bDJ0:tp Iؑd?&TKˆC8\v4ǥ^m]0el I||ٚ:7l xqԩf{LRV;;پ}s?9w Iqwȷw75qCGI;?ɴۚ;.B_Gpt:/mE-َ*{71ѣ~K~8q"l@CCɆ (FE~]Jn:\ɓもTu铵)aDxxPrP|GI-ga^P(#\*6w?- Lh*ޤ{ BVz* %{`t,)"h)6{ ('C7 \xiEq!ӱs+"ϋxж&ϽIb93!(M"xfyMD"a(ϭkzz0CWgGd@ÆTj\zLf**wt$ 7W35t ='Iñ/^obվ/w *8`ۃ_{n2[w|P?G$0KFEnr~e2!!{Oǔ%$({*7p cb}޿{RɼytyDreLڵl :4д$$ҩ-k/Bb`g*k "`i azksYWQWfhN,Ijen9/hXNfH`qoTXI0"H9zG)2%@#w"ZΒ'S(!l&4f ?2K13b~1WCS:2-N; ww4!$!C <=^нmch,rY%̩ 8<ݡ=H+T~K#s< tDR@Myrrs#hB7ӓ R|_o7Mt"cF;7ng$hސ?Ґ*l6fM5k":i``rzVC~8hkkٞ=u$Ҍo5^=]ػSSl! y^T*a6np&fL d4v=?\E&aE7M,'9.oۮ M_ASDŽֈcLq,|;P]FER(kd6FL/!܊[=!, sI,=JXpǁwkLDeRw@ǹ(L˷Fsf+L5 67gnzuk,n-lRw¨Q:fd}W$<\K{.puuPljK΍ ኌ*6g:qĐ~9} Hb9tʃtr{zɎ!z1dĘ1y'Nmhl,ݲz+WL HرEwoޔ;:JLɚ  `RJ4oC}ϏkTj,D"Bfxsisjs!WkzJ-2L5+`$%XP`g b SQp V{ s0ؓu9s!n.0[ڔ ^?jXhN[ۙPWAQK/+P}8q+~..vW#yxI\ڥ;bi)=xdŊu"PkWЁ! +V4|'xFV֝w3xXz3V/ǺkLiİO{sT)D! Չ"?ՎףCFhc==޽ygϮP\n*~R)Nغ+ 2R|lr L\M׏i׎>}8vQSFM>) ւV4WVLǰ!REpcM"fpDhhJ6A,K}%(١ ?` N@p2F"B'+2Xq%s X (f!w9˗m4rNG-2xM}J?쭹rCl&gTf`_?ڶ%:}ɒxz#GFEVhbh=`rY%έ $,,7ٖNHǍTRi ];Ǽa.uŵG'k^jޑ6ND(oΝ=}\-۹?hbWrcȇ^ i(lo퀛84T/MͦN :uʺpZNHgyyы[c2 YŸDm"yX&XS oPڊn;V{#M\$E/0 `Q~*M5\֥ .JM'BSXS%R/`iq$8 ?9zvVTcI{Syp-/klnȼ#͆L톳|pF;DS-9ukR YZ]|֯HΞeӦCfԬ~hzߊǫ;v|]Z  0@`o2rtLp7902 #G@heݿY,R Ge];RmZ V,1dItfQGGV@8pnMM9:\Yre8IlƳYjj*{"ȑ/Qԫ<@(M*)bS_PIUL7qH|M6{mBܡ3o&TM+[PCznXCCjq̘[)~kn;5ke2a eVp!ҥ8Lػc7(\`h(LhZ\&( Э]d=c %uj0v0hs)RVT8>=DBWWeY卡1 (n5p֐nF!p60%EdLpX@{C{ 5# 5X_X I. GrY2sLx/sbTԝK| w'P7^/Ful-ޢ;RT:}6-zaY<<Ǐ][mیSY߿ U=ZFg4lػCWW'890$ƌ5 ,;Q.!,w Us{U$X0Ƨ(ˍ;lonʣQ~hPw|ypOw%֙eHbxl2Hv|iM~jU'[;9}J ݺݱDc*:Z<(HhQas6o^رq;gmΝAŊ\F":{Vb[+P&=c2;O Fk"Wx^5JM< d o=O#g@ʕٔg W1VGZ/x 㵒ܵ0E  +0`P vp̌'NEn֨aZ0Nr!Qsǖ-gH~JV~hƒ-[\ri /vbغu־}SLQ3xG* `ɓKPq늳VLϋ/]96iwPvx9?WuK\R!U<|WX!1Hd &̂Hh ei ,` 3qO[Dл8%yIbM)Õ.%0IX4fF{Hʢf@F^,g:J(va#P6AGB^bҬC;jeN}3 ͛]̤E4Zԩ:vvN [vr+W6nx{BFJlSU,s$-m^0R Ry$WM: YVidhX\qi}͹׾*!]m^WtZtz1NNVur><)Cev}qP\{XXSQp V#r z0 ik@G<̤vzrNb +ڠ'a]nkR"XbඨEFe 8ww]h(J"aB X 7`|9eKBZeQ 6Yqqџ? <Çr,i|`-CCɺuKI_ϞeP?~<7>" ڶ>黓]%~MwsOd_BAQI?.lwZ9Zߜj+n.(ʕmk{iO'||;%E=ztA\rJJX`)ݖ'sNۘdQw@fҪLY,E"!3Yjޜ.]HLdhdIa&Hm"2Rٯ'5h`m[ A`ĈeS5I-Zx:_}ٷe>uz(OQ}ף,D1n߳ғUj!,S+?Zᜎ-׶}bHR߾۷owTcG O޹}QM\RInё5e=zdkc.agY0Tȸ]˶+\;'kzFooCj9k"2JDfYs}>hW-L=1ZC03$ȱQ`UEHB$X,pȌ8K9$W2$<iN; . a=Miy: > )c:ޔ;:ML9a(5]yl߅ 15e>Nesͨo_dKXO~A`zgkk17fj_ܹɄGӬYf͎yCJPY-rR9wHkW%~ѻn1hXHd줿Ӌ! *oxgat-?}Lf$'7V-mr6+ -*쬻%0vlť[Zf!aqq 0o/=VlF&cLxE"atgE&r'`fэ1xx,oLWC1dHOԶD!2$sK&@ à! 9ykS z .b6wUTG)Ȗ23#F\-B%&:ߜITWtuh6QlwYLrm۷Y.?|jų1,pLcL~s]BpZag*ػ;^=os,Qg;w9;ݾ>= ڶ=y2eKӧ放:~<}2/_?op,A]ˤJS%_1i33o3GiY+jTs#. y4TSc&OYЙڊa8訙Stp͕)HfpSوǕ5JV[0؀/@s_ ~MW` 4 gR;、 IDATc6 ~ƨ4xak\KObM{R%,Hfݩ"mX EX63;m$iaupϜ^VH3o1WW^fѢPس\ػ7yX=zXwl' ˗W{6m|qV;7mzݻM|h7+@-W\Zm乿RPӢi.ѩן.2ly"߬vɮD/4S_/mZ-seǎ&&cvLsgo>ɮ֯8y2RqsN_oѢճg\TsΈ)x e)~bϢiփSvDzv`J2D:}ڗc07`o-yʃHW ӗDfN3"͉PRRJ#T0`[Ix4_9; t+wܼSNhP 0lD~0Ԑ*jbdnȱ2`R0@5uF56N&\f5mp[vkZЫ5JJD–i/diT_fg6(if=YPlzK`{rc^]^Ÿ+r_.==U={׵<7m6=̱>sV@)ѻ]g3mTraBleל[x4*'sE ڶU;UNysܹzzVD{QU%ӝW(5G?|& [)ק:JCd fBR 6G*aVOM$*w@dIM)j<>R>XNt$YdF<\363(B,Sه5kVfM?????5k~_{4(aL0"[ Lc'FjiF)' 8 f ٸ{LF4n/ȨQ:>`.:E}Fvm `ؠW>6mb`nL:u[8ØvDŽ/k޲KM[Je]Ԟ*xFHcſOܶ9;D֮}ʮ4)cʕTSKhad>}ƪ~ɲ[mWyS,ݲ"{rd._>]7w FȪɇHTchอ( <&!2fAh5Fj oR-UGGf^(̢<وh/K-DOį'<{lڴi+W>~uN8jĉuٰa3 :RCOL!{r VthPhS$\s*S &!o2%uq>0^"l|#Y8ok" Q[բyuدxyy ͟3]jZAQcau"ZT{TG=ս{W>(Yرo6/Z6:aalomxpc_~[s)/@Y=Ux`ݝ 7{ש-h0FSdP}mV[qszs##ٱc6 z"Crz:ra.֮q}+W&XY[g}1nҶZ“i8t=g11b4$͂~[2EKjvr# n 6$83=W, #T7& Fug oD&-}~n;vWf^z9rkWFП(Eɳ$& lT7 ~E lHQS)A %&~T/^l11*WrOO1ctɈC~>>=?;͛w/|yK9:f͜V U"O3I)6mEͲe&envʴOTmrG z[^׃(~cCZiӈyz}}:urܻ'M޼I^y|;ޥ뫬];"&F\b@_P*Ӹnz<<*1=p _0Fb Zƙg ir-jSTXǽ g,}G'G"FE|Trߛ1194J  5h:ArWaq+1;;ΚU^wpV^l6--Onjetf?|om8ch٤)bvkZY!S7L:ÒBV:dx֡H+]^)kO?N*:p *9YݾoB۶U$R}|w"9TKC*'mRI( =%#ЯCz-ւGy1S"?k жyyZ3@HբP>*idfYv#!:BC$F0U xem\H?~1ce g_):[%QƄM W1,pWX*$^>SQB+#iT}P⽘/h]ŷ0&׏ `AE%K#F.^P}?֭Q zz6\8ɚ5~n5tv΋Axxrfǟ>X CpgG,V&I2ΖZV/! جZ;5;W-ՙK&L3wC}}ɾ}-ڷt]/;D=b|VOn0aBޓ'˖ݽkcn&4k˸dIYK< \ƕlƬf2) SSӔ:g;{pJuHAxeLeTlH@``гLM )LK`@qs&5zd%@1+F@W2bǠ6Eo%&&|x9wȈy(^YYװ!JR#F h6*ĢE˔1x qJ.[VE Rڴ[˝`kkxBJ?ؼU {TX%EyoՑ_L2/ wGvETB^ jO>wM5ܗԛvwYؕ R!׳+܈!wë=iܹ${6Ək2ϟ'Ϙ"lڽ;i4ϚҴӦenĮ`tv,?Cj~(*Z[TL31?"".r0E MdWuԛ7M7d"##2O_o4(R03F8J䍡=t'׆R̉deic#9y2e<ݖN&&gt9uq]σq`ggtb-=lǏ_A ytvN2߹ F`s̛,!ӏpreSTV;!>E򻦻Bk̑CeRCsyldnM^#rL;{Tض?$6xzI|rR).9Y=pmVeݯ^)V0QC/X}L4=h8=.1X7gmIr<}`I&m _s1Cf֜g[ HUs•Ls\1d\c`!у8 \G2F?~\R=gtRpb Vyt0>aj%'0`Z0JN0x|5\s}?Lʶڭs~wdR~G)cu<C)@|B2 4^/[kVn8Xҥ!n EP "Yg1ލnfBj޼G>ߤocճ?s>߿;F(6*UKf-/Ξf7idwrN \ݦmG oAtrhW'xh[DGe%u#sUeтD"u6SZQRa˖&=zI^_ztb2s|s*O[G/^,w5{GoݚTLG]GwUR9IɜAfwTJ|"{=yx(|Wa x2 E1k}A#GH܎fLi<+S'vgOÇ A+*>OO\]:5EFOߺdbWȜMH~m]Ef{:װ+`LTî{y-4^8>/amcMEy{1JiWkñŊjF\B`) 80a+ F8wZ}O h33/z{{;;;;;;߽{… i7O`>BIP.DD>1c \ E"vJhqu )}G=PG* %Leq*x?/V^裹nvvWkd[6|!Kyέ)fN~k3,`hy;]M͚EzZ֢EF Qr֟jٲwÆ=һwK}޾;?\j?U;Wj{~Ttp7))R7mjbeeo!Ctt<rn}75MHEe#nL=bC!s$soJ9e;o7O_ʮ^ƻzTtYUѸNϷL:}+~_u^ Z-N^+ ;P++E*}&ڴ)bŊ--]"DG۶5̉]m혘`A&vY2h-7zĄmSʮTjTî4ۛ6ԸF(Fi3^} ?A.rxɹ,RBc0 + ;OSlm )yJ?K|7"@NB/&a$iu\Uƿrc1uElDEHf>}Zz2XGnT0_0d$m[{{&} rCMbz6y]mQF{n@οznF]?~U$qط7=ZÊ=p?JV\@+ Z0Rǒ\RrU$32X@adaI,A{r!oVT_` 4p$ wPC.z 5N b`)2GfLMarѿJ-S%NJؙ !a c,pl 00Zl0veiD$~ zl9{W2}Q#LAO2m;l&s1+DaFHSۗ*-_^13:'d׬#C=ZVHl+WfDhI== 0.fle%Y vulne 1Xokuڑ'6+#(e֧c׷ݿg#jѽ{PPbFgr!v|""4mژϟyi"E^ݺeb(Sիم`$jFBV|"}w[ Il ⳼ZaHNS3^4iBH{gNjΠ_?Ä1hPd/5!89o5th~ j:wP|~'NRiu;'Ą.vBUU ۍCLϊzj̭6{ՋY_GvsltM2P2ڄGTٽm+Uɦnǫ۶=2e,mn`#T:ݕs)[/^$~xtW*mmeWg;u+s@:}?7ݱqs6rF"Gr҂V)evJsL.xX5=R \ɬ+`0҆lqU[(cbasA( ٟ*q}r=&̝w{ĸ;Xj(tD"O^wmAb10 l㭆s5i[`g2۽W1ςfelri.sL=a2oI7'QESS^$Msh`,rq2G1rBZN-Y*2$;wr+=;d !:Zղ/ 晳4;k|ý>X9SͷWtZ랯ڿ>ow; 4BWѤˈO5[VWAvAS>獹5J 3'={Պ}/o|T+ O 'N,Y+KTy`ח/G+d:[=cF4ys.KLdCq٘͞t2z!dS• h6"yL0Tb-@5h$4C6wKx }u"r&Ͱ"vେl84#!? (#!1+ +1P;M<҂)eIrJZ1j-SJԠ僱K8jc$[x&!ך9FM#6.ݕ~en.mf.I89<~e|ժMZP*ff׭ Il\E Z Fh>;i?O k/ڿ׎&4=q(/Wƌ6oK껣ge_į:ܷѿ¼UH|~k p+l[Rk>ZW('~o1Ǝy+ssSZe_P-*U^͙&&S(ߠVӯ_d|4ȨMLlWS&=|ZGfDWjz$6,% <БSe'7ߒߔ5170LnD 2VP ~f.$R F4$WL.֗<M^d?A `.! mGn{ IQjq6TOqIz N<؀ͣ$M(lPېdt7Tx$c5i?tQb/*+E]]!e ==UN/nysy`Xϛ7?_b@WWv`ʕ|}m۞Fr̊kd\Yn|ZntQ}&c3V~GUxOcr*_W 1h{6ŕ'F~~8nTn/=^Wa ӬB?3ޙuq W?10qqiY緿MHvr{UyǍ!F̞({w $-Xs玪@%K2͊z?ftٰ(}a?֊Sj dDkZTNO;JÀڔ0|P3F0p0X3>/IƘJwP)ʋl $#L4J4{x8ߵ$ICƂXMA|Ļf+w x|r!?FPP-p:AH3̈i)㉟v4|MxPr5 ̺œA졻8(^)ul8ME{,M SGQ+KV>f[:<@Yx͹xF8b0̙&gg+իĚ5߽SgŊ؍dj?;;c)]ثWѽz۲aOK2.,irBZUpk"w&}I tuU?m$u9?+ORo\+m74]ʻ <~G}ϟ>ҿ+ 7OTJnn1M>OLk؍άJ~ Z ]j&&=5zkׂʕtqiimy7六5LRtǓIRV51<ڴ1s.?b"rI7(uj_ 2ɤ\|6џ.Sb7`'hҤ@NGă9/9r$C͛u*TȜ~~5{MS*EjF2^*zzR:qqؑIrp3)iݑhUSi^Q}_];|)$*p۠CIg hF_]C9SC$<@ 'pid&V\5G1RZٜkC:v LrjW&y߾yp՜xW ];w-Z[]9dm^gLSBÙ9鼫378x#֦R QR+`4*Ȇɖ] QdꥂLܤމOT>owuFHLuX\t"UXfD$``9DLuV y̳xԵ)1&D7S`}|VM:؋x4$qr'(e0nE"-E6#Kփha rK ;dhi~Â3RRV`h@204M`hZ OBVX-X4Fu44͡O)2ւeȟ>UϚ~Uӧj4WWuncD ._nBBf9C7ovTWQ?/GYa_[gP +7x^%v'Rn! E3/ҲJ2(~D/=ßW 4 4;T5e30uO-\k{X}.. s3 6Vݩӹ͛umՖ-yJkזmoJtɓҥ ﷗˳Lrݺ;rd2-2{:sW5.~A4z[IϷ67x!aHA&$%c< ~vzzk07u!E ->"5;aJ=s!o9R?Jy2d}|#.]̺tGER8htG=Ot$e ކ`~ @!=& WTĚH,4%425}E"n[ˆc};u -^1@1+Y=06" ^#P}^K__rvΥҥQg׻et}{OG>3|V|.}ekkڮUq ?yd77^ 9QW'{}~ ,aT|/9VB-> -9?<]+{o3v;C߇TZů'STӭ Tt?IR/{˩JuolgoO8oiBnrF ۷:Xa9R3 SgAoDz2avfz,xtx@FH5>xɢC$$E7|E5-Oe[ˁD7Y Q- bo0?3LfOඊ2InlH@&XC0[ctAp~rSmIiLLLŊ 0b`ݺu;w|ǟ4P֕t/ix]R7{n(/ ɵˈYBt5{+ FFqCɥTE)(ųg p6%Wj#pF&ѕm͟(ymۮ3ș\Fx̤@JFSOF&bTW>iiQTi+~ƒdӣ͋y:G$$$h7~~flժFW02YLÆ7[>zjvp-[utkZOA}ΜjhV:w9yet4Ҳk^V񥔄`[:!!IwЦ}U>&ϊD:s29+-ު݌5U.}+PW:o.Zćg5?aJUjuŋ"ELOnUݧw|;p#VGŋC&Mzkh(tɡfMlfX2T)VSnߧ~'TjlC_P/Z-wR%$QEx[Ԯ8@ ~@RzLMWQ81Ob 'r^$jR&(°!C-jb]SX'l.e -ct7(0Bo.=XT*)"ɑ$It o| ׿|rww]Rj}^$],wys w1.2 FpEXA\wI(q-ޅuƲ9 }`űT:p^A,Ca="TLWx9FQ0i=GҬgǤrGob sw9z)Li4=]DG;6'e5CΞiӌ*j~8+Y$kMb~{Y%ƍo);uٿW g'W\(_]9sc@\+m' 9o ś` m񝩍m5VDǫVi\Xht2yBRwjTqՐj MZJci_ j:c0:md;ڶ=PK˼yAI,(S8y2C_V]䧟Ӄ~]Y~Ly9Nl,իl}$-GpZ]`n>f\/OO¿(0L8ߢv Eg\|c]4p7 #9LidŖB bMq9VDHx %5yv?5gi8|@N?a]ь8\~M\K*I%IW~ Ɨ[ƍ;::6oyܹE]x1%IrN(՝q'e(8VtUyQs# *6Jn& E)vP RP&? ka%"蜋CE316x7\λxt+ZzCO\Eټe JHѼdFOwb V҆t+63np?G3wlm3~>M];2R3}ܹ &Mn+vݻr64`۶gC^S;lT_WI|gZWr}{ɍnlUyšRa$!$IfYDYM.ު]-p_^͚8tiE9CA={Wᅲ6-Gm[ߏ_Ylv6 (d:kV&L2ܹ19(p5z4WjcP0/1M93LB.n -0c~ljN*(*]%wMH6g(K LwۗS(8'MI~Fojv,͛m`kXvSSPSMMHwNо}˗cxƍO䰝g[/ 9|o v֬*۶53={WoϚ吓Cbbm}_dÆO׮[>uk;s~?dppŬ%d^K#Cthj'*ȬRq ٔp}[0 u^Ȥdi)b0;Ulp&c J,6*rbb-0kcVC@z;ˣb *pSNj&P~__Gs棞ž2O5;R e+Y^Źsk4ԭVei Lz 'O|0e*Gyxa&/fƬws9N2K>[2uGX1.Mrx܈ԕZ=<<<ֆ9;nnnޅip0V Jv:U>2 6ǡ+sdurc LIi0gJ_Q$z!!5|im QXoUI_KF4ZWu@Ry}q޼7J*e*$ !<8!K,G21 KBXaFDM z){!D@ H] <=XXe* u/L,U".NݣDž' 6ݰn9j{ 18E\a(l&'q?c& Sۂ1^5X*e=PX(#"#:dʕ,Xwcgei۰.Ϋ@_T㺓ΚqRsCfI5ntIB;Kcc0UԳLNFqVk# װt`4G ( a2KH(N5ʐQ>ܗP~@fk| V۶mZ۷'pd,pUIbGx'PIbbm#H)5b&C zI3 ,)=q^xǰBnGe]I{z@jr?anȡ}jcȁ4Q$>;z,6/X!\Ν~=OgW;̚eҫWGv,,t.jh([>tǎށ][;ǏѣhdyS2E/}gj,($VXšwh՜PҮ׀Sgv\}cm? ^x~s;kbxbFl_btҷz{V{;88Q#7|\iW'şDXu;ޱ,g-ÃU{RŌ;f'Rѽ{us}Kh4LN:1q.EWoY$f+$V 8EV4*w!bz`aSB܀}> !1cűĒjYQ'mH=P*Bt°--,>^(#_̎qW&-*TOD}:`}|  * {.s玕uvƍ*e'NNg~nhslzS `+VxH嗒_x w=wȀ*Skg@x*y>>Rr=ۺ`L Սtw*_յyx*hk1M=[\G';lĈlldwX,lJܺEJE}Hl(v,'؞iԘ,eZVS?F\-5b/{R I(>m PЯ;*xǸ704iS okp1 :jW6Bۙ'8HiCP.kki !HD-ft(/γa)Qa@ I 'p[p0BҥKw-TPBݻwOzWIÝPX7@љ\CA|R > B8L$"VVCRr9;⸭lC>]nDz=@W[X./gnNZE chDȆ.JP35v)#7ت6R3wKƋmހ1Q+1G'N~}3&$n5QCOӹsDbbv}sdeTTN[;;99U8>^ӮݝG> [H˗ZF#uurr~ohvKu 6oiv[ҿ uQTf˽+JtUѹs5r]&v-`A{V]>@:r2S9mC_;3zWԅ}}!V~TF}<`aQF'칊k1`ul]{~Ouё'*(g@Ɯ~XZ] ``)tPC4Ĩ]1,|3A*Dk, aj)P#,g6GVC (\#G B8rHB9jz1[)F}SB*y`@yF*Q(c4!h_F:7F #Ђy&%6)oX 6"y 1?Hre:ˀc$y2}an4$6@W*ɃD"l82^iT(8$};&&'}t WrذOYSJ#ľ}_fŊ2]FE[u׮+IcB1 ˹ɹ7w'w~ \T&M_KB0xgCN7ov$ؿ?bժwҾ}EΟO?^!Ilb^f&N,X@ٲGdFrv4GeSJ5!z`"tfn`ZkJT}x,",x&I/ $\MSژ,噚Rr,(!t`&(O.CM Wx+GAq=G%~#jQ (Brig cJ,&lC^bl1x ‡M#PP.=ęh""{-ģ9%mE`E/QB! !ՊB!@%V!4BT*'u1Qk6 }#$&wȽHE.xQnPS6 ڊFjJǏ@|/u>`{+޸ˈ~ͰO/D>zVO~yiwȜof_S3U8}"9ݻ u:HQV"R%jT mmE!"AjvT0D)TnNQ4rI%X",ψJ!B]<Bja$&B i!E/"NUqox%C.넇b8>DltBVuNwĝ3?ojv0Zz".mC>)N: =bb4Dl!. !mnLW<"!Z!ZP[U!v B/N(r0B܈=ax_NBXwR !PiDbݸkK$I]pJ)"J5*D~b˹tW7|(QD}&%ZѪѾ}_(|:q"R&~\T3"*JUUp^ZLG_LMƶmO&SFF|!~'ͰqH7M//EOٳ":ZS׫gk;d#@/2>T`+vXPEj+|-~' ڊRBo n>}ONxyly[lpBV"p+Ss==#k]@I"N P]oEP':""6;E=qI8+B}[(B7I~  ,") isמrtn">2 `l' xDoh 04#\˜Zt ^˴{#ڡL~ 1^W=y]Qa6Sj4o_v13 $!c.2 >{ћD>] 0Eʺf~9Ȣӹߛd'd3t:AMoOŽey09ߕ&q z|5&0 ލ 4lN%w꘠+uZNЅVvDx.ۈg+fqN~y+[qX9|"'llmKO"4s)ӆ*8r~܍_ }x>`Ԇ0V; 2>J5/v%r L'EFeyBM$%ӧu|)Vd[zw#&>Ddz7!s˦s]RTa:~J IDATPJ2,YRJ<.1yr;Whݺ6~U !TVzÆ{ҾmۢoiKP$n7Y";V|gޔӆuwZ󥗪ٰ_3NȚ85E,Μa`ɓ1]1KZ|78@ͪ }Q](W2ْns-QW5wwp.{+.u\ Hp22`B ĸ<`B| L/XOdZM'רz=ٍz9KrUKMl" Pg' ^2 nr(n!/ǘUh$oe%*%=iI"r%0"!Tfs`6{.N h`T)dec;ZyϽ;U-YywC|Zp>K:ˤq$c}YjWTZ͚ŁkM=33&L^ƭES5~}LGr8njxC<~` RtJp4Ðd]t!?K00 q*6'zq1dЃ6$fЉNg9pc>nNu^{vjhӉ`$/q#l44`w-#8炡$;C2|׋ NLxͷ/U' 3>h`fy?"r/ftoDR/<>)^|`/\ӥ&ǂ0/w>2Rޝ#Zڕklh5kVY/S#.YR0aB,_>ztc_߿fMl<,ܺu%aݻIHŗ'GoixxrŊD۶ hi{-;~KOW{?T+T:u²W׮ }?R2x/2ַ=oiCFC_|!<ٳ~Ρ<;lq ;w7aĈ/~Xfggϰ={nq0vlۥK;/lfm^.,Ufښ-[֪u0pB&+WW8/jߟ#'={>Vŀ9p8+ G^s^6̙*С֛C8w[3t`>{*.|YF|q".&rj Sý5`hW% 0(ѯ;Ox"wp~4$`TH5P7*V{.'Z=h0=@lIH&u'9IiOfvm%O>`e&SփjSٝM > NCN `8IY'4kIUw}r8eJqS~S裕bc{krXA5joeȐN룏vw:>棄u0{V>ФI;=|=n txҨVV6nI/Р ϻQ"jT$g)3߀&'I_d`J 0 Q޿rŝdnIN/s~L'2uk?e$;__]%/ 侊яJwх8P$}-caw% kE;RÅ~dkH1(}0'= |p8  D J64dn9:ּwSǺ3Lۓkiv;pwѻO^oכsXSTȌ |2(&M7<=s~p/*,Us!ԩ?2\2Y}M+!-ٵߓ&EtTqٲM7xGODFf_]^g_enetJZ‡u8ݟTGRXz5w3ױ43qY{u FҰ CϵRx5Orvҹ*Z~#j WI3|%| dk dP4I*Ua;Mr%J=NeehETXz!ryu@[z^dcTC׋"u<_%[7ʁ?G3!}<5<-h!_mq#RQ!7OvmY9::C+WkZ=ӶmsR|$]X8v,{L~T)=ҥ8gѝVT=lXᅧt \`ٳz{\.:eto*Ud1CL"=Ry!Pxdީ:7k02>nGk ti@w|4y,ɬ `dCpnnC {8 Micl@/.q)[7Z|x\Ku__d `'[?ǧM;ks crF-?Gʴ3l.Yp%9_`͇hn')_ s\K|ӏc1R߽)c<Hp2w{s_B%8cv#|IE1O6"pD-~U :1x.lCu(CteJ*OU!7sg5ڪ}zۢ(4g HWVm5[+DWYN)2ЁVSuʬFS$(%wIrJ'U_FJRKKĢW.r1yMir-Q)kCW /Bur7J9#KO#LA?jeU XvMed\ӱ|aX1*"VcDzz*g˖"'_˥:`{Ł5pVF_6m / YzfܹMZu Xz]D7HNvju>{*!˥nֽ{|j5O-P:|$j-cuZph[#q?`=R`ӶRInc\*}-W7z+^+E5Zl=.XT~K¦f1JrI ӽ%řddIYruֲlк|lOS?ԜҮP\\jY!̮?JIeUAuw(u?w!v'iVN3ZfQF3?xd(cF*4BGu1DAi:,Hd Ya\z+$%Jʒ~$v'RFvIڐ, ث($M ,ݢ%_*ʥO Ad!Z4{ھ/7|J+3YT.zڞu'ּylz5W8X˔ٻwoZbҤ3Fr x,ngϦoFԁΛ{FkWtݺ8cΜ77^*SfX:vܑTxV(\;kzrֲ/RV\Tx5C5k!A >aRPgajwAcC|+,R*'BWZ&B ʆ23]G_Pu¢Q?EpaUH$etgɜ&I$? iS)$[EF)ilAl`YiC:Dڑc:3fIҕtD3, ީ$dUPfٵp*Z->}SRc%zƔZgVN6*U [5lXU9"N'NӢ ؔ²D 9頑'}K 4 B6d`01FaE>w4<;̊54dr04xL+l2#4!^ٷs hT6~IlMeO^KY*ե콬hKR:ǹ3yV_DOQ qo P[,uKi|F?X O`dnO?r4`p=ڔlmeHsom! `0`̝>#UĴr "ƒ-oٍFf'+sgc0lX{˕3.^\tiÜ9ӧ!`42wn ٲ}Dt 4/? ̹У5=M144hڧW۵+e矺/A ~2hv5p][>]~`чf<߳gXFKK} $zXQNxRqNx'ҥ .|i!lѼPohOKf+oxyY2䖄Cb" {a.xfNh+_s.ThEjE^&@xu~mq̛ ~uUԲao; ߢo,2pIy(ĜeU+1g{hl`C}6zuAx{|i8"U0Z/%FP'$ƾV"[n009Fe[%jh DJwUf8E8`40yt 5U%:w |C `t/+P߻yw?a\]싢^9>~ r 10? Ipw'T*Rs| ޅ{RP`;ɛIc DsrnvRjoe)М$gc^,.~MM`H㿝oH0L˩zª8nWlm,B'P+<\Q!2ԌTe`YQHeמVZ,iLPt\^tUz>:[{Uy_Zd7bGS=MԨ4j!u K$f["XogKR ~YWXyt'j\iצNV"jԈ)ݰ!vx<38UiK&ϝKcY.7m߾K+JPp `0VDFC8p#np9a Fؼ ڵ/]j0j@:r M&UlC =/9~AytgzQOfqK"Tݴ*K CWw@Xb.IJwaլKUDReR($늗)gW u%Yti.; 9}fveXE4ɡ}hUP'L1jCw;MrTbdԆX-*蠺][|\(n=Ut~*t䚨!2/T?`Y6뢤yN)Śdd!9d*G (js4>%ۥ[Eo)zs0?O PJ6wdj)P"X].=9P鱷 g* IDATR1Դ:k7;0>^ Ktݮ/S8G5:u*d?AZ͖٬&ԪI,>;}„%(#G5[fG5? pҥ auڴ^ ԩi` & ~jyxhRuGK|L \C+qɪ_c?@huEz-b_U%:rg$ZFلU>pTѺ5*sg!CPڮ8HKs>=-ֽz>&6nLy3U6'NLM+Ӳe,'sIpp!Μ{_.Dob LZynEⵉ偦|ӳE\xIp8F7JgSxAav$Sq50ldP@8&\0dwxOw)ߘ1TbY;D޴! :#":.DM4K&C)E4-MI?iYufv*,K*Dm eKڡ Yh%l*^RTCB#IiR:琤E ª{u4DD¬H"TN_>?F`yO%؋։ ׉4q0ɷvX 2Ig`v{Æ`kNʃ}}uԨ~t>,~~+W*2ӢE˕Y"U|`Y=`g}j h%gon+XV]gOq}5R^5jB&80Jj„_E*=|vItcG>xSoj+ơDlE9!*?SQnJAwXC>K0CTMxí,*)Yf2ɶT*>Hև/^kS,uBXYBdȚ13:sD Orltuf|dJQ g- }MR%dJTݗkQ^RL 2+Ħ㻵;TS4%d"Bd`YkKRV{ u%MVIcR+ i{Bj<)4fVAGeggIM;((SO=%Pf#/\iۘ1ŊNͥ{(yri`1,|^í-[.2w1w֬J7.\Hg=;viǩSE7%q_`/^5ݠ ;]JzϾ TN,|; *43QDgOP~"XQI+_H?K<[5Nu:aї-NY-]&I$OK:&I$lOKʐ3Xd]XI,Z%IE^ֲޠ YBM[, ^wʱAoY|Ve*h:d+1Nl2%kQB `]t=zܹs7kV$'%od^ɔ3u!Lm:]d(xFڕ9[r^K&D&i.V'+.3:$,EIڤLlw*2JNI=$$INU6r7yJXDa¢݉BK/f;ϖՋDϟ=#򑱜.u*tAj*9}V& Y?U`@c^?f0 ԩŊ :{2s/xy-/ξUA5x =mm))E7 )mu.6n[Nh[ReˢJZ nȸ.+'Z~=U+l<q*SFѣ ik -dtYv%Ou\+SGD4kUůur* fI'ӮNNq'%)Q¦eTB*'88l+Q)eܫֲR,˗J:s!2YP2gBYiQzdw7ƙ56ȩxwֵRRRի7jԨQFyi2zpX lMwd9*e)qzY#ڬE)DM UZF*APeHڥ Y$8l#¦1ڸulU/ѝ<,£ .Tm̵Dh? R23Kַ2ԠǓ 杹yN.]D<ʕ8qg/c؀U`ewz-[\K2f4NaAto 4zYs^3^{m?xp:ի)V̙"?[7lw)%_&MѣpbUl*LBFÎ^[kC66}1y)c?ͳBg7"TYi٪7O5rr+wrL䠤Ǧ.I]j !}'IZ l'7u|XiiDZ|ZV~]~k~SʗWuO#GX Mۯ';Cw'T,mnt'ݻcZ^iѣ ESvs„?íYY  X vgQ0 }EEG;7۽&'_3r3sR %¤} JR^"Hgϴ@goE%4XhdDd?Ճy:Cu¢W%wnq7RK8 dO1&f(M*Q-[,:)i~RZ U/2kE4zڪKZ6֥d4SXt-@N"|nr^:e;vGonȆ2KC%vNFMLmiUAG'[kۢh}X YPPTeY!2Vu$XA+ZYhO۔$ %d{\N)A(!!I.l2E)~݉L&ᎄ..B58O׋S ޙ*U_JʿQ$]\{¤ut!Nn^'$;rҜ=NH(bU8r$f͵`it7L!zyd Kk/ ;w s\. |$G}ʔjg]kR{l)jccwfb8v71]z ?V߈ 5@V7iN/B|ԫe\#uĽ0$i򘪿ݹW%'*^6NxȍSIɖx\d]K~Wx,!Zo3I4#D}HSڗ2Tt!}&ؕZ/XQkUa=TrdriLDEUq5-RgժU_|ţG7V\9**822jժ-m`D6HJHSMXur*=yNV7C4Ԭy@B:^rl?МteeWeYI3$kw̒+U6ɶ@&IHL%WXwg/e~a$O}Wȸ\݌M6#]Ms'Amʹ;ٳժ[ 80L;`+U*rw.W0=ܩc]q=RcnM%Wr fM ^lW߾b$'F3b)Ze#1ժU,6^tdI.}'9$W\an F ;wW~g]arW<7pŏ"TCN-fuHV͵¢(rrrsՙ/)!I%im$}sA1Z,U1~ֆ'j5Zy` 飚eQv}t1N%kMXK%,ۍW vy挌Ϗ?r{V{yyTv>zpX1wʆҦH%.DMt-բ9_ІfVȯ}*4La.iK&[,DeCAPߕnE%吚JH$I 6q-MVޣnKqaQ<mf=JK9^]++O:CEBIc㛪?I[({EAHQDD ą>jHQܸA%˰RV쀖۽g&IJ *ʋW9{sMN;>2iehtԞsNd'yq/wO<XajןƊuo.0'idWoرk D `s?;&\I5._rNÐ!%{׮&O>f^s4h20t%g#7Z^BV.MD!|8L{I^˴=KZY6@fCQOv!+ͦSn>58x!dyi22xio,*A xi^iG&pHA򁏱bp̄$r0Žs|3X3%,иJ(%̝z95b'zJ/PR%Wv/5I4yV9S۽ǣoUliɤ1cj]5'arNRY4oiU7\=.[ [yV-piU?4h~ {?g22g߾W{Ǝwu_^Vކ m.ҥ)3oަMkW!'sqKdתtgt:0 gNW&o,t#=նM}G4jn>=9èjuִa *uom:t\i )HwY϶ȃN?-Z*$kQLz5fHf(H;ݩ&M@i+ՖJi dzU5(p2ShJԨX:(S*[u0_yf+;A &m T+tSUSkRP=SY.ETޑFKgU,j~xG?J9ڴi{ҽ{y5pJ"~ $ 1 q)˒h&d/J)Z7V,{YsC5i8>drA` Ny2}P'$c2X珘-ʢNjFpL6Ys\/n8Y3j'h?!TC*-P-Kn ᾚj-ܴ|B_F(8c+dKF&G=*?G%{;/>=×_F7lBtKRMKrqڵz9&-w7cF=ܡpx#[0K{RRΥZ6)e㎃tyLɸB^:lo5-7'ַ!3#f IDATPsk:n6iqJ=݋eZ,DaD#5IߊB6z#;l&h06 C`&fP ⾟_N:0PlՅ'י r X1YƲ, odW6BPpn]EYs.v0AH > ;E(믿ڵ/TQF *< @ Cd[,Ii>nOr%-&{#mư ]V,?'EӘFrrЂ-pPB`xg-I4clÁ_!7P</~"7WE6>^g0:O:F)9>ʒlYL{~ߊBrzȌ-ǓɡU+$zlsmiqgɐcyt&Lz@VVֶm-Zl5k.H-x=;yfw/ڵ9.ssCثV[,n!7-2`FƹlWhȑ qνz7~P>ICO 2s FFS6)e yfٔHGO2^.:#P?b?5~o1ӑz(X}1 t/(\P'd3< q!؟ Y~von4[~b 0F0"5LbYy_COb LJNv4Jr7)pűC$ա8k$\$圇o609s$&&:Θ#F4h <ܗӼy#F^~yb{pX,8ҝh+cA𚓝%b`Mb

    Yfe26aI$y3ZW`- ؞bE>|;2ҁ1c<@.h 7^N-]YlT[B1\1B(%F_0-sKaG)kQ7ڐSG՘pG/\.<ҭw`nU#8#/-l 7JFgb)#%d92bϞ=@vOM=tDn}Sgd ׳ʸ?#A篂wt[Q]4ML֞=WIgu,l͚ڴ)s{ 7-۷JNз`ʊgƢJ$FG sU9j@j&-|r+ H8i?YDޛLQ?F YuN] cϓLs%N R3Cqu&"6rom(ۀcˌO"Ӎ[2Y$x^!u'wDuǰŸěFjI$(-$)<~z~~AAA7~(SۣGM= ]"e B T 10gA.DE_|QZL 'KXF$&y#?38x͡ئX@jnq.ӎq h ^MJWݔ@=lܿ_FV8qJPVzd2 N_G jvfOyjI)4i RTϞ 7g~&2E23"jwߥ%k;:5z%ZRS  \xoС?8~8Ԣ ?m۷K޹y>j8urj׎8ggWe|/W9g5qc.ʏHХ1./:>GQٰ/Î" -#[s5#h<%N GKVb.~J<'#"}!$16M1dwgQ%끑̷`6`bF~#a#h޶rOl50'r O(C$78fUa} g_p"I$5 qe8ˊ9~Wv]. Kˊ(n6X~"0YXԃsD`J"0|3Fxr coth @v^ XlM&`ǟAa4R",SV*'Uԍ;ʴ{<<_Wrz9f_D` Oj,AttW#GrOżyUO=tV,;^zxԨ'}*r~zdia{\reŸ9 !!oEMkpZj[5{vuk$[ժKF*bX j՝GTpW3cO}„$/Ӽ9:<|OӰ60>5\3h 9e7!?Axv 'x:GVkIsp9QB.pmWATs `-oex › wm?K8=b?!RoXT`D& YO;"}3=̬xX2I.vRG@Z$PlNND,;I1c!+yh  ($8;%":-ӊ2qTz~+\rʴ:p'#=ڜ{gc>V={\u&IFu&^SVdCFC K]nMJ:sƎ){ n=ff_a[Q\Y x%k۶?/\W\YF/lW_nϞsL._}U%Oϒ’LH|39"7c+w75r -<ϧ([S=+G>(Kc>k ʇ.*^di)v!"!;7xS,Y?`lf69 XlfVGm1zvBU$xȂ G"Z\5܍J9 6 I|ԉŞpt (A714qq0N~s+,”0–X˾aLz4[)`cW35]: 42(8s>L9ҋh2T:>0Yh٥n]A<|JDb>B;I@d抎3/+hQJeZD2?v{E7ݴ?5I$??^e^s#i=0##5uhoѿɣIMun//0l0Rjmۜ5j$JƀgI2KMkzs{/4,L3k]s7}}'*fH>FaLy1>ړ>wk#}Z 5i /[Onxl`3!o'" Ŷ8`6[,X?ag1+&J>;F>eNnu<0ˌ;h q/bG!q$J!IJ: .h0A6[H"J0yxKӷЃdpp.eD>) cP&3-Xm؁Y 2nB6 ȠuϢ*z3 gE/w?%\2R C¨4_KIttYxlaNLO'O8 (,}L3zHTʚ5gyDRdHƨQ.⊽u}GرΝ7K6k9xp=+W&칲ġuճGC韏gM-[92"5*Z5k7^)j^:kֹs|x< -µZ+Z_?I2z*!,ڷG⪫H*6n]Nod4>trtA/dګ(uEQ=K9YMx¿ <\{P);Iqěq1Zۍ7!اpo駤N+ثi2_[EnKxCj'$o i!3Cu0 ƒ(ÚMupA߿$lbmd/."J"5 C@pk147hd޴D]Jo'9ފe cW&(\QCB g$:xN3И؋lt؈ۿYGiMז0.R,.Kd5~9 No]MS/h 3C(=^z jP^YbiLV`2̙MNLtm%5ڽgϹ'{ 9Hue#G -O5kNX6DDu; 3aF]}lq.׉7o9;ZϙSPCy/n4Y2u(W yytD˖Fc"Q923if9\ ;'{%" !$@\Viٙw/ YhE}mőrzbANv-U7Л7W4WTyh^Eϔ WPjëv? d+k(YԙllطNMIͽ}Cg+)L8E)ts>K3r|_gfl:@6kKuP3YN{B<;?SxRUN\#l.s_c2DTvQoc[c`pA߿$YCl_"7 "xhri`N7Ƿ1Fhݸf1; LejaX,%‚uqGA)YL9f BK;U¼2¿f!:q_FVN!T}(#*+^WfV"!LI*tp(N*N 8tDÆDR"tٞ{.K24HT￉[|jՖH֭qHbCkHNΞt+ߜ벪^粺 {yJ>Ўn0ʝ혘+ӵkd\~yrb>`%."*}\| q{5-K'Q(o%m/sU^nZtB'gI2Qk) G^~qWYV’`oFkƸT7$㼕^U)~apHaQ9yiR`Х< /zUb`NVj`_ICdN4bwcrX\mX\{L+XqY ͤb0yHI^ɂHI*bI6lpH7c $ 8Ho&EŪPl+9f$kYFhFqb4,"?HT~ IbZc ̩ B$1DG$."'΢W! ӛJ8$8 .h"7+6Kd Cd5B2NHCs{+KB.`rNF;K-X'ˑPl/օݙx 3F/ҽU/h5Ы.KIN=nZE6>*%h4YT&׌Rم\.0,G_|_Y[+*\.ζa"?Wst9"#ݷod4igoCKFݺ$[Ӧ6nPN̟CZW^9aРm+W&cDGg[Q={Ukd_ٮ/4Q{aaEwyyH]7n.>%-Ŗ^@ӯP=XRF).}~Q_I/r`e3L%ߌцK %tb{ vB˗4.*x}8968|? ȍfrmUac`'\/.#', sZc)ߓÍ x2 ̋cX;Y6B 6qbWwi! l`n<[I 8˲qQ؁ ?B3ƕ$S dBc|d"[|&׮*ݿl=zyj Z,t[)m ¸i| Ibh$ SO &-~u%n}㙒Qr鿁RNL&d{Q]R \+W& -$dn 7UgϕSLOS4{ԑ##{QPopjϞ+֨ptu Vk@{כ7O>x,_ j3 U/O-O[6)Q(ce)O-(#+>d2ch"  nGӓ? |Jx(O ۂ}f(0>\r9>??"\$`?m)):Dxeɏ`DlU,}X600]5lb}d.v5y |fS >XHLmY bȫ9.-X7Ʋ"X0c$k B{(Mdd7xdH\m#JR i#2TDF!BaDÐ~3l-vcN/t9-(Y\w'2ӮiUt(\֡Ce%x4(G2LߠG^Sy%(zS\0{vŲqq!!s1DO(֩3wp=著0mZ|F+%wlyEsUrs jvp^|qdotRHdrS6n+i 8%s>L~=|v11TEΞtNDV~*eʦb.a_ N+ UҲ>3SqI ޝ<$SML=.\޼lWfm ]Io;!)a9a=j!(ZDE~M̸@Rwvkyx]~Hjbrr6=V)f`燣û<yK^dJkXSϸ#%,syEYKN.D`J6:S§@p _ ADi\[F"zqcEiν* #`(+J# ,NwׯurWj&-\|'6dÃd"E $:u"l$F^Y?w^w]do|Ν 39hPTʋ%[ݺF[E O O;!֪5GGG>S8 ybآŌ{&%K}ExxVNWoز4w?LdZu…!"reQZqg Ϻ~\a_"3MޥO)WQ(~prZBj.,|UjgoQ.ujJ)ެ\"pxipk2xA {}5p͛/_޲{:< ɡoߪKԫUt&idh=i};Q3*0PӿW'W?ѰݵL )jT)/wVzR.'hSɅj[_|q!%;t]-j#IdLPjH{(PהS26UP'y\Sk6;p*U*>oŊ+rr\˖ŗjU'..n`rߍU3=[f0 23߾fd822Nڵ+o;u$$A@@_#[Xn֬O6~+j cSx#ӫW?lԲe oSi0qS^ _N;lLjؑɽ9WrN6Sm[h{j~qIjeԴqNzQZkWE--OW)znE74!M/ՍմJ VT9u`$J7Ӫ`(hW@(.K l9 S-U#Ҭ:pnGl՜=ZunKҽSOm:hXV)]iM\_ +Oj:^i 2I7(q:|LmL&) n c`u eƨTeѡISW٦m%D*DUU =]'3\.%GQ7Uf9{7T9[~QLGu쪮?jFAWyY]MtY3tyQTUң<1i$ib^PuRHeryw]A}Zo]ge846ߘkG+HҳmYPOenn~SQs~;x>eA5:p:Pry@ fͪ3i8t({_Mٲ%b̊e2~*ׯ_~zz[VJ;=g!ed8E ooTFPNz%7R3iRLNvLz1ȑ[Ϝ̙~1MW :4wݺR$]k?_ :Y_SbdJާ+ͺuu.=)նniۡ37;ϸP.`AQĎר%XM4DŨ[{* 4i m~?DPx_so5o>3k9gQց+a%c123yTpUqxЮ%pA1l>DrnaKLH44{`iO>0\ , DKJaT3<*!<՜6q,#i^=Uk-89 WQ z/A.".q(=FCzެUy&d/ݣ#G+45=eǏ5h*jŢE &thm[Gל';gNqB`ooeբR ܢx]-KΣBbfxxo%YKS17<ń؛sw w:KyC~V>9 W[jEMSrucq5int'~pmX?>ML3Ϧ)syCrF`+|!!kÏ 3H& rՌ64P z t?yqYGly)xF 1T?j~UUDވoEZxDxrF\n*""?"#IB-AO1[Qh/j^4T-%B3]7Cť;wN4OJƉTN4$8*l;pYv#}޼WשSNkub"&M-(x;_M\ȑժ)²F`| <ί_PH'V0}۹>Y~g-j>>>vB]+W *U_Vy%RDGӴ)bTWD4}Lay)|zEJ=0.+Xq`V%iiO2fFCAg Q~5z] WȚZψ`,I3C$t*&*@wjd#h4($G, 3'C1~%9l{P!QʣكWBUutp}1:8k'>;К3@jZ(iz*!(1‘1} W6{oU( ^:Kf 6)[s/yGvdAY`iL=i9lȗr,28j-F*0OSe: 1NٽEi:v)aTwaW1w;ɸ;8t2$6 qg /q mX\RՊ x`myρ)j6s c{edcT F p#} 't\P|JR= %BeH}hF}k@Ws߀hB S XT`$rDȂd- ɸL~$nȪt  2h5k Q? ޙtnPt\\Lùf$Vb)rT'b}9ala˂/qBH F(c :8Y->4s;ˑnM +K@?`m2/]MkJLK*a,CG aͧ|ROncpgi\]gj!)/<[,gőqX~/B;Kߓl8}Ҫ>1 4Xʁ/ݨoOɡgOBC_jVIbrK-z>\5cFkN(yIe\Qa]鯆֮0woB͚&M Ql?̙ .}'))Y3+WZV A^Ӧa $dN__ӼyJdiS8;So_\bE%4Ht,<9K)}-.6œ˱.=N1[8'ɾ$edzaeȨ]Mdy02Mm4xeY$gR(kxZha5sXd*䅮%"%n(S=6ZQTx?7u[Rvg9[@;<B' MWCZtf1 * <7 FO%q1bfD^*NPwK'| x!8C) ك665Q= .?D&j5&r@RDc&q. %e،&*ZP!GA[;*druSY׸Vڸ9N3P3K#w툭D b}ܹ23v,gٳnEA>;ǷcQkl:$<<8[@oHɤ{c,q(UM5rns4|-hWh1[ Ʊh/H.&FD&JvHU&Vd<ȊF,(*fc4^\3Ÿ;UL F=hDRArNBeȚ3 G<%+Ȝ\hy`xCj Ag hǸ $|ùm9 uƫw4׻w8*-Mxz{S}>ǾXFQ+a}"9[P8\R"5${9d4?\2 •L2L" @%2PxP(E Qh}>^ Sp`B&&MːG 0CȌ׶^$ EJdgQ/ 8gk賄䢊e92,ܟJߍ%3<l~[33i͚}JpZjsvUٲl۶FBߦ2o[nmZ0cFhݺL_my3h&M\`zu{34tC<6,:;[߷mPP-^x}AZf2;s41fdе+6ж-'NVYn=pj9 j3ǬBN;m m}Jl^5x8ݳWȤ=s  *-ݠV"*Y$ic`3_Xw~#2!! T 1?ihB;쮳Gp a@[VT[ց>f2`<&w71H\ Pa1asr9 DgNul( 6yh׻w8[ZxalέTꂲ1њR)9<:AO"WOfc9 {b b|LfYP׎.zX@r4Ւ ԬD] yHEwܵhsVУ?9Iԓ`'1d٠3Ba5?rLPԈ_gH2NF\faBяnl7|L!rHegۆ`rI^n|֒|z%)ġhAl E[E]EYK7#EOt33IKcG{гvE7ןS CsS,,,Y0ן&(俟>ݬvm~Q㼏# z[w?12MXU62zJ9۷Vt޻͛i^/=/OLܼe@Bs,[gf teKycPW& xl>)faS25ndDSD>^S9[clˣn뷺m[+W+TH߬W[5'N,<9"2eS'6<|<911L;@}ƍ/7jty۶(>lam6d'E=yT:DQ XlUH+qWL' 'H=4.ȿCr Ye#P|(54|Hccg8 F794Fl*G]"]Y @,A[H#{};a.2V{ݐپv-xH$d\\ڵ,]^Ϙ1|ڵWqsS|#"ݻw_&2]mmeԯzJO{IG9rqNiioR\~gQwFrre ﯲ18JDD kiHOj{<9@ Rϯf(NѪ3 6l67hۖ5ҥ` vʒ;q^'-۱im i[Ji}_y3Kk..ѱ*_Hr.+2O>OucbʧK "+ip3c "Ѯ"[6G'm`4!xꚢؑt:슔iFuF4ɶ8&9$[SՙsUט Edy1@eG2:&>?*h5z.pVzxM<< ɸ#N#PXx&䅣N¸Tԛ` Hޔ.&tde,p'.moNYs$ m(8Ե"TWab"$FxlB )0GZ5htr9,BbK-I0"(*g¦H0;)s_Q=Ԕ|&<:{ ʔ=,-YCl^?l^ Ϊإl/g̔#iTh 1}:6adIJeuIʕ.i(*J׺ujPewwo۷kli[оox-d2GrO7 hbl,;Թ /__̂So9zʕ͘WʕOtxp|VMeo8r֭r⒟/L_>\:|O_=tHIW/Ν3~;f݂gR bހN’mzIFּ61؛ݳ82" ڧJBƞt,XmT$|iP (֘+uF!X*> @_j\"Ѕ.84_>|qsZҊYB#4;dɧ$8B S&BJDUTy3zxs$&&FB(i8DL)CT 6y(l'Pa5 $Lr٣ᖁwFlh>9R[8%CI#yH>wYާЮCBaL>,]$|h,jd 8ĢՁU &kEQ Hͥ.T= ه_©3<>ZLyϊ/ͯ/:A-7`_?0lcnM$ʕ]XLۧݹJ/\p?Q $t0>/4lh[7:ҥNNoFS3BUa~\D S=]gfZAP |- !%YqGD&p|ISw*^u%*ՠ-WzWG~E:"ݒi2GXN7t,Gn,V(0!B6dF4H2eR(v;1pYt82 A1)]Fi- Ǥ#Bz>Mcd<-𰣫8~p 5d=`g Z9PIMN7׌upgxcNQPx`VȮR\`1T8I30|PΈM`v< e4!*QwVlM g+?}Ot͢^LVg5"Ƀ7 !8B%Tqf Fr=8-z~5,,#Gl3}|*nFgիw*MrLOweKz-Z\7o<23>>\]wL%$z(M)h $͟xl X42R׿3+Wʴlv!fHt:geB f/E&c*>x%xNqV2Lx~@ 3 ݬR`#RFb\(1h ;O!eiA؛s"gKxqFWF"WC<)vy6 KeY0h3i_9nq ?UI_Z5nޤMb^Ž&&ݶ&)eCFRqC@ΝRR=zD̜D8&&C+|E~zػ7Y+]޺5NuCI!NN'OΩVMt}}֬WI8 ƍ)M^l|ႛ\q܁yܺ2jt2z4  닷wdl$2W)Yt@#V*,_(K gz0<Ǹ]\,m0 ӕUlAICԝjmY X vP^00:0lDOLaGq8ݨ\--\LBU؜m]:x_-):A Lq3Ԭ6po0drI?OƮ5鉤`YDؒ=ۍ)-G$Newߨ( ^:ؐe^7 v$N}G)Ȍ@1$F9Le4 ncX X%f" dhbY\>SyV-U+y] 5b+4hQ# ]  YgL3EaJ5 o*\Ilã)'WS`] ͨmGhy `,gU6Tk)6~׻9xf>oUZ~tW[[հaAnn-LK3BBpLJ~5j_ZknB5TܾӪUȑk6&(ȽU7ĤI}gdkڹBj5z(>̨Q2>zY:dyoapj vV1tbF~}{mYE0I|sH@/DJ]%m(e쩊 ਫ਼A`Mvo`Gil-Cqŗ8|HFY̆S8F@<)s-?B(>Daـn8 н$} ߌ>4 `& D¨?)8LJ_ hgfoz:L4t3wxv>w8*DGENdwz6<:,$[> |n+q)Y A_@ MhkJAV2v'&إK8[. IDATDt ~Oy:b/'l8J0^8P(v틝;8v,D6dHŻw^Ң_?!瑚=qF׮e;9p萫k=k5K]Jmb"\iuR5[\SSܙ)SSW_1h4̚ȴ Z{aVǀeĥJNz>qY$6lndѦk}=a գSFn؃<&q@g*u1f% -4 r(VI%[qd Q E,)#! MNq hIK%84#AC'l!ݒٰ "{ W BYI_\\ABNX _16pmx6iGX\>JYH2n"2W Ɩ$ž-dE#tCBEkU&DzXZ¬ .|+z <fu$!r4W J[]bD1:$So=ES ,f!\`>?CzҗJ7!K¬YcֻlMAbiM\͉cEdJC{y"`mO6`B t|wb*)B KdὓْO3j~@E۵L _?223_e\wwōC抅 GRegq n]kYB#??-,^^.=}Yj1ÇjumT&_:9Οik[tAX"iРGק(W_ 8_ys57n4i5%ׯʍh*;uc4U s8'RlJ#*,wtzA!uT ϡ~o/7,H [2 3жp;m(@m0[ZhI?l!)"- ֣LWʇA-hrqqEGGZ80_A8ۜ,*GA~$:ڇl@1#I$u:1/!t/B7~E>;96w: 6Ä'g!š9bL7~_+/}_PǕ⌋ȼ nۈ"H"+ M;0xTtB+"L!bQ=\l׈[_PkoH<BA^ !6lq]/bx)H!N1"Q*!FB ,ïL։6)x0ODD/Z.\1q.hEC |gKME"WS`Qn.~)#,^ E^A)[Q MDǗ]NGj+6U!t:1g03rX5`ƍS FҾ@vn̸zB,pƌ8J}ԛQ[ G᨝}Dgh4ן.!11)SB:u^.#c=zڷ/^wJ{<`ȐGGTA!4aUV֟|yb`Ї¡USN!FǥE˯Du/q3zFp+dŔB_/,"i=_QsI+Z׳XٔXPda/Io!B\y"HZ!Q) BQљ⚺譟Q(Ь+Ew]EL,&'tqV|#yy_|,*^8Bh*BB#6)E %d)Jd7W" ~k7b&yTtGL/Y@_/xBw8u7YtLU4˜ۨ#Sa3;b.pĬ,)䁲1lNEI.sqp?,4SWHАUM`T:DrXǓv@լ0 &q7Gv˨d0 #؄:f5b9X` dq͐RYj&e&6tA/rt \b'e͈dMBƲθ^۠uYݧhtYH_Щ qtKRZ)ի+Kf IL/!p!3vdH 3۶ͺ~}pm>>a&R)[ѣռK&VzoٲĂ^uoeKNݕ%LҨeZ]1#ѤU?ٺ5n;OQB`kkȑ}B۵ /*22F ]lZfMן4);w暙IKZZeeaQ_ hߞD:t`ʕ{!@\]4X2yB|{Ncɸƫ^p=>Iz_xD |ݳDHC&ݎB3XHuk&ա!7>9Զbzu9($8b!P dOb 1Ad1<*8XxJ6^T1GGI$.7Bqd~֐_qFN5ŮnO/lV?f0Z4袐 mEQ~ |z9vh7tUKV/}>F>^#5~ 3]8+ 7zA"?MAX2X.؊9@1.'@+lqslwyd]4vJ@ȇFB:NP,);0 \5QBPi1'63K%ZA\*IH✁3my{E+U,5LC(ؚr`J#aNߝ HS*802ߕ"`lľot'"ƑQhH_|bnʟY5[(CPJ9VPayeDeA<9SSaOggc_J7oic1IݺMoXY)xt;nXo5,jիi˖EpAK&۵IluϿp!u|pwWsÆ_s~R~<'&v[ |CF7mvRv2+ݫկ߿RuZsey!uCwo~ WhzC&'4쵬ڍ GWаf)3f-ӽIC qvJ)60 nObYJOF|^hp"c08:*µV=h `%ّhkXɓ4 F{h[Ԕz[EW$.tII4Cc>JZ!&XWO21=eHeJwZ$0 9W8O 8ȃd܍;dIR")Q8y'u2P:qveXKx)$b,*ťh,D?KqwB;! U/"bXEDiBG$9 } ݅)OpT:{G/_3("q/'gD$SL%|'"&&)$EDE a_i#DJH!@JQTq)/W#?I6$o)o)OJӅ2ࡱG𒷿c~C1 R@^*[mO)ӿ~Du H.Y#D*}#lݪT"@k>7i-ED˷>2l4  i(z QR.SE'HiI,H\I=%9c/Zf!,%>@V8r+*H2 ENm+{. MKKl7w~zt!!,a4|1݇a2z>]&lNfPcT pK} ~1"K \`lwb&DX Ydsy:  O]URz["H7{t}\FQ>I91C+Z?F'XV0` \q԰)U{n8 HNƬF@λLx^iϯy&;plXwz>~ϸe {P8NgJ>ȷX-̘ϐ OX!S{+~lBǎh.7g.6gzhaal:;W{;ur ShQ_~9w7oprhۻ޽M:Xf^VQQmۢL n⨛D'}b4J``rΝO͙)5j8Zfժz##6u^uf[.\dmTÚs0z4"L΢EK%Щ_G>{~ 7%`z?&֕h$FExg R̓U] `$vlid=xhm=w-kw7XtoE0HbeD.0I%s9A;p&vNk` -<Ù\î m¹A5vxSttE4$g:J"3ϑ-K=c ]dR].ÐL.z͸6e_&*PJVE`TAoɕ.i_?I!UٵYZ9Ko (*^aq, ʋ7rql*>HOD|ksZW @NJ>@"$J " D("3NdP4I#}Oe2#aQQdxHa3RGJ&^;DAD\6T=%I5G""4!Rr׸ q<+qIWoz#!_I:IZ ￝0!a2I``ҲeaT@ m 9v n$>h?%gOwwrڙ{vvp|ƌ}b Ou/޽jf_6im`ӓ"!WpB>ڙ2l˲eOeS/G2Kn+^.OK0M/-/$Ud"mD2%D"ޒ g%_vk mG#Gdx#}*/S ~Y3 x _iP*T`Nf=ihH>r>R>ni X6K9V4%r*Wr|Җa.W&ޏ$7qP3jm_WYz.^lkVW~z#q^ᣄT$: L](5S1$04v.$aZk{l/{&y4;Ve Ŝ5(cau|WNt:ckϛ $dp nyGzŜ8=5O@` zƐɬA|;9H1-fɿOk01q4zm),tŋ+Ǯ]T pڵk?n38tH?pmيΝ:9nOvmӦyUO~Ѻ'~~ ZSll\]-]]\]-]]-KղD OO"E--|@dCm7?` ebnp%+q7/׳q*7`5;tYΕhiv=q9V7vTbq݄M1h$fXP΃Cי0O&^v`tjobSA)?Af)~4{7I#̥i5\w?NXJM7,V:="+Qx)F>gnvk&։=W-wZ h43}3L 4TudtIFo.fw M*ph"yS'n>zo`;|72˲$oGgX>ޤ}BoRṢ::qbđ#)@j63gxλoKK34kXZj<<ڴ)a٬[fnO^ta3bҤb{3}71!Tu.-ZN?r8~KK 4O⛸Ϡ w0+< m@`fd67ްɤvfl%E}g5#gʚ >ޠuG`zn܌xT^|%$k9@XҮ{ᇜϥLGӇ@ǙDbB~ $8LqTT8,r$uѬsA|N0-sV[gMIjԣ%.mfs@ %e8?HL^T/A:LK` 5 SmdMq9 NݑTi.QVb\"8)Z)IM4HCr}t.]SvȰ2*A"Edlղ$dI($d-I@eʜ!M%eID"E(EZ !Ln R貋m_ʤl4I]T <叚0TlF|Z?/1,L>Bj"{?)uz;\2d>b2Mgd80"!rРLxqqíNC@f tSJq#d%w;v5iǎ=m[*. "U{--sԯiTPZ|#jF/4~KK6+GP^t0T=4}{ۯ)~Dk$<׳1:i\v\: .84U(]L[}-%ͺNΑF>/^.HC約9-sdN$|#C7F1G"?gJbE>CDgT6",˞>CR$LN[Izo'rp ȶl-? ȏe Bɽ2]yx"SFH'ts` x /iȼzH9پVy6#!+WޔĻ\FWHv%[mL"OS#)~K%`Ɲ{ѓ4>>N|2u&nx2[GJˬ.Ij47b8*䅗=׹~s`#Gƽ5 pQ`0+`n5G8av7I إ셉5gӘy jO\ɮfa]kqYK}dr+g0,ow1UZU#y.LĠl?OKMʄ [ʒKh$zG2Kj4̝wjiCC{(5k\VrqpЬYޠAٳϛoK-*SvP۶Wn՚JB0/L]QwJi ~~U4y:$izK&xԫ_dfǼΣGw/n-[`MB05r|;u_--NXCC1>wh\3(HK1 *`)y\WH$nKJF08sMs?fA{CL A8:Z҄wg ! ރap 02U'#kUԶ8Wf@ZٞAFԦ;V ˬ28~RKee&-(g;0t.$p^HRO`U<ר1cʤڻ@I]xc#B,#>b׀|qW_P x+<魷W@T%k^ ݔ)K8x͋֕m ܌3]x.ebkjM  ~\?<97_76nly\a߾}2~~*>S&ѭ#;5sL&}Ʈuc"<=L΄Rg]+q |͓t@0#!Z'ħ+:±5珆ʎ> $W21*Y /,@`5`1I+{R*x6xi9v9B 6^x C4bNRԼs:w(_|#=lg '>װ v+"i"MW_!SR\Ź57bnM~\X%sv36Tjǩ8P'G%RRBjB)* qg@aLBX)))[_~XXXXXX۴ixϧ 2e .dTѸ-v3bn?n(3/qh4[@qG$_SiDo%$%fM?,` sX`G&IpIbyEzJ~%KR*Mdfu@v׹~.u13~ɤd#AxJbqC$LI0 hᐓfu, dBv*voOsCDŽ{%l~bYq|Z@vneᴬ̭- 2oRu%yi:frڃ-ei94íh%n{sNL$巬a"Eؾ `"7FxvdfMzZS$''NGGC=.]woe//gδfM\:A͛lڔ`4]78lXX``zӧ{FDY\ݺ ºuժ̝RŤIGx/ffMDGӶ-OH,^I1z#e ő=Z 9߈aϛlDak-R[&fb,;:Y1[9ܯ;h`E]e'ۓbְ<6f;u,Mֹ+CVwRRsl).H`0;Jqa1E&TN!e7tt1gp1$R ;)9v%W&iiMsCH_o18-!Ԙو8S&RDxm 6 ¯Me@NMY=];Tv_~hҤԩS]]]]]]NڨQ˗9Μ $}LW= }Gw0fe--y;tB;tk资tqp|0'u&eG?KLŧ44ǰIODf$z9z9`]:ؕDRsUT 8 ~D3c( |CDF`~W$`8ï.jXƆt agƊXr'.co/cmw7>{ `>劥jCJMϤֱw4 kp'&Fh?;-7=B!>:jӜ#Phޕǝ G:ElfJcF3'jջ˖)33ڶuRk..){_R%_3nXLۗԩӵ*U.͙s'!جƍj{{x<YΝ3j̶AYq|9Wܺū2cffL+"xgTD>f=r͜ }Ȣ_xe|n+dHIw~I٢ya菝h78 ۮf{oRALq%zi}?!S^㘱}/JR -hd p p\R40s O.-qI#sTw4pt+SurZa:{gb4*ByXN̂ypj{$t.GcE},mč1d6aaC ܍3Esq%ʑb5*Wh8IINyb>o= i;xp&?0Pӂ9Ó3TaNIbku]@yT :"1{|1ޝl3eMħy܌5Ր$ZB[Չ%nE]yd֩Tb0ͻpIRq,={H NMr-\tGfVQQa7=v\zaa _?nxq))ɸlYlZ]ݶ-l jU˵2'$ƍKz#Gf 8<+ϐcVߟҥ9to'0Џ1 {#k'( a4(]eS)E9?X0lMy—G0װ;ruz;ckI t:@O> '@s&0@-&^f=@wH42ױtQXIpUq@T2~IcW.p2~xpPKH,篟M۱lIŊ7hϻXl4{nsǣKr̬Ps4"&^ޅm'a6@) ',0n Ʊc~ CcY>(p;+00nݺKԩܜ\/nii9`˗/?#tsmƌȒ)S|%}]a2G hoT!+)C Rk1hYq!:nM7]';`jÛBz2K0D$s }+Zz^1b(|7lssDZ /KCߙrp'c51eNRzXNQ`<1}Ȁސ5z6ڞ6hM Ғ{TQp1ˠRLAuy*Fz̄w{"x;N`'Ovr@Gv/hi?_<˗/4F8M;qN gg6ndXMHcԯoyƍeʘ5T苩36{nT.BL@z*;X;B|ǭ>WyQ)Zmw©RK!$Uv"9ݓ6l 3nذb-{9_f4JHHpx{||wyӦMɧNjذaVΝ;]>fvLZmrp0MTWeKVG( :jBcƩTC 1 $%@x ZA4t[m:V!-qҖ795ahJo{\~8(lMJג'4hFQ6‚/@v 阀kFUZu*@?:Sœ#zJWCY-؝OU5:#@Sh;-mOvbJ 5(ȞT :,"Z IDAT%o_}B܊ݧD=VG?mK]vIqoߟ9s'lz>ZfMzJw~r[L>U/-Zt7%Ŕ5Rs3?Ǿ6&ԺٳE.trv~QX-[2g̞X~ 4o^Ħ>a|r ff5+0t횱uXV@[Py[!WH3[YYZ暉`0tO7loٲe׮]4*(;Oswujl߲Y_+>Ź=kZݻ=:e ;&"b2""z\>#"""1s]D$$GDH{/&c !b~O("&I˥4b{ّF$<yKK$GKt[W$ Ƭub Kzd~$O"yܙ!dޙ(**l˓=KI~}tz;/$'ee\ {B1drIJ~rܖ, mlߞ1{3~3e˖nݮ_g[} gfHNKk 2mh϶ղreu{l+eG"ОD~&ƇINv'S$&r3$#&-ڕ)'%1]'r]qSr,Mٿ@'p y+ZBuA1r>cS6JAf{{ep^" sZDh""t "(EDJDHD܉vMbbDp)5UDRN4e>CgvBB=>dy[aSH{Zn=eʔ_=dϞ=sٿIc<ܹsRJ)))/lEQE)Hy/l EüV3f՝;w~7ns>EQE)4_u{#F.]r[Kmڴ1bD#""~ovEQEQo,GG:ulٲe˖ ؿԩSׯ__V-;;-Z\|OEW(3 Bڃ((W!REQEKX((LX((LX((LX((LX((LX˙3gF.X=zprrrrrѣǭ[SYm?Ş n+RV2hРE;򯒒Һu뇅կ_M6iii9,U@y. u[ɗJ4ZH^ HyN~ӧ׮]S2pF;6gm)sPQWM`)~]2x-[SQVQ -`)~u]RNlRxqKKKOO\|_his[Q -`)~ nnnKUsΛ6mJNN>uTÆ [juܹfSR綢ZjRc*552`0888t߲eˮ]^=g(BE]T?F=)<|`]]]N޽_s6(VBKX Ys׹pB5.Ţ=zTgfj~䳞gjooFXl6s믿,Y2ϗmI$)$._l1888,,uJƻw~w˖-3f̫;`ܸq[nE)+V$?*jƌ˹O?[nJe9jj֬ehF@/W%2%0dȐ-[$%%=ےS9 M&ԩS˔)PbE)edd :k„ BN7|pOOOwwQF{n޼٦M//aÆedd( GlW~ԩ;::)SfժU?h[Ӎ5'#""FVl/"333?Xc6jWҿE:88ԬYs֭Xڷo_Æ ]\\\\\6lxs$ !o} 6lƌ6㏓&MzVjCN4Çiii-[r 0`͚5 >lذY z-Ϸ˂YfU^E.\ػwokn@//M6%''_xlٲ[5Lcǎկ_>zf0prXtիWcĉ/6Ŏg!!!Ŋqؘ 6*TҥK9Xuu+Q^BҥK +oYÁ4h~B;w%疳g֪Ub_lٲ/@޽O!e}Oϊ~:X97UV}&9s(__8Q_d>>O|ĉoܸQV7o>>9)R$?GH$g+J=z̙3G|l׮O?ԦM?WCVmۖs͛;::ZDlӲe={9ǀ[n-ZԆN{[f͟>֟bŊ9^:knڵE6N:˹e޽uA%ߗW<)ݱ}llyիϝ;7(޿g111111?s>}jժw66̹E]vm\\\ZZm$o|||vֳvݻO>QQQ111f޽ۭmT,ڼysO>ѣ':4?0(((33W6ܹs 066vƍ/^s͑H$*_o%l_C\~uNNNCuppPlݡC*T6U+o߾S˖-?XE *԰aÜ ((>>O>LMMb…*T+Yɓ*gAAA})\]Zow]^='''''zٳǶR`I$dIαcƏƍD"!s$;w>sLJJJ\\ܮ] 4vD"o!#X?;wΙ3֭[&ZjF_SDXD"H$/9E(H$DK"H$%#D"H$KF ,D"H$XD"H$/)$D"H^2R`I$D"dH$D"yH%H$DK"H$%#D"H$KF ,D"H$XD"H$/vڈ#U*URU.z%D""l?CCCuV@ t-,,,۷s+}H$DOKK{뭷ԩRNVZeddu*J+ōD"Hxϝ;ի˳-~aGgoH$D";}sK~ٓ*R]ѢEݑH$D2sN͚5sZ֨Qݻ)}]w}w/_W^oܸzi1el+=3gbS02 DmH`B~K6ZL~I,S. 1+INk @NtA2i|9_8Y8k9&4 &·սZLL Pc4Yl$%6OLLi限׆/^ܶm<4k_D"HZ^wpCz;;;^TuwO>{LLLrx1ɳu 8ѳg͛ۼի trBoRXAc.%^]Kr gYk۶%/Yәϟ/~>9eJڡCUڭ\Y0t|} >m9-aT#ZsIadKLg^jWCj_D*Qu=2-كz =l%]u|w --JڲF?fc̪r3# '3+Sݖ}7jh`Aj|LGbLr ܱr)Mb(3eԬvV,>xM-^I?'8YH>S\:AdavAIo ,*CTI X 1\'=Cy 1Y84qȧW E,3(XJl<phZ.8adp3M f&]"I6lz'$(ldžr~QϬ\99EuqUr5'̺ռەf$lǵ~ƨk]flJxpd2vj'*iØ߲4 z]REi\繢4g犂D͚ƺuUk*W~Nٿ?S5\{lI+Q#g-d!hŋ)7V'w3##ue)V酾 STi| OAGGG׮];***/KVQwQ}+WisRP>}[VR 8}7'L:Dy'{Q͋4&. lk)ܠ~5QϝuXVt&ܤe[M?c >$XiN-@7G2)u`33P6+nD1})ɊWR0n2?&co xͤynv&ξ8&` <t OxBĥ,%,s<]A^o^ߢ0|> o""0$1%bj.<7aM]=FǸsMP]B2a|&ӳ0@ 'eujEGt-VRY]x>RٙܨnU]%8qw8E9&k`mq*-BөXoaJgsv7/ue236) :.C]8K6tz$+ue2OxѺ*51e%Ҹ,͍Lzt,Z*]Zeu~~ځru)9 u=y]Vl-kwZX1'ERr>Vz͜UTOkϬϟߦMUF;Y,[wٜefpݰܹF/pƍܥgͷ~hd?b{FуaKvJUDβE֢{h,pGh ͛uqP1ib(F"(\mrCAL,zXvS8˜׹Bb}IZدCΊG)yds 烂}Hy%Lbvp(ŲaõSp#Q7L|'2X%<IHئW6B1C]0auJXfR",&"?Gd}'ض~y{vßD"x/""HV}-Bȥ"z?/RDV'ЏDdgWLD~.Ή,B|+5Nfar I4Nsnܖ*DP"[=yY/\;l^{Ep< ?z+=rfŜa`(V?|D_3jw.OE%B|L[Y1`h4Uhd;paO~ <ۊh%٫DDJ3$L8tղ((lgjZvٳYjYt\:,\N6[Za4K [NBOv` ٳg'gi>}͛z뭷oQ֟ӉE}E*TlJ:^_ECdWL%NfX|hI4?]DYwN~0"_}8U1"(V(Bgo=rV˵m)8byOf~?{sFn92"&⋊Ȓ"StG| qPF;+ Å1j+("HS%+ݐ`bc#10FY1K4OEQhsW[:1? 'w޹krB8DL>znOEmlx޻b@0^*~{}LJ0P)޶jf2EOWohōCw{Q]qJ.8\Tn+('P:fPރҨRS8aC$A7(x7'M]UYdh98t(i߁g/*漚X)))e˖6mZBBBBBԩSgS ,'NtS/^o߾69f̘3K,pkYNJ.]i^A;mO˗?{\o hdGǨ#-V߿z_!\\SL3Z]FZbTyStҲ(?!J$SVN,[xCK6$fE wH;;33'GCk KψFE1HDZ&vaQwF0 tO4- f=p%StǢ~(F$X4 ,KtL$ d"zF0z з;dݗ$KEZ[񴂈!J^"~e^:zON6b 4p'}<ͧϊG/"ER/_TDEDrX^Z0P{ ccappzF I4Htšh9!|C_h)VXނdQ_+VZeX&~nD p]@*aa a׾)w]˗/*澚Xy>胂:wֹsI/͟s̘CV]_Tޤt9tDɓ7#egO[C?TW4ӧ8EÇY*ݷWU.R ۷5jlX'4R8+ߧv^9:#s1k kᦔc$g]x;2.`3[Hքq)*Q/QzZEoYIPDž&XJbZmgeH33iwщ*Vr5`9)))RŻ ZK uo&Nriã1NfL1I;]2ofN^be47V)Jhl~lcl<@z|\Z0XyiXwcMT>C961 1#}I>牸ŭvUhu IDAT B_ԫоJ0N[ ]ΔQK 7 ,*N{J!>,"7PA:_z' a>ۉ҉/ҲwbeP_Ч .y}]x-36_r̂ovFۆnE k8qb,V5mDIIM1כ`z}JZLK\l:vŷ g`~ sԸ?qfNuswgd.u%JXzsPɓ 4JiD=mܹy4Ww#Od4C+Zuj{˺YYJKK3\AZ^6<~bU4Qҭ[i[TO|/^L?SchheW ͚m1(Ze?_7nh-yf'O\R~EA7n3'NfWʗ:r Yٻ.ȩx)wK|Y{9(BP8zgcY|*ySK: q|q[x9[)hItS4]QEsL5g&cfX̴$"xkXu& &dBO E_c:T4P[9B1$k7082C4pk'ԕ5tL2p q=Pm8vAF=Ǽq 3ꩨ\:,66SQJ'*]fXxA}8Q0=Tq,<խHG |Xca >e[y A,Ƽ+%X҆cs$go'k{2nIt2`CbT+B0|1h[[k^]e}8sX3ò41 7x5 vfڵ8aCgC?T~ܸ\(J;uFy1}֒| #X4D\]Z.Ѱ>< *0xp}֭GFPjc VfMcmX1mժ[X6n]fW[+}5z=idgރ݉5(]oBsP<ޅ|[:;r4E=R;A}bY;U+NᵽYюc=E` hWﱮ)}/07l3\āչԄ(箕e#TL(횴.EQGhFL1v"TEpw˜8B0Vh~G[gck mJ~mp(: jUtzb0]C R" O+5I=CVhG#o3o楮s[1!@uv4Y#8k᪬" ]DY]d.'S0 uR5eu%`y(yAvevhf]N"׀_确 |wZk9DLhݏݥl0 7歮NݧTxPW,N(l%\Y5IA]˷P(sR(9 l\xqդIQx)(Tz"!8r$zuѣޢKѶǀEs`dŊ zTW2Ы-[YjJW$$$B_?,]J\( 4SbgSSMw4R&߱#C*Ur{"}UxoouPseW 2U}[k`|9~u28qh5Yy?];ܺuz"x+ӱ;&*<ݙbs"Mϼ3(BP+Pi`f=8Et:jy}*yc5*ŜDxN/f%^OqG>*ŗp6i0Fj0ěa>/Rv16##7e`5"L0ޞIHB;Xi0T*OCԅ aV=?f@dhcxvƕ"uU] ǘ(v_4O0Ac*cW{ [1O\ N!@5'вM6P|G+`[ß`yJDj{<Ã(nOuhn%)"A79`\9.8N׿ٳg4iba/`]6T0cߠX>bu5ޫʌyGMf]=7߇֗2ad)]7t 7Ѱ0+Z7,}MZ~x4I=mٳ{tڼ2nHjvAŋWj-ѣ,\>lX%K[ԶGϯ=zs7`MGh^*00?WP[Ϟ۶S_FQءKqu|a;;Ֆ- QΝ ,ik:y2[ۥ[-CF˗WEE;,cCS^ܩ!~jMr]I151(uJ5 )Y qz 5hB\1U>0W&sç*hᒡqr:Qy)lg m Y70c$&0"3\S(^( opc>U*<G"Ra=h߳vr=fdGN($32>3죬 z̐'yÅkխ v*?UR DgR΍mV? ȭW>:ġ'jJ~mP 1]v[]'oSq;y-u3b1~q$G"_;eudb4`J*c uu g:!|^"w ؾ=Yb(*=tL0|x;AAiw89i-|cj$1o]dԨ ZyN@ɝ; ÇRT{wwtppzBC;y{+L0ܻ[Maa X$~ܸM]љM*P@E8jN&wwU`yx<02h*QHawjԷClnн1ǣ3n+S(oUnydf<[np%oWGʙD9.GIн"S!7׉H&('??;*nsf~UX?ЮIJ?ZblQr 5_ٯU(hmY紑;Z8Q¦31]XD5T>0ugcY,vLMJ2{oOf#XjnpD7j|eY%

    svptttnn1cFi֮]Vy=sx􀓝pCz̙3F9sfԩ.]rAZZZ u}ׯ_woFaa|JyG>p999+V2<|rInD i 8ڂ#mmmaaa?HtttYYYttuvܸq555ˣGnnnvX^ggoxB~_W@ vK b֕5ބR)++w.}xaE 쾝>}[KϷ}L رcǝwycŻR^<,7pH͙3^}עO:փ\vmȑ +WZR}ש;w1LgϞD  0@  0@  0@  0@  0@  0@  0@  0@  0@ X,U|Gwvvzх!Mioo7L hlkk ] M1LU2"Mioo7 '* @F0)00 h KЀ*`@S$Y"M0`@SXTA"a4 hJ{{T0KЀ30)&I%hUȶM 8C"40  hKtC0),A Ma P h KЀ*`@SXTA4 U 4%h@0)-A|Et!t`@Sd `^&@:0)qp4Es:NNȶH0),A Ma P h KЀ*`@SXTA4 U 4%h@0).AHM 8D"40 h KЀ*`@SL&KЀ`@S$Y"M0Y"Ma P h0KЀC0)0KЀC0),A7ϟ?U]]Ȓٳg2dРA)))wfNK_=!!!_X,ѯI955599*999--ٛiӦ]re555yyy9996mre~~~9fѯ=^o6E0)#kמ8q߶<'N\dI{z۲|7M[ۍFd]zR__,A(;;v$;;WN3fL@EW vUߑ4˓lG+**\}n pl6 l\5###mGzcCCòe6noUAC*z~x7ޘ:u+8'uBcUAC*vn}}]OlŋwK/t=,999JxI `CY#!!v,>>.]JOO_fMZZZW|lf Z to;຺3g+^:`U… 9jժܣG.Xzڙ3go&RX0"i;v,.....0#mo\3|*`HEҏ!t#Fڵ٭[6UAC*m<ǐTa0:::DW|YP0BV 0kV UAC*UAC*0):`Up-hHYP0¬x qT`St !f St !*`HY*4BcHT5Oq!U  xX0¬xX0BVT5OR!OT5Oq!U ).ġ R!OT5OT`SlRׂT5O1$UC*0):`U ):`U  xX0¬xX0BVRa<Ņ8TA 0kB !*`HY*`H>>>>~ɒ%cǶf`]z:;;{Yٳg?~.}m?~|S *4mz琐W%htpppBvA׮]Js 1@999%%%vu$@1|X!,ACfggWUUYG:t}ga2BCSLY~}VVVKKN|}/PB`åW7|s] :`OZWWzꌌ~ P B`ÍO?s< `1$ i{3Wtt\C)t&\+<5O+<[[[{skk$@1t !!ƶm&L:;`&Lضm[(X!04I&?6moQYY_SNSRR+o HX!\ p k7o~WPP׿W^rN:thrr?{(/ H q(CC YtҥKS ".ġm;):`Kӧccc Clllvvٳg2@t !!?я~4v؃^vcƌ2eJyy&,Gv~-[SOu};z^ziРA>,1$Go>o%''H> 46aAϷU$D C^p#GVZؘ{ X`0FC -..>vX\\\\\8`4o{S>`Hz%,N7bĈ]v9L-'n} z&,(MX *:`(0TECi0``P  *J#ACU0F`( UP BP UCit *J#ACU0F`( UP "40TECi0`(S`bfх@/(@`(>`h`(>`h`(>`h`(? O8J8J"#$@8J"#$@8J"#$@8J"#$. B>耡t>`h`(>`h`(MX6a8J8J"#$@8J"#$6aA؄`(@`(>`h`(>`h`(>`h`(>4 q8J8J"#$:QCQIDAT@8J"#$@8J"[,5HGeql6N^/Y,???~$ jii8pkDh^7͢tvV%hiX BCCEW\~]t>`@逽 `@{XM d `MX& A t& Kn Mb0&,@X8 h M`@؄% 7p$6a A t&- 7 $6a A t& A 0Il؄h *"}%h!`%$$dZC d W* AUsBp hKBp[BBp0UtBpb0\E h ** *6aZ&,!`sV AU,AZ&,!`MXBpb ZMXBpb0\EZ&,!`MXV-bA:zD/CCCE 'üg0EOL+//[-0ͤ/Izl6c,[nzx ʒDWސTVV& /!eWVV( D(--%RUx ,?%h>"))V糲²EW7.]bbbD0lذԈ.ͩUUUUUUiii|#Mxƍ)))˖-Xlĉ7m$>hw6Bk!mG EӇ Fh-pyy]r~]s H{{o{`0L&d ˗/!^Z耣ʢ#ƍ}~4QWC1JWC1J'$$؝0(++UBgddێgff^i!.\xȑUV566666=zt7Rg(qFbtC1_1Z8gy:.--mݺuqqqbKǍsg*F'Y= 8C1n>uIg*F'Y= 8C1n]f}ݢK'qFbtC1P3: IZ؄r` @` @` {ϟ ʪXɓ'/^JJJfϞ=dȐA޽[`1]1zȑӧOcU[[;vX?,}71yyy AAAvEUeܰaÿ뿆4(99yÆ ٿ)S###͛weo>{TsXЧFrʆ+W;ET=˗//u:=sСO?4))iƍ0a+++_^__׿;x饗Dl6{bXz,Xpׯ?~<==]tEv9sz'|rҤI߮]vՏ?xO>b>͛7OVTTm;]XX(y^vuh̘1-tO`}ƍ7l |'EW؞={'L ޯD;v,##vߵkb<'}<))v$11BT=ڷom& Nzj'xBT mmm[l U0lذsVVV*O>inn6mZHHHhh>,;֭[t~_>ljjjjj*))y衇z)%ZN9Yt 5d2َLQXI[JJJĖa0cƌQok[J,KfffIII[[[uuڵk]H%QQQg<([eeeÇoooXl5kYfٞS[#7o2uݑvNpIÖ'kkkbх|+VRݻNj,믿~} yjw-[=/,w7tӮ]ڵ릛n/!8p`o֕+W\e˖ WBCڎĈJ9… III~B>\S=믿եh4 yꘘ+W؎Յ)ʕ+b1bG}d;G9RP9?{1wyۅwG9&>PZZj;RVV/\t)==}͚5iiik7~:!O}̙#F}Vp,_QO݃??O"##Ŗqێ?ŋ6mZqqqssskkC 4ydQؒyN&XFFF~~H~~~ffzQWW7sW^y%55Ut-9r[o[cgǎwy~}ۑ={xx ۯtM'NO.;… EWI>'{׮]9rdnnCߣGnnn]UqmݺUl V{ݻ/_l2.\y躾#sΚt8qBH1mmmSL;(v@AA3`˿_^T=?O{Ts-Ee.| @` @` @` @` |^]` Г#Gļ曢 _tgϞ_;v뮻Dh  z+//$..Nt-XzcFѵڤX,k ^o2bccʆ &@؄`]wUVV,:`ߣ7-ٳ'غu~#ED ۷Ϟ=w] AlԔ)Sߟ~…~Zt9 ,A  0@  d#IENDB`gsl-2.6/doc/images/rand-bivariate-gaussian.png0000644016036000116100000005475613373111455016332 00000000000000PNG  IHDRKbKGD IDATxy@L{?mTTZ,,ݲTD$$ne k+dZRYZ%*mZHDI8gybsf8b{: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_YYYG;v5k>}ʆE"}k<<En}MKKȑ#yxxƌs̙-wMN.ݻ?4eʔ. XWW|e c߾}ڻwq]u&\]]?x⶗u :cǎݵk7/9sS^yI99?ݻwر|||ާOho]Fj?-++B}SJ]*Aeek~鿯NmJ-wG\SS|em2;;{Ȑ!tՙ>|xnnn>~8bĈ 5fll7/x葈HUUŪuVS7nJLLfXuuu׹?*y7773޽{wF뎗K[ZZ|//qLMMLOdݖ5Gk:X; 7?njkk yxxhQ__2D0 wb}Ų?~|J|Сyyym/k=* ,ڵkTgJ ~駾>99JJJm;xGvͿxN΀;4m?%_G3뗑ѯ_?//DžJJJuNJom˙b-]ٳY!C|/ڱcǏV?}3u?EDD222:~o94}9sfѢEi $f-˗}mAKK˘1c $))+ ,YP&Lo_%--mȐ!W\)--~bXW\ՙEj>}7Yu~? j333!!!~~~--]ǵZ1(` (` (` (QQQ˖-0`J@@F@@\zzڵkKKKͩ HX,=۶m;zh^Zxlj 7jkknH222Tw@0O>^T3f w#F` ?Ntt:ϟ7ogΜIzq=wΩS455wVqqÇЃqܬ_^^~톆VDu2-s%8 U8mhdLh` (NILLܰawOU ]grss߿}}^#555>>>aaacc㢢"6tN1663@uuǏ?~(//?sɓ'k׮}捆ƢEp{^1z!8!]aN>KEeee?2iҤΏ֥|CAMGGgqpp6mZ*}8+qĉ>{M2zzzuqqYxqzjlll?Hcc#77w>}gG<<<~nd:.3_6xBBB޽kHvvA>ߴZVV&$$ÇǏ#FR.'O YRRRRRrv\޾/w3auL 푺:AAAbW^\\\<һwolwXjjX#rrr}}dd޽{L;_[:zO>$//O\\wPO`|IĊ?R\\>>>>>/^R(+++++stt5jTuuz7o^bbbccw,,,,--T:̢ tٳgի %$$$$$ :r|",,k])))X?=]BX,%%%>>>>>>%%.u*''GOO_~k-|}}Ǎwԩ+= =t͠{{};v֖a]\\\\\~ὁOzz5'tlFu2A/h.%%eG&jd99999_x/Œ{ 777'tlFuT7PSScll3cƌ? &&~zڹsŋ L p4-lذzƌ c7M>}HIIP[qϠΤ|˗SPdl0̋/~aٲeTn`L>}Fz*0P[W'@P @0@P @0p%,1rAӇ`|HDDDDD``ijj|uvvvaaa^^^nnnyyPuuuIIɌ3"##߽{WZZZRR"(((!!1~xEEE S(x(]o}Аŋߋ?~ܸqRRRC >|;ͺVRVVfςd:.3_6GIIɳgß?իq)((JKKsss~7ozzz 8p`ٿ?&N23eyꢣ#""=z>uT>>>2@ aÆT N23e222]~ԩSn\#G,0(999W^_n]83|||V\Iutŋׯ[NLLꎨTWW7xaaa{E\'c  =|pnn֭[_GuS K[`ZZZ9d2?͛7./8Zmmӧ8ӫW/ =2:nvgu@sUUՍ7jhhP'Zf ns0pӧO?}ӧRRRTwġn~t0k 544>}~ƍT7ŹJJJ&MﯢBu/d:.3_6Ǫ<{ӧeee7m4gK5T7Bz T\\|ԩ .̝;Ç@'ݾ};==ˋF܍7?2!!իHNڴiٳgix͞ Çk򦧧9sfȑT7՝޽[[[[]]Fpb'&&nذAPP;zBkkk%%C}ȑ#n&--=c/qbP˗/222ܙ{ni֭v8p ՍăөntҴ4LyGHHȇ,--n =CUU˗G9~x;޾~qF'''...{p&hw)))3ooPojjjZtܹsuuu"}jqqq=:MښرcT7ЫCT7{rtuuԩSϟ?vZ>}W"dI޾}liiicc3h ;QBCC׬Y;|p{! ==s 쑛kff6u1cƼ{n߾}H_beeeܼy/m!Wl޼Y^^~СYYY;wׯM4555/޿ԩSutt?~|KKKFFng2772eڵknH?H4=iX,Ν;UUUqΜ9͛gϞQY 㭬z뫦Fu;=\\\={`Qvt!ccc`ǎ;{arr2˗+**jkkKIIbbb+W<##b"##W^=|p??+W_vmlN_!''EGG_>((h̘1T F,,,bccGҟ>}055=|0[\[gTUXtɓ_:88ܺuiŊ,z˗˳zFXXX?}4wcǎ͚5ͥs z'N9sF__?--MHHL IDAT=u[ZZn߾}ȑM6t'EDDpssSyyy3gδYr%KGAXMMMΝ;pV\\}_)qqCCϟKJJξ~:;~ASSs۶mH_h9矗/_:tА=~?gmmہ(//߾}{PP{. s_/ TTTڪ*))~zd/ PSS[vw`0,X΃߾}_?H_h3`byyy͟??-- 'yxx} ߅0@336\QǏ}U Fj9R>}zʕQhѢ .겡tGt'ǎSRRҊ$5}DEEN<٭ӷŋ[laC===OOO/t3`bݾ};v,ǏZZZy[ܱO!!!&&&7n`IM!m۶1̳gϒz .k>|Ç&M"`U[[{QWW͛7Tdz{{O81((HVVBԴdɒc?~Z{vZttȑ#ɮ=ݻwZEE%11CX,={9 bsqq]p1͛7GEEEGGJЭ!8K~~MZZ&y=zc&yѹsW*o޼ Wtႂ!p &y̙ɓ'ȤqqqfͲ޾}{BBBL____oowWBGG!44 ]0GHOO733{رcI]v޽{դN )7A8??_[[{֬YǏFW΁4kii9x𠦦YXXI雗gnn͛k;v;ziVZuI/?+H:تYYY 簵UQQ166&DttѣGI=~P̙3SL!b\2nܸ4GG.] qvv&D@@%K|||0@TTԦM?~,##CFd++`9992JppڵTlhhHF={ܻwok֬fKK˴gϞQbݽ{7::ZBB@7=&wttTPP}5t'0 33ܜ[__dɒ'O+WAQ0`GmذAVV6!!;ܽ{w풒Ϟ="^p%˗.]ڷoPR*A666U[[)))[l),,{lEEϓӦM>}40) >|HX,˗wܹx⌌ !!!Kp[N>]xq׮]^^^g&xw]~ٞ={ȸTBBU޽Hg֞:u*IԴw޻wFEE3 0jkkmll"""tΝ;tЪUHg7o'Ow>1ܜLxM0?33Ąd2$$$\\\Xeee55@/ 3`4448999;;;99>~BB`XX؄ [YzuUU/Õ+W9s 3`,##@xn߾}tN>L6_~&||www;w }m0u6mJJJruu3g㇆_^UU5%%[r+V>8ڹs۷>}:j(̀~tss3fLjj*[RRbbbaÆ9}^|rooo2ҷ ::ٳgH_`3̀͛7,+""BZZ[!zy{{7&Nc ZE޿ ӛ7o֭[W[[K{vnչdl022ڲe-t6AtVvv3^xӧO_dIll,ӷPCCO>aaa/:~===@!0ϱXsΩzyy9eee_zleeEgff͛7ۛ nܸŋYf;8@`4OY(::zرm۶ ;xw3}}}''+W>xJJ7v0HDDLLL 5qā#} Ç-ZtU2ʕ+gvpp8w8fb:Iϟ?oذ!''[ \n]@@*#mܸ1:::22r0+$$$>>s玼l||<җ`0oذoqqfuuu\\8 fGsscǎ?gu 2e #w__|YbEcccBB!Cuʕ+K{W FDD$$$X[[O<۷oRRҷU݇?~Lxihh۷o߾}H_D,ZÏ444ۋzxx0Lb>|xhh(#wkϟ%|䦦gqqqd:IIIC%vիWϞ=;55uMYZZ&''GGG3-[ϟ$,,L&hGGG;;@bӷ… HV߿WSSc2oLL_u}/p8̀>~rJ^^Dqqqb\fW 233۽{M,ɓ.];w. 4z֩-Wu޹s7Ο??o<G֘L}<<< ?רpժUuuuqqqÆ #vp vww]eeeb5k&MMm~/&&F>455ؽ{7/ 襸А;!!aаk׮k׮>}zɒ%%555L&SLLlȑgR^^޼yNEȍv~  8 \}}___?//ꎠWTT6mڃMDEEŏ??}ttt 2lذ+Vlڴi۶mfgsKmbbbLLLΞ=Kldee%%%!}["_{cUUըQjjjmTWWy?388=<}FqFaNf2777߾}۽{w?]MlKiʕ+"""ϟ'|/_,[LFFΜ&%%EZZȨؑ[ZZDEEoݺE!Nf2766 GE `{{{>ʵ ѣG-[jii9v예իW y~|iĎ\[[z2.dfϟ?_|tZ 1bĈ#zq7$ 䒓O,ɓ'G%222׮]NII)..nnn۷#FMD󢣣͕RRRnIII111G&pdN… vrrr211!vիW966v ;uT`ر͛ .$voL0!668'ގGϝ;Exyfʔ)BBBaaa">>^AAϩԩS-,,@7`6;n8bsӷlrbvܩg__߮^cƇz &h.\{s-Zؑ[ZZZ+((;x`bb"--,&&Faaafffs΍h  ~Æ cƌ!v+Vpqq%$$P{ xsΝ>}zٲe^YY}`ww9s;8@M?NxFDD(**Θ1HVIIIJJJIIIIIIoHHĉY,֫Wt}O:5xǏ1xwԴ~QQQooo/++311^N&hPgϞݷoӉrڵٱNo0 11Q\\oݺq%Kvmqm۶77s>~hh… 322h~\ uׯ_'#} ƶm CBB虾G <}wܹvZWWW/ H?{LBB>U=zdmm-%%Eƕ ׯMLL K'̀\111$ѣG}||?~LiǏׯ_ر{,ٳ3fXzBKFG^xbbbdϱϟOx\˗/?}Ғ;ﯭ}ԩݻw>|ŋ < 0aBRRRBB®]riEEEuugϞ3}@G9s&88XAAn݊2dI%8PRRmiisf͚EFu/::zرdf@KK7nƒ,kӦMw Oϝ;wٲeIIIdׯ_͛gmm/@K>22MMM&&&/_ %ill|8UmllBCC*o655  5}}:yU(3c ;;*L&&M9rdjj*` ]аbŊʨ~WHYYʊ*TILLܳgOzz޽{W\ٻ7Y_zeii`0]]I&`2;vXAA7???zyyڵkڴiIII'T`?nݺemm"++˶YYYW^MKKc[_pڵGo֭}aCH[[[???6T!ݾ}Ҳf͚={/(++ssssss`/8v'(;;f̘1999O>>oo޽9eH_=|PRRr .,X`oo?l0j4\'qY,ϟ޽Mu;+77WAA۷6JII ILLԜ;w'/Y[[{׮]RRRTwhNf cӦM/_ eÍj#Fpppһ>}ҿmmmmmmuuuYӧO>}Z[[{݈^p>`8x`tttXX7MWcJHH 8}eeeEEE?.((LHH={$$$(MMMNNNfz1c8t0hk+""˗G?͛Z..jaa :tcǎ8q2ncIII'''qvhNnɘxk׮UTT}B+W̞=^o߾T7)YYYϫWN<`NNn& XTT4&&F˗];/[VViӦS!}38qpzz:-;v޳gՍX'NXdIFF@ yfBB(/]tiӦ g*pϔfii4p@{iǎ{]yyy;n .\ԩSTң_|IRRիӦM#zI^A566.^xٲe˗/u_ѣCBB|||?~D𿝐w`z>Դ~ WWW3gL:uϞ=Twur(MOTJKKB߻xyyFDDP~Ga9"""Ξ={]μd7RXXzj^^ޔ/C0L[[cǎ :^Ȉ{СCT7='~p۟cK.رcqqqTw='0׳&IccN. (ɩo߾fffT7 '&&^r  KLUþ!?$e^&OeX؜\WAV4 -]]eQR7È4_~Kr|>syԔw)GϿx .^TZ)))t;500PTTTXXiӦDGGGPZm߾}\|]v߿?&&4 @:܎V?ܹsANCCûw߽k^^^҉(`U:|pLLt;RSS{ܹ͛7JGٰat 0>>~С̲YfIǟ`TTۓ###Ͽrʜ9sHKKK̙e˖8~P)US;v,00P{ҥ={}҉`8cP'&&J`X֬Y|rߗѾTJg/w\vmmmm6޽{Ξ=;===%%Y:Q<\V}+++?Ӛ⠠ P`|)f\{{{QQQqqWzz޽{91z4boVXoDGGq^FI}}}nnt kسgOaa+×G >&)`|| .4f7ߤ}&!!!)=;;GݺukPPP[[6'=VT{ÿǧ{Tvڷo_kkK/ꫯ.^X:{5yT}ݷhѢH,wʕ+0L/¶m"""s<=Pn룏>JJJ577GDDhm֢5y:8fE;{``ǧ޾b||d2uww >MwM=YQΎy׭['DQexxѣW =US1+*هڶmۙ3g?+++k-کzM2=YQ~W\i&[hkkkuuuuuyH4{l[=j_FcVԿ[ZZVXQ^^0/zɚoaaa>.]Q<5z_nݺ5444$$$!!*ɓ?ٳg띜BBBp S1+ZcccG-**3 ?zjKKKKK˅ ye˖̛7sX'KcV4_^WWWSSsԩ .tww{yy͟?e߾}uuuޞ׮]tvv~衇͛p'|'Xh< =5.q̊w͛7q6}}}nnns)vBk1+z`&m @ @ 0(`P@ @ 0(`P@ @ 0(`P@ @ 0(`]&%%yzzL&DX=nn2-[Ԕߟ* krX,Kff;lNHHhmm88@&GGGoܸa?ϝ IkMEEt O488o޽[:fW!!!S۷oQfz—o=l($W޹shו06$ldKw񮮮UV G!ިavwv}}^1&d`m@lwcxW!777뾊 \{d`mI}N} ICvw=@ @3 }L 06$ۀ'YO~ K@ @ 0(`P@ @ 0(`PMJJtuu 4L҉̙3nnnY#11%11_~NM3M竱 844d2]z?ϤCiPJJ_WW'DkFFF ˗/_o4GGGsiLj`X3Zff;n5 4A;}tii-֭{g7n(J8gWc*ettƍA4˺ [or[[;[UU%J8mCo/AߦO:p,Y2qŋϟ?/z[788{{N:fq`]fomy󦳳~lct '>>O>;X0흝NxxT6>888qܹsӤXlƮUVFQ0fq1CzƉ[fT`:kWoooTTTNN`LZtttII-%%%111Ry)j' ֮]+D/xź~%K늢566{4cx|5QuCCCnnnawgo3ҥK7o냿F1??[:q 4z,`0(`P@ @ 0(`P@ @ 0(`PIJJڲe-YYYk֬`j,t000tÇ/]TQ(% $p GAAAZZXZZΝ;i_@u8Ti~~~\:IU1>>>qL ƍ]vI0iĉmmm񩩩gϞ=qt"02CCC˗/|E9|ttӧݥ΀HNN}E}322dS,΀0(`P@ @ 0(`3IENDB`gsl-2.6/doc/images/rand-cauchy.png0000644016036000116100000005006113373111455014011 00000000000000PNG  IHDRKbKGD IDATxy@?Ei+W.R]ʶ,awY.ec-6,+  *tt8*ݥ17S:fz{gSsޯEg24- 0(`P@  @ 0(`P@  @ 0(`P$..nJJJCurr t:"!!4c ooBn8L/ P\rɒ%?~ hii5k\d2Lf]]]ff={uuu]֣Q `L&tfoo~]veYfݿ_KKKyS?;E` >wh_־}֭['##evcļ+V(++KHH=3j( ѣG;v5(882SRRܝhҤI6m퐧z˖- 8pYn߾6Chv۳ׯ_v乮CAAAJJ&==+abgj֭[FFFRRRRRR^ :ً@ D__$***//ۻ;K766VWWS\ڵk+**Μ9sAV=oذСCuѯZLL?:L\bEsssxx޼yaÆGh4(ko166~5 Vwwǧegg[[[[ZZ|6Xgbyʕ+===sss߼ynݺ˗Ƿً@zERR`t/5+Wܶmۅh)S0aÆ=;99ovaii>t)Fv!oo˗ws;{h޼yǏoѣGϟ6[g/A(`^l{{{3ϻneeW^]&Fn?bРAw޽{ۺuuP[[;`Lbooo֩myEQQQ\\|ҤI钛7oh~m맨hjj0FEE999 ncX~JjjΜ=j(z;4 hϙ3ϯ???3]6Yzc:::k֬h'N8|JJk0 !tC222񪪪 m ﰩE趀 0(`PIIIk׮Ŏ =|!CĐp 8 ೄ![NFFFMMm˖- t""&&&%%%QQQyyyޤ /@)!W!WYYi``냪>}WJ A@_1]v;vt:]^^>//ѮU{yyc~n/=%$@lܸŋѣ F{v'$o1ŸPk׮=ydosrr?!h#0lE 78p 77t"GhZZZcƌMmG6uzJ(vYŽF0(`P@  쬨8p@##@҉.E 5c ss@]]իW{ݝt.+N qy}]*55uYYYdSq.PTTn:55-[0=}/s挩)"R Ʈ]Ǝ;`:.//(K[GGǓ'Ov}xyyrf zl` ƍ_x믿=ZJJ`߿owEEEvvv%7rR M ҰaÞt萅WRzIIɶoϟ?LYY޽{} ƍKKK8%X[[o۶֖ Z4 OOVGG#G0ueebR  Xp@A  @ 0(`P@  @ 0(`P@  @ 0(`P@  @ 0RRRt:]ZZڵk&0OllVfffff&|?y榦& sQ''#G\reȑ4mҤI^255}=d2Ig:/ SN߿?**U1m۶GDD@ M M``Y~}zz{DEEy ,0OAܺuаZ[[f̘O?,q(`Bhmm9sY~\\\8ed5j~~~ ~***hiiv0^uuu;w~xر^/ӦMΖ`0![nͧb=;{~ۗhjjN>CE 8==]GGmm파>Çk֬Z:vܹӧwqnڴi/ ׯV\\mJSStCCCgOm_Ϛ5+44d2Ǎ}iSNݺuܹs(j!^`2L&۷.]JOO߽{gEgiH Hh79r#6SRRJMMURRjRZZ[RRҝGEEX"??wk00GGG{{UVqdi#G|葆G@5B~Jjjt2.oeee|PSSɑ^tRn,| @BHHԸ˗B .\l2-6###77{0(`W]]}޽so ,r V `P/ L^^kqvv* @;;;s{-ݹkP266ޞ+Yhѵk׸"pׯ_5k4օQhC7np ]>#(`z-"ܿss`ޯǏ "k;wnPPU 0` "boo`0H>0` ;w.p1(  h***RSSI988ܺut B` IIIAh(`ΠMpp9sHhS lJKKKxx8n5QQQ++0A PTUUUTTHMhh(T(666SUTTTcc# (T+`1cĐ@9(`QZZ7eABaaa3g#@!!!f100(//#ZP9<<ʊtDDDfϞ`P"&&F]]]YYt60 )0 %=kk0 A( eРA&L&BPАtNچN@!(`A6{lQQQA:eccBT֧&MT]]M:U^SSg͚E:HWtٳܹC:U^LL!CH  Q|e֬Y P Y[[Ny 8q"NF`A҂*Ԟ5v[hh(O@j  owܡ :_VVVPP@:y(`>1{lAKDD޽{c ******FXP|ƟY"""ZZZH  :bĈ'O@ _UTTdddL6tƍPΝ;fffI @C/~姌H  L;w,,,޽K:I(`$//F:H/a BCCtݻ8  /u6LEE%>>tbP2##Ԕt>(490 CC~bbb[A@ֻwZ[[Wbbb1-0ILLTPPPUU%0  gXwNF3aaa0̢_jjj.\hr=}}}uuunihh}6 ޷o_hh̙kOOO`&wrrurr*((lhgggEEŁr5EEEM0AAAt.3g J>}bĉ7nWcXXXYZZձyƌ偁%%%G:{,W۷̙C:w͞=դH¢TPP r##۷4hРA۷o_gΜ+Ūo?eݹCEE:ĵh&< IDATǏ~Om*} @FFt.6 0PZHHJA_~… IObb/F;wngW*ବ,WWWqqqWWלn'rAAA'y慄466E/ϟO6MSSÇ?~|𡆆qzz:ΎxJJJcǎ} \mkkk;;׷xᰰPnf#,SSӢ"!Oo߾'NŽAXRRR999JJJ'r#q(`  @$xtO@@#$ihh(**>~tn|ϟ?ի&;99q'+..~܀3Sp緬kkkq-]TEEŋgϞ0`oR'OuJNN^`AVV HP@̙3׭[7oܿK޿?{lA( px!ܼysقoܸA:W?gdd/_y(` yFDDd޼yp Bn߾=mڴ^IS 999]~t CPիWI3fggga(`'ZDEE_A8  @7oޜ1cƠAH ^vt CPիW.\H:M>פp C@`lpڹsgMMN:(**4iRaa, , ˖-#? 6lĉp Xqqq]]]AƲe.\@:Hp6{)""tN6xiذaO}3???GGG$l5rQF~ lh6P?~9rdNNj_&))EOYYK _N:a}]DDDz'Or$/a A[nPEMMT/d25559 ˗/_|9w=,>>1tUp>0|x޽ϟF6b``i&A@`ߖh}qqqӾaaa?ʍH܀:&ynnn111Ft(b2=ݧkdd4x.80ݹsGRRrڴixHTfcc#G|79½`:__ot ~/tY/^HII^0Fl ,࠴4++7o׏t>0`?eϞ='Ry  }YSS`0xJP~JJJQ|۷7n MMMϟ?σTlǏ'S~駪cǎu=[RRܹs7nw&122z捔, 0S(`:55 .f ^jӧ͛dzlDNN#ϟoii7,0 Aϛtݾ4mРAhn:}yYYY|wjiiY*^kjj3f˗LB:@a2^^^.] l6SSu9;;2$lK.}9N{{{oݺuOڸq#GlllXSDEEwرsN>///cW^]dINNkʢEo߾M6@8  pF 2ۛ7on߾=99YTT`*GO ѣNZ]]-##C:tdnnr+V|#GN:ի&Mb0AGw޹s'~5@c[#Ǐ}Cn߾M:4y~t')0􈧧'F  1bD^ffҔHg!hzՕ+W})LJt [la o޼yӦMIϻwKCCÓ'OƎK:awrrurrjyO%%%]VNN`/EEE=|@̚5+**J\\|ܹ Qkjj,,,,--:C eHr---6mڿ,]ZZZeee!!!X/\6eٲe'Of`÷n 'z,$$dƍ [\]]Oquu "Mss={^~gϞcǎakk;q~tjSRRJMMm@iinIIIO0pǏ-ZD%%%'Nk.҉ uuuccc555IgJW[[+..6IZZ'{rssͭ7lؐڿҡ|}}o޼7 B7^^^tvH*jjjػwO8w6lfkR^^cǎ&ҡ@PtSC@AUUUrrr7o.))i 𯄄{{ϟKHH|իo t[ZZZ)))?T&''r___Y3 ,YN>0))t. -9s@*Fknn^r}$H~嗘0]v:thٲesXkuu5kh4ډ'Ο?"%%Ś1 A'""-55UVVF566׏t( WUUUUUMHHhkO?~ RAEFFvrȑӧO\eiiikk߲Eo`S l 37<}򬉍SLٴiSÀ9r䈝,@-B @DAAi]]ǏڗFm߾/@ 0iiz-, ,P)//2eŋ/_~Gxx3gf6m۪U>imm=z(  ZVWWo?\WW‚T*fSSŋoذtjժ/^ҕF.EI XLy󴴴C: HNNѝ;wtuu;,&&H@ .f(//_hٳgѾѣ/_|턡G" vvvZZZ??w/'44tڵ3fؿ"Wga0IHHt}O8qԩ{}l2w\kk몪n>&--MAAa„ gΜj<c[ĉ틊½6mѣ{uY鉉  LfBBa~}X|yyyY[0 'Ooذw=xѾw477,//' Fii_~`5kĈt v?߿?j(.ao>{{3fe9 |ڵkJJJ]_S6mqƃΥ vڵjժӧ~ ̞>}`@q +V4tL?| ##^<寿:u={4448zzfb2wE={vܹ7nEEE^|;sn^H60q CRRyӞ={z:j ׯ߼ys؈KQAXDGGpdQӧOߺu믿ޘ4iR\\˗OоB Tgkk_zxxڵK;uԢE.^j*aÆEGG}v֬Yeee\rkk+ġ֭[7we˖D =µii退ӧr溺cݻ# P@  HLL[NNI]]]\\#DDDvuQ'N}  LOO/~g\Ch#6p ׭[G: ,X0nܸ?CZZ# ܿ޽{4,\ PSUU+++.`lٲ֭['O3::ҥK@(h{9996m 쒓 ˓Ѿ@A?s挏ݞ={ZZZH'J@/|SLHII9y$ܼ{n++[^|yZ2-\0!!^*~Jn,8 _ݻwذaZfFFÇ]\\8X>|;w\\\LLL>ӊRRRտL.8 0eʔpjiMMMw633[zuhh(n|N7?q_xeff*++[XXpp Gz!99yʔ)\]K\\ȑ#O<9b {Lɓ'曭[JHHpv uuuy , 6 >|Ϟ=[Kee_pŸh_kt:}ڵϞ=KIIщ%$$о8p`BBBPP7V|qƉ/\kaÆݸqcnnn ,֯_cn> cl`G^x)**ʥ߽{oUVV8q"@=x𠛛۶mdeecǎ]xiٲe+VPSSҺ.S(`HOO߼y3?p]IIv&&&ƽu%%%߃ޱc"P<nѣGYׯ÷m۶fqqqެ 7oޜs%Kpox a6l9r#֯_σydܸqYYYh_6&MwٳgO>}U߈0<<ݻw<^ACÓnEÆ {9rz>5cƌᄒ/jjj>|877g*keC<;w]vÆ 8w0wm޼yٲe?i-ܥa0O O|288844tfffp~---Ã{G~߿?99yÆ _5_x444f͚իr zzzk֬Ypavv͛n5333'攔555OOO.ԡbbb?΃sl0lhkkx999gΜ9wٳt:3'O={VWWw͚5\=g'OJIIYZZzxx8` g̘A:)88ԩSϞ=[|&P|?ꫯ8xñnb2iiiFFFSNyS|]7n܈llltqqٷo<˗G`? TN:u}}}WWWGGG^z5jԨ~K(`YrŸqH(++|?|ꪮN* `0AAA~~~qqq ,Xb1ן9s3"(`~755%%%RCeeee@@ӧOW\iff&g/R\\w…E-^XOO`'$$DDD~wu_y|֭gϞEh>| YO:{իW\"""tS&ϟ?קP=IDAT.]ZZZzzzgvtt$?(`"U ϟ?711111}`2IIIaaa!!!RRR祤Y[[Ϛ5ksh4Z]]ݳg N:P<wQ]]m``hѢɓ'2g{.***$$$44T^^fT ݔkkk;{lmmml* 22rĉ::::::<--MRRr„ cǎ3f̸q㴴J:fWP|ĈDT_n&YRRݻbVÇ>|OMMMEE?੭}MwԼ¢A#FPQQ2dȰax >r啔+***++>cp,--e) 2DII>8lذaÆ)++2(`o޼)---+++///--emII wޱ*:tP%%%@o߾-+++---,,,,,$&&4dEE!C :TQQQAA摖111UUUeee֯aСߍ"L Y; Y[_y:!Yk\0(`󝜜deeeee H' pMMR)zzzuuustJ=x`bb ڦ,[lɞ[ ݕ[nD*g B负A*g Xk~jkk5IZZw 4pz^^^l-'@¦RjjR۔R]]ݒ-[ FCBޡl6![o hii:~xRy>K xΜ9~~~988Yjww5kh'N?>%%EJJw `eѐw(h[Lddd||jBBBDDD ~l0eQ6 z{D\~gffF:{ FCBޡl6![oq)u?t0A wP@  @ 0(`P@ADljjjR'Ǐ맢2sׯhgggEEŁN?IIIk׮ί2??IVVVVVɩtB1*oG4^>Auٗ.]NTCCcǎx񢡡wܙ4iҎ;Hb2LfnnѣڧO9st?~ΝiiiUVWWTTTTTThjj֒\m7F6|OAB˗/gR;jVVL&߷}N0[UraRy:C _f nGo Mђ,YS*G{  4t"J [Ξ=mݻw>E3kCMj 7tPqqqeee/^?ϟ!S>|`[f ,lN0t JOOi?E[[;##T>Eٿ1 oR=EMl~]___PPp!C<{t|׻vjjZfjnn&ߏ3&::t(olll?_~t"/[&exPTQĉVVVS0Lf``iK.x{{N>=22t6(DƘ4&w?*tg0TJJX>ͦacvu1b/StPGG'<<(#}jȐ! :TPܿKrQ@CD5ԔBHhAXRCCcKPKPJSHe-RH$yj/ΏpZIZ~Ռ"gcߴ2RZe~{i"o*72nccc|f{~~C0 T_d2G*O1a5Hjo2flN/FLLLHPct:...S(T>>O:`<gffZc65;(wwxxR,bXOOO:U93855uttޞ:==Υ֣)~aT~|| bpݟҹ /&1f-Cf5E`Ŀjd2NgWWZ^^-C:JΖǭonnR:?uz \ZM6c(r8# Y2pL^c&ZLhkW(<@ 0(`P@ @ 0(`P@ @ 0+Ryooo^*@&핎 '`Nsww7JRDh_8ZYYZH`~{* jmmmrrvggG:`O<D"fu"N'`Ba||v+`: '`htiiܾJ)dzFeS @ @ 0IENDB`gsl-2.6/doc/images/rand-chisq.png0000644016036000116100000004553013373111455013651 00000000000000PNG  IHDRKbKGD IDATxw\gYA,R 5DDb41\z?cb>~\.W^^^WW'22~?*^qcРA\.w;v(..'pa (:rȇ~hѢ˗/wvvN>t.|~SSSVVw}`ggF;aQ 8|>t222y睤$---|Ͷm(pd_ʫ~?x`o߶|a}/Ha @߿?־EKܹsȑ# 4z_~y9VCCæMLMM:}ׯ3fddxzz*++kii}'MMM/ n,))Yv!C6mhnnVRR^~K؂F;vXti/R |g:@T|VSSvEEŶ7zn!Ϟ=;m4߫^^ڵk[^jooF_577ijjwĉO:UTT^VVeOOOl.{/^չsLLL޽ؘyUV1.^>(++,X{ ==_ϟ?xIXxՏQSS~/^|9얖/_x^/^ y.˜{kƪgAWVV9sFCC޽{}yikk8Ο??22~ ֭[>>>&&&_~/Gf̘1x` +W666 ;v`444Ԗ/_0C QRR:u*6F=qDnY1jjj*''_qx<>x3g >׺|}/׈#l1`P` ̀@  @ 0(`P@  @ ))YFMMzRRK.щ%O~D d YPHK7o{/$C=|$s{-*FFFyyySBȑ#I1%hQYSS\X~ t %%!CTTTIJ H*4xBE !CCÂ)@E3`x@͚ܿ5jjj?l"P"4rȂq8@X.]K:ē q?vC.+]BB &,--assy`` H2,Z(`PIIiAAA#8h@L^xQp5u̙c^,Pedd3)(KKˡC3[x<3|u ^_PebbM:E }qKKKv^߿),255!w:%%e׮]֭c}I.ԒGx'wuuTWW+)) eaii→xzz7.88Ug1100 __M65Ә9BWTT|=.Jc? P >,--* X䌍sssI9̀e(`Ge2qI***uuu >8p#H1f)V@ O󨨨<)00pݤCI*0 YZZ1fss7ɏ?(xI"E1(`6p܎jA@vuۃP++~GQ(`00%x3`̙3ݻ ~555[nݷo %8 YZZ:4>>!WVQQ}'ߟͧ dJX=uOv][[S;{ҥK)))o9s(vp%,%h Np:%%e׮]֭ctii={d}E f 8fZEEsٲẹ}UVVΚ5kL*Q,8xBAAA{;EDD(**ѷoڴQ<1$%hpDv3ŋB3@effZYY-Yȑ#JJJo=][[&tHt%hXXX__`f}a]]ݻw.\'#AK>fΜy=f3TSS_^^K: fZEEsٲẹoW3qqq(Cp R|}}7m6jԨӧO>}̙3CBB*++KJJN8"J+P Z(`3}p)@Pbgƌ8 p SبW\\f̘JyyyYdeIll, |(`^rt >Xk7bMQԣGfΜYXXKb%heaa1dȐ$A@Pn/_& ,/]D: Xwtt<|t&p8.\  ,{=0AKB SР%oPP\, +rH =< rc">ׂɓSɑ +p-htuucbbH!@KE9st q\k%N<)*--*..}txK(`Irt xK(`I5y΄Am%ˏ9B: q?ۈ? sSS'O p@KK㤃$eLQԃ}܁ 0ڎ1"$$tx3(`~No,ϟ_RRH:ēO1 ,s$$,Z]]N: TIXUUU??}%aS=vH {{C =00446mڿ/AO$oISu޽E=}̀\\\ HדȩI gdd _3`iӦ]ztx ټy~+3x 122RVVVVV622 a'"///99k׮ye\R__ٳSLqFYYYYYٍ7&O|}}+Vb֭W[VRR222ڳgϬYz|Bhhƍ򚛛E= oE: d#p… _վEyzz&''/\P?8ζm0 g=IӜ+LC7W_رC ~J/`__nkkk-Z$H ΀.^H:ldd4vӧO3["""E [nmoo'vjj+{_u̘1"MVXXaÆOo>W=tҟW8L1c'|B:D"| .11qʔ)ַoux|8aSSӘ77LLJ]zuᤳ9(((11tYf͙3gݺu&5FOb;wnɂWA$ORVV~X^^nll,t(u˖-)'a 4JJJ#U7nX^^N:Ho~嗽{>yt? m M$)/|++lĈ˗/$@~fظjժ1c,^X__̙3YYYG1P^^~{WC|>sԩ_~%,b1ܽNʎ1 IDAT`ZAASTT5,1\Rɀ5?EZZZHgI7nhoo'(jٲe4kP455۷d޽ P۹sܹC:L@3x˗/'%%5* lMM'N,]lY [g'a=OO:E:XY%kgA jiiquuݸqҥKIg **மX=R3zh6_@ ~2*++kѿ ڹs X{QYkcƌ9s̝;wFgvI˕+Wڮ]A(`q>|811رc"LC=a„7o:88@դHKMM]rezz(v`__߅ vttb2 ,Fadd4gwwWvuu w}݀w2;{ ǀ/^o߾u-YD;uvv?G wb`$0CDtww~w p.eiikŢ?A˄lݺnݺy566 +B gcc)6mrvv~pR4@?INёchhh8s̡ClN:::yCC_UNb0SNNaԩ^^^۶mb*1$F(OR5dȐ7n?~ذaR~}y2?m:TB_ r==='L󍍍RRRI M`ۑcqƑ#G.\_zuՑ,`Nb,[8wܦMn߾mllL: $,_-xӧO{I 8 o 55W\viӦ YPlmmFp„>lҥӦM"@R`gp ^x4lذs n߶m˗Ie"*pC: @YիWDEE/0H?޽{)0ffffXXW\I:8Zk-,ؽ{wtt9,o~zuuuwwk׮988 F tÇϞ=;::Zpe:TSSC*Y(`w}788x/^d6.^866vԨQ=1`QHKK3gΖ-[֬YlrJJJ fx|U(`˛={9s~i`dd߻w/77`CCCC'O\ZZǏ?nܸk=4 C]|ѱuttDEE?ի#F`-!c,Cʕ+W>t萏k֦B*AHy9w}͛9N/O~UxC&#0dkkpB{{#ϟ… &P@;w?~>{|//'N;wN!;{cD'N|=TWWwuuikk 72*0)qqq .\z-[{EEE!d.2-111""ӳRXmii1005k_x! ċ^ttqlmmÅOEEż+VܸqcȑVnk=8\lي+m&'''644 k p U(`1QQQtӧOx<_$ ,raaasqrrb_|񅉉_|%^07)))|ہD:IMKKΝ;{-Xf X 566߭[N>*5448ju(`V˗׬YjժJ^^---fff4cEQOIIquuMOOg?@NNǘ1c6nx֭N3tT'Nl޼y͚5[lay*߿˰*D(--]jUYYى'ƎK$Cgg? bK_~}ڵӧO߼y3{}O:r (`l˗/aqq.]w՝={CI'` Z'&Lسg&8EQuuuHcBKƯٳ~,l1`SVV޳gOXXɓ'ǍL:Qonݺemm_޽{t` mLL̚5kV^s҉z6ycǎ 4hƍ:::{!X` Z:ر̙3۷o_z8^5tǀY&k׮ݽ{'8o,,,LKK1`deeu;v|gOs,Xɓ'K.'O.x`XPNNU{{-̙ ;::n*#((HpWYYYo&}}}??1cƈ(`.ڼk.y9Κ5kG9NIIIWW9s0p~7f8`<@/Fz|ǏZjÆ ...zrgg'+yyymܸ|---f !344dMMM|3loo?q3*))ސِ!C^WZuጌ ^EDq]]3ܹsgKK 3d''3((ܹsnWWWMM 3lkkv3lhhذa3f̰СC̰nmm=vMMM.]ϟ@҉4=@ ӧ뙡IQQ3{t~QTTtuue?3433KNNf򖖖ZZZ|>ǎffffffǎ{ɧ~<6&&F?mz! jjj:t(=,X0w\zXWWJ.1qdZZӧO}}}9BSRRf͚%(`VI}:thΝ@??~JJJߖ,Y%/akkkkk8vXEE7Cggubbbyy93?޿qq?HZZZ&N( PIII 2---/_^hTҍߺu_]j=P⨫ɓ'qqq)))B[[utttSSs Ν; ez xR 2+மٳgc*ƾ'N=zTSSsժU/fVSebSSSSS<緶27o8W^MTUUqmft-[|||H~ݻ~~~ƍ#Jļ;SL+vޙ3g\i衿7=LKK6lH#(`VIhwuu׫ä$ccc7%%%'O(O` 36l DII?ٹïzԩ0''GGGr,(`VIhTUUC"!!ɓ.\pvv^lټy#xYdddII#YMMMf|ƍΔ)SΝ;ΝkkkK?*//O$* URǏ]]]oˁIII>>>˖-sssڵkΝ;RVVfkksI&ݟijjr顏سg=<@JR o[PP-JJJΜ9sɶŋ/Zܜt( ŋѣGf.\0uTmmmzpI+++zxȑ d4 U\o߶$D%%%ٳAAAZZZ… y)gϞe˖1prr|2s+Wf̘!7 kXJ?t !EEEƍ;x`yy9h#<<|޽cƌYdI'ࡥ>L7o3Nf8iҤf!wGX̀srrCqk׮/\+,駟mllaɒnmmMǬ|Knn1ɸ 3`ٕt f'O,--OLLL<<<9R]]M:4knnܵk$^9nر "֭[EN|7}͛|ckkM! 8MpGGN?>,,[N5,EEE=QBȯt+VJ* ѣd/R秤\t͛s>} hѣ.\?檪#FÇ:u~.]bNs544$Pb;::~駍7rt ,EEEW^ w'.AJee>|1^1ոu֕+WOFQb|>δQxaaarrrgϞ3gΔ)SHG=ZQQann>zh333NƲ͍^t)::: .\ˋr(`VSo>q}Wvdddܼy͛Ǐ={6>)>ã~ssNccٳp6oLؗ]Y% UBq)Hroݺ4yO:Cyyy=ŋǏ3 4 U}ϝ; ޽sz77'ؠ%}ÉzOO`ҡ U};;;0S\\҇+++ƍ7~xggg^WWWǏϜ9cbbbjjjbb~>^MMmt[XXZE?|sΙ* ̪ݝ...Š |~VV֟Iqeeq455IaO`&߲e PfD*)))111...11QCCuر "ذe˖ zlbb9zhҡ^ ̪~cccq IIIO<133srr?~)NVmmmO>yyy '?U0^bŗ_~ijj*HR5===!!!..޽{555all>57o>{lUUÍv~ 0 @\MMMJJJJJJRRRrrr]]Ig6x<QF#R(`V322߿oaaammmkkkoo?vXIf?EEEvvvB? Uov|"x<Ç322RSSSRR233\=KU336CCÑ#G~} Uovxw}W]]]))),9%%[[[[ZZZZZZ[[[YY $<{/zm#322Z[[ 0vGDD|7DjkkzÇJ/ A/\=w0v744ZZZ Dӧ=777733[YKKtR` UX:;;sss>}IƎ;zhFE4 U(`x>}.ꚚZYYYXX76l (`Vvo?ˑ@lutt<}4###++qSS }{ccc#G$ UIII,GRWWGE-,+ IDAT,+++300[^622200PTT$^ *,A(={"LTKK`rrr# ](`` ϧc\TT_XXXUUe^Ç/τC ̪?EMMH$5---Ϟ=+,,ϧ[fԨQ#F>|8}qcaÆf }5f0CQQ¢f\\\Fcs\z){Ĉ#Fױ q9p XTQQŅ\YOO={TYiRUUEO JKK+**  Dϒ tuu\.} ~40|><Tg%%%칣C[[>ruuu#C%%(`V &LHNNƝ@466VTTTUUTUU|z5>1[___OO@[[[[[[SSt|A]^^Nߖheee%%%UUU6zzz:::#FPRR" U8 UUU奥g+++/\.]ں:::ZZZs*0H=.骪*---L+kiiiiiѝBT0;&&m`YkkkeeeEEϟ?/--(++{Emm-MW֐!C0`@YEީSI'ژJϟWWWkii :TCC>;lС1i!MMM--W*,AHΪZ뫫+*****ꪫJϡtuuUUU7mڄKQ999]]ݾ|Fx񢦦^]6Lz0D:4-Ү^J:H-p:;;H` hX*(`P=HGi pQppTA %\XX3tСCsB #i(`noo_PPPPP`ooԟ} Rp޽{SRRN>lYdn8 h8 7׮]B*kICgffn;vGHx-i(Z -555o?Cz3twC0 Sl#.r-vvveeeoC;EQ8 wiii[-,,Hx-i(s n "൤afŊ| EQ:qDZZ[_LN@P% 2$:::))0999** qz_{_(J E_I7e0  (5wH1`  @ 0(`P@  @ }||:tP"҉YFMMdܽ{w…ڪW\!ؖb ###}}iӦ]tI诂 sww/(((((hjj" ضtRXAɓ'WUU]rG% X~z;;0iӦ;wn߾]!e޽)))Of,YySA/~f $==}999dSYB'fv횟??RyQ HpKffc>zTVVVS1uuui|pE(((4663[UTTZ[[  EԸ'N$&2}PN1YEEÇѾgfffڵKGE]]FpKuu<@VII̙3m6uTY$E>}Z'ãbii&%==‚T sϞ=Xptt>Q;wn``@///RyYf޽ݝtqqq' /+WjkkkkkwE_ t.`۬Yl2{lA3gTVV8q?*87lEQǾ} IxJ3)=USSc? q֭_~Ν;uuunnn_|񅋋p_ @@  @ 0(`P@  @ 0(`P@  p/Rp˦M,X@*|@\TWW^v֖Yfs\ f_Zregggggʕ+g/(` -_ʊ߾}H'0tWQQQWWmjjJ:tB@wׯ:u>|xq^bŃ"##I'N:99E=zhܹ)))ꤣH̀֬YKQŋ׬YC6T ̀@  @ 0:LFIENDB`gsl-2.6/doc/images/rand-erlang.png0000644016036000116100000005023013373111455014003 00000000000000PNG  IHDRKbKGD IDATxg\WY^U`A@@X@Q5TP1 Fѐh[L(*FwTD{,)HIuw}Jݝ3{?\;=gΜaq8 %C:4B `P@ `P@ `P@ `P@ `P@4Q| l볲D+~LO Gҡ7ReeeBB¯ZVVfmm}Vr Ŵ?bjoS3z[ZZg?B^X`8b,Xf>|?XƆM6)((c޽o3f+++[jׯŋw;+V)++khh= >`cTVVΛ7OKKKEEegFjXͮ]fggbggʿq(4޿/I7xggg߻w/==}""" :k׮gr_JLL3fĉSRR㭬Ν`'O~g+#""JJJRSS@3gׯǍ䔒l/ٳgfZpaZZZjj?7DFF6h0VZMQsE wf͚543lƍ/RRRlUUՒOGQԆ _Z~7|D*~I&۷@WWWfM7&@RTUU_gϞJJJܲ-++&99];vfSRR_MNNnmPVVlΝ;7++%i#$%%uҥT-)ݺu)==K?oL.htK/Zɓ'Op8UUU W7رcQQO>u҅["--MOOﳕgΜ755577 49OGQgƍ-HMa999&DNNK/?>88ZEEϮ|TKK+;;g-qʕÇgΜ߼y9sI?~YSSԖfyyyktuuyM7&?P򪪪yGiΝ;ǿӭ:tlll@@%Kзo___߰0&EEVԩS-5s=>}Çy?7q,k׮zMԁtƏhѢ۷?~<--o\nݰa(pBBBBjhh(--}͕+W;dnn6Æ >|O }ƍ_l s&$$N6s۷ﯿ⾴x >|;<88&|rgggMMѣGSuk׆0y/BHVxzzvISSǧop8ѣFRRRԩo^^B 嵵0+ޞݻֹsgEEESSӕ+Ws_ 333VĖ(oررc 433300X~}}}=M˶JJJJJJ -twwаr Db =zTZZJ:W\ &J\M;;;Ϝ9s4G`˗oݺ7U\\kRRT"kLz%)Z8M6)((c޽ɶm'455jL):...ᕕ_UUUDDDaaCvu0,,JX phii޼ytVcٛ7o655UQQqtt ܵk>p4~jSLp6k,E{{Db;y䠠Cߟ;Y%@ӗ?}dffG%%%:Sg+P>|0a„;v899 / CahiiY[[ߺut~]?~?~Ν; p[L:ŋSSKƍo9lZ .hpիWvv"mC_جXBB@4޽{߽{tZEGG{xx|;]\\L:XBn#777B،kmN`ﴦ2JtA В,kk:Г .h޽HvSN=w -@ ;233999RD m.|H'v:uիWkkkIóg̙cll,//7j(ܐf(geeXp͛7_~bŊM6[t.AX>|x)F`"*\SLqFyy9 M>pӦMFFF =zػwow+'''++H!rpp~: 󫪪(,,}3gHh޼yc``]xy-555$X&MtA2k,E{{DbK̿ennS7o4EF ,puĉ"Nk222lgwwFFF1a1f~] 'X8OF-ɓ^zљSb 1c._L:;6$$$//ÇGolB:XBwwwLmժUǏPVV xIK%@.v5::Z___~%'MtiA@ ɓ'I1,LÆ +,,|5 t($##y A0K\rOHH=ztzz: 0Kl,||)-@;;rss333UTT .hqf\B:0 Hxyy?~t `.tA j}}LK -fl`QA/44XT\WWE:0 yxx`%d,99 AXb,< %̙3OALQ@Lfff;w @7`¾}NtC&l„ P ?޽{IZa ***211IHH`ٴZ$YǎLL:-`hnS?f̘4L (hK8KKK33˗/4Af N4AfI&eee|t 0S߿ta @ ,={s HC XR-`GJMM',-,--Μ9C: 0,^x׮]Sh3رc"""HBft۷"AXU[[kllگ_?1 HQA X-`O6 4C Xtq̙AAAHo1ZE4(55UEEt)4266:t#GHcDSi(*22rڴi߿С,-`)ekkkddtYA@Pnʕ[neHƎ+##s A@Pb\rӦM0S,VbT)ZreiiiPP VU{^z i0 HSSsѢEׯ'ZAz0EQ=z~5,-`hʕ+׭[G:5!v-`jkk{u);;;Y$Z yy~i͚5@KYfeddDDDCrrr[lYlYcc#,Ќf paa}܌UTTTTTWXXHODhɓ':uth pVVܹsN:5|PGGǓ'O͙3'++θ4m۶5kTWWM.%%%cc;w7NaaaK.MMMeBq4?777{{e˖ LE9k֬+++7J??G"A^ йsgY悦`oN:xC༼|#G#GIOOOOOqrrl-%x˫ӤZ1%Ң9u!;;իWwرcǎW8p`pp+aX,V@@U***HgѢ=hР;wܻwo„ "u5///5^^^!!!"=D2dȶmH|ʕ+O:]1|OO׋(͎cټ5999gXl6@KKkȑk֬իW.1׀_xahhH: !y 8---&&W})5jTdddbb(quԉMΝx"##mmmcbbDOZt/6+**xkTUUkjjZ7o6<-mVUUeiiyÇ Nn&vA&77ĤmG.h/[.::k 4@OӷPUYY#HEQk,,,Zv+榧D:PT̙3_۶gΜE,ggǏ9~K ~ܹ x۽{͛I/AM01((۷eeeeee :t_mgg'Xs}ɯZTTTTTygϞ͙3NNN.\ɩKMM_7nܸeQk3g_H:u޽{ܖw^ӧqiii/sEQNNNww߽{w޽>,))a#G\zuϞ=|hURRbnnbkkK: AXdIp(رc,,LGx.h$^^^त$///===999===//Q'aX{Yv izjȐ!fff=*--}葩C||< @tRAW]ƍ0a‚ W޽͛aaaFd_檨:tШQHg`.TTTRRR'(*''DRr' ХK*((P$a}鯳&L`aa}vAQܹs<{h"}vޝJ:ie]QQknn>c ==?}ݻw0 0Su}//8MMMYC4`.\XZZzQAC~رŅtPi%'O|,iL+`V\;@aΜ IDAT&,ۆ O:E:dBSOh]]]Y@4PyV^A@4}AA$ zݻwC}a^HgZ@LϞ=lQSSC: @SOSKKkݤ ho%%%{qvv&>(BSL]I UPi%k׮}Ehh("vڒ۷ -&ddd 8Zݺu ((( @'ZZrW_.#p fټysyyN:BSO[Ç pIgqvz!OOO\ h4@ VZ˛7oʒ |V(-leeuVY]P222'OtٳgIg'h @ yyy ,;z;w;11qݺuZZZ:::=z?~<m&A;;OOO]]Ν;^۷ݻ]]]###;vRZZZPPVQQ!秥!M=K__6}ɒ%7nhɀ'O,\۷FFFwuu8qb R u-//ׯ_744a'[no/^(..>yСCp8&MIa xܹVVVnnnOAAA6m4}tsK3g{AAAb:t(==_TTTiӦ]㏯_OZOºkkk:??򋗗 KII9vX.]ϟO@0$0bĈ'N5tV5`Wϟ􌋋#$..߫9P%Jnn. :4 Ǐ2z{{,!}||ΝK:`DGGG>|˗&&&V";k=zVVV&|}}333^*''G0FaaaRR fqAX3WWץK.]tf444L>]NNĉ22}1L+*NNNHmmIgѣGvvvd((,vJKKGҦ~ܸq ]t!mH 9oܸq={?:tgeel2҉@'Z46lغu|||Hg C4P#Fڵkԩ.h(jhh%D8.\x YZӧO#$@gϾqFCC,BӻwzR~eeeVVVO>% XpaZZZHH,4pK.yzz>xt橩%&&yyyߺut"W)޹sG]]t˗HgiƐӧ"AXb`r劃 "t3g^zuРAV ,R"<<ʕ+vvvPFA3f̑#G&Nv?ȑ#...Ϟ=#ttt >|P@k]ą͚5̙3#F /\ϛ7o@0PӦM;rW_}E:Kq8z<^ @|ӊx>~̙3 f`ϟM\AA/^]LKK۱cG`` w^AAA1Z%?????‚vZ_F. ,JCC͛555_}Uii_QQh"ޢAx՗(YYYU_y՗/EQjjj:u-8p`׮]Ry4X@qx9ssCfeesogҥuuuEeee+++W]h_~۷a߾}'6>}3x{忺[)`3^^^QQQ}狊?X,KKK^b͙3b 3n;,^`'Oؚl6?/YxM?~o<ҥKw=~-gϞ"ӹs5k֤899͝;WMXh oo_z5''<sVAAAΝ9yɓ7n8gΜ/m7lذӧLӦM366.8qYSSl*Q ,ɔاO AĕݣGm۶jժFʇ=z;}P}nʕKQTBB1 Y($+V`lX055}ӧO'NXRRBQo\˗/NAm޼YCCsCCݡCŋE`.`bΝ;?AMEEEAAAz1x`ҡh;;;3fĐYY}*))sՊ/_,, ׀KKK---Ϟ= I㨩QPP^fٳg F6<{n+Wӌ 3qֆ;;;(l+V޽gܹfiZ8p sƍ+W}xOKK# @4P哓ۼ_ti֭%,mdeecbbƌ?B=tuuy***|ڵ+ s7|O ++˗G~3@,޿ѣG, 4ŋo=zh8ٱcǧOHgi;^(G-x֭[$B4&˒%KHaN:EEE)=={X[[>}2JPPЫW̼I'j/555+++b}}=hBzCddɓ1HVUUIHOOOGG]vL(EEE֭#Enjll~_~!H5`pRRRRwN:I{߽֮]y[+!!ѣN޽Ha]IIi…?p0PLRmf͚k׮mܸq֬Y=Xb466&''KUUUUUUZZ[[ؐM%0 H Ytttk׮?~o߾ׯ_'HȠƮ]?ݻ1]b'ZV]]H:s]~}ժU;w޾};&jkVUU͜9o߾0˂ ~'===bqq1GkK<i}P}=ydOOϤ$҉ěIuֲ2҉"00W} 0ӧ)SH"!++;{wޙϝ;W:NJ ƍSRRٓ&=K\FF⌌ U*@:="IRp8L*EEE;v8p3V^fI'W[[ҫW/b||gϾ[$Ç˖-']8pQ}۬cǎ6mzm,--WXK:;|pAA L!//ϫE)((hkkkAzxx.YYY :EEKKkΝ111555˖-'Jrߺu䫯ğ155NJJzo1''D./tA :##۷o[XX.?믧O3gҥKuttH'W^=}3ON:Xz̙3LA֞ݽ{WtD1&&#33?}ԩSWX!s7n "p ќHh-[{= [6=h //xҡ$1Y.\-zxx4@N:ٓt6244<o}~pqƍ? ))ҒtbŊ  >_*.\?n߾M$444<ƍ7oLNNvrr3fSIG֬Ys 0ֶG%\L/ɓ'O8q֬Y'Yf-__yyy7o޼};wF5nܸ#Gvؑt4GiiiTT˗/_xŋ7N>t(L+[nd'B /!!!""",,쯿222>|#;uD:4/<<\[[BAAt1L+ĉ.\r HQ__}{=~dСÆ >|xΝI/_~֭$###---ҡ 0%%1cП6m{_uaȐ!C 5c{MTTԌ36kkkd(b}?ӧ M{_}D5IDATF{{!C888&c櫪ݻw޽\]]I"VL+(==O},,, Hgե>)){f%%%:tL+Rǽ{&;Ӕy&..͛7^ѵݻ7?_{]|yǎ ǍG:@>uTttmFׯ_~:>>^VVgϞVVVz233333޽;n|Ǐiiiiii={SGccc}}]y2 0O5s̟~ s;G^^۷o߼yngVVV-,, {afffI'6ND}aOOOzL+鮬KIIl^᪭}mBBBRRRbbbbb"~zlfffbbobbҭ[7L.^6===?߭[7CCC//?V}ҥ w bĴ\CCCSSScccSSSCCnݺ&@qT]]ӧOޣGoTZZf ̚,}Mᅤ>[CCmDD~hikkkkk˿&)))55533399ӧ~Ί ###SSSccnݺˊެcǎo޼<~xYddHw8KJJ444OʔO>l^+YWWk׮͖$~mddWMw8466FEEMǏ999œݵkW}}.]p+Nnݺt邁׀i%ӝw%79srr>~9'''???===''GCCCGGGKKаk׮l6[uuu?B3 00%BSnnnnn.w6ر#`訫cJ(;$$$55uѢEB|)??ӧO999EEEyyymIr۹sg Ν;kiiuI]]fwISSۘ`bVB9YYYݻwJ$^V񒒒 MMM mmm---uuunc-##C1 p3222/^|mFОv9Npp7&/ftiiiiiiQQQiiiII ¥***̥"//[TWWWSSSSSs%%%%%%WTppSGLQbbbۼ#G-, TGG:tܹUO(++cn.---//+...)).---+++//󪪪j!++b455;t蠪*''@AAAQQ[EwBFZvz'xkfΜ9p m,… n_ZZjoo߶H ^{/**(nhh(++/+++))JmAuؑԦ(Iέ:tPSS([ڕ:tms|m -\vmժUk~6`l]PP 555r8b^SFnT}W]]K@UUwEqCpK5*ZMO>=y򤦦FNNN Y" -`6kk6쭶VAA!''GS׭[w6***jkk?9 :TEE*22H^^{NUU { ;v,.[lϞ=/^888?60g?99Z5 5u։Qp)̄&8im68om6;opϵell,8 Ry% k?B*@$Go߾s(ڿ#Gbcc<*:j'mp p]MQSS{ndd/ܹYH|Olyk6Ikѝ7YQW >t68om8im#/DH5` @ 0( @ 0( @ 0(榮料I:xdXkkkkhh]rt"ٳ9s5ŋC333_~9&=====ɩt.17<~t蘟ʕ@`ҡ… o޼Y^^+Vlڴiݺus aA }x?v'N̜9s .$Ji-|[PŹ&%%M% PTTD:xعsgLL4%q5///5^^^!!!۶mw)w,!&&СC# }_ӧO7oސ#,,ʊt 1SRR½wߑ"9F:8Օҥ۷ouԉMΝ I)QXXzꀀAw8?Db`ɒ%SN#D?,221&&FWTTթL%^parssM?bYL^^ޝ;w-[6o޼kגh!!!;vwmrk]0),T("EAA LBP [6`iFFP!?.#ED8AF!X1{޻q_g)Oq!3'gS9 /TU5 CUב{כdS ? úKgd2911q}}-Sknn #,4M\9yan[*n```yylV:gN}A:Ge_h4v$ I偃eYϷit{;>>nkkNٕ:(N677{{{+< r\.[\\A:8K^wccC:oooY(nnnsK4Md2B2 ֦R^x<(+++oOM#}sFd$9<<,gvv[:pSD"Yi  @ 0(`P@ @ 0(`P@ @ @ۑw\\\\T*U]]- pvʂUvAT#@;`P@ @ Ttn\]'IENDB`gsl-2.6/doc/images/rand-exponential.png0000644016036000116100000004136413373111455015071 00000000000000PNG  IHDRKbKGD IDATxy@M-d)R&bJ0}l3X,`Yf,؍1d;=6KRB*ίO_=<{yuJ~s+((i]D  0P@  0P@  0P@  0P@  0P@{ ѹ$۞S7MLL:t0gΜ] J_~0?UJJ/ʊ?[lsNd[@)i@C龝Jׯ{{{:uYf*JU@}%2`3f]2}}ʿOԩc``Qsss300000pss;p@Czzz^;wnF7n|=}t֭+WܨQu֕kEGϫWnii9}/^b899MKCCCWr asrr>T\W^o~;K&Mt~q/^b o[٣G;w}NLL̔)S5jֳgݻ}3UNNNŊ]c\[~~D{,?@Y8 x曀zk[kԫW/F<(Y޾|a1vܹvږ-[d{b%r{رk ---w۷if޼yG.f%kٱ5k|iGcbbJ,?@Y%Jرcwիѣ_~رnݺvI}>w^ggl#00i+Wйkcחb2,44tɒ%SLQرc:cǎwzbvlƍ/\PbU4MujFDDXZZv˖-KNNNNN^lɝ;w䏞;wH~mJJʖ-[jժuҥb[0<<~6lxqFFƱcNJU 5k{7|O??LUN(\?L:nݺכi߾MrssfΜT 7Wݶm͙3g233˱cǖd'( R:pog͚5pfdd5Ȩjժ;wqF'޽UVUTRJVnWa¯CBB|}}W^Jcǎ䅇-_ɓ!CԪUf͚ϟ?/IUTnݺ۷={kYɓ}]vʕmllf̘wRw؀[[ۊ+ϙ3'//${l?@)8P8 00o@ (`@ (`@ (`@K ڵkƍY,aÌϝ;':%mӶd f@^ѷ~pTPA@}픥S##{YZZ*+@C^_WfMLpBAڌԮ];$$\)FO?NZZ2VxRkzzzM6 355-[4c O0+ MLLde%(-+NbbSTTTݺuE'X33Ϣ#` $%%h"<{LcԫWoĈ ,°aÌϝ;':ckw?~loobff&0 #`ԩ3j(4 )\i'O4i҄A0ͥp$W#2b\"k5jԏ?(:^DBpIM:u۶m J2|J͞=[{Htb}eoZZگ*}$(#+>6ubO6nŋVVVҧx/[NN~Bb癕[Du&Sf͚ǏD҈.+WJ& L<9(((22RtxoÇtRVVVZZe2Yrr\:J'&W-:]e믿vvv\Zϛ J8,w/oަM)S@Y![\_7߈`piǟ>}ZtK|3gꫯDbYP4tG?~\tFK|s˛J@)P׿rܹSt桀KOOOosrrDg)9sfu544tss۳gD.;ج]VtB=zgϞٳg\P۷oW^]@iӦ-\bX7nݻk2\ KRﻻ ҤIZu~;BLedd˲ESk\ K}˖-{ C988N+P;<ҢET #pjj5kڷoĜo6m/:{ÇzZjU wzE̞=[ʧ b1Vtw׫"߿k׮-RR:IX*Ȱۻw*R@Y-''G__}sLAjJyigggWWWH100={ԩSE# X?~~AjV/\pڴi Z]t\b IX ({TTTǎ#""ԩu$=iҤ/_ZJHwwZZU0h>ٌ)SPDFk.Aj)hT4pԩ#GFEE+}U` ZtqٲecDGG֯__(gAKJ5kVBBƍU~QRigee5klÆ :tP&1`Qj? ,@4ho)hT:-^n]nP,ɦL8,)i 8==~Ϟ=ZRIXZF}ɓy:?//oLA˅y{{q6!KJd'O~ڵk%"(`II\ϟ?oڴ͛6NfիW_x+: @"Zׯw*OAݽ{M6׮]333xa ZY[[7nʔ)X!#`Lŋ͛/[WYВU2ȑ#cǎ000P,),Ɇ bff? (DKJl?|EGqtt IX:~3f̫WDg W :@UV@ܝ;wڶmǂ@,u'M$:@%(`_۷OtkUC0-w!C׬YStE| IRS2O?[j (`IU?{y񇇇,s8 Kw#G4j4Sj5>|!7 1-)5,ഴ4M6a Z-Ydȑ/_ׯ? :@ nU\RRӡCEg4d2~?QrssEg aF!aAesb܃ZlyAY@1155]pѣsrrDgnff6|Ash&@ׯO?5hD0ԓFgkk\4ׂpJJ_.: h!U @hPOJ4=zޚ5kDmYdɓ'+:4l' d'44Xt%)M,`L6mڴ;vڃ)heA撚C=UL&t钅, D5k_ >իWCk/RJPMkU)͝KNNvqqٱcGvDg4CzV^痞.: @1ꩈ>u։0ۢEΞ=k.A hPOc,ɮ^ڥKK.5jHtHQ...3f2dH^^,CKzʥ5#`LVPPЭ[͛/X@t<\ ZRT2ΫW4 ,)-+`Lv\rA&0ʤ}Ǐ>m~,.C6l <8))It~0>۷˗/Eg-s亂Sr \ Dg񘂆D֭[ : h3CGrqqqmڴvIزeː!CDgDC1/gϞYYYV.4trmܸQt)hf͚[nqBP @URvsskҤIE\LA&88k׮GmѢ, )!k@@@=RRRDg-AD?|޽{sJP Z` ZTZTLAC<== 6DDD̟?_txPjս{iƦ~ׯo߾N:5hРm۶b y[l۷۷EgME4:u4o޼]>yDtHgAЗ_~y…#G*FiK(??+Vܼy8|| H~3gFT\900p˗/4 CBYծ];((}ӧ88ةǀK!44>ڽ{,4sttܸq#zGXO>}YbEjj4):w<Ν;߿_tPwo-1cƘnݺcǎHJJJJJ:p@lbjj:zD)B͍1b;wSUT\x':t/VeB8\F3f8s̱c Dg2p!#F\jժż8++kܸqwwX ƌs{VXQt(=%) ^zէOCC 6p,aʗ/m۶3fܯ_ 4H5%Trcǎ͝;WtP;.`KK-Zl޼pѣG]\\U СC6mZt,^J42z/JO<ѣ2{ɒ%o{G2e1`JHH#GG1-[^|cǎ͛7?uꔪ7##9.....+++_*bnn~ȑz׮]x ԩ#Ik֬qss5kѬYZnvZUo*bkk{qƝ8qBtP %*> ""'OڵݻwUk߾}~~~EtP)''kРAΝ@L>l߾}K=jmm7߼fll\tIRRRz|LfbbRBz <8**,[/nA=zŋ@=~zn tʕ+*MZZZZ.]v1޽Ν;?~ʕVZu몋RԩӦMz,: VT)33U sssU˒|ժUAAA?msQPfffDY~AAA@qtJXFFFwtD 8::ԴbŊ~~~Su2ur?cΝ it 8,,]vgϞMOO?{{DDY۶mkff&:ӧ}}}]&: ֻ}||v:a„ .]$,?>@tNIX311)099:33S;tЈ#o!: &$,}}}˫T0ZW^_|Err Ɂ?o IDAT?8pEgxw?|m;飚HZbbccE<:t hw333ǎkoo?x`SSlٲ%**jڵz %N8$''/[ҥK+}]tG+Wݻ,tczzz\1Z ڵ~;fY5»/DA,GG3gx{{?}tڴirp%,8+::s̆ +Y@9(`a,Ybcc/<\tuנAӧOM8YZjժGݽ{+WVX!:SCCCKqL8HOŠKNNO%ŋaÆ=yd݆r܎PR;w6v+??_tS\^zo^o@sQj-**q˗/E|SN}!MD5{{-[>}QFSLᒖO-[ֹsGVw|Ν;CBB*UtEqN޽waY=pqn߾ݵk|%x*gAKD?W^]» %Yx1cܸqCtԩsرٓs? X5lҲk׮{-6hР}@qkU@sss%KL0aС?/Yd׮]\\ @q XRX˕cbC#G 0@tF0 u}ȑ_}F(NB\~}֬YvXy.\8pE jpttׯ߉'tg|_^ӧOWT=>>^t X'4lpҥ^^^&MڱcD߰aC۶m,: h1W^/_^t ;~ٳ,4'aIJ Xg]vgϞcƌ,%IXPLJBW^=y3q4 jРov6nܨ ׭[7((aÆmڴu8ts t^^ށV^=`???qThݺu3g\v,: 1`Ir˗/wȑ~-(DK>ׯƍ Ev8 j!$$aٲeiii(5j*:B=899XŋVVV xDJPbťKΝ;~`Uӧ;vhРAnDgQ۷o8~͚5UVZ(`ŋ>,$$dΝc$rׯڵkm6qh3z 0.'O|999~~~#F0774"##j*qv۶mKIIqvv:uDѴiӋ/p,*POFŋ$KKKAJo_}ҥK $: 8 KR0~]]]WXQzuqH)hhÇ\255Utwsrr RkHH8 1|9++=zܹStwZow,_ e\LAK&==}Ϟ=W^]t,%rAիWo͚5&&&P9KF1rss̙nݺUVStEKV.]S \xqС^^^/€$, .m۶M6K.}8[HH˗/\":POF#//۷o߻woHHHÆ E'zΝ;'L駟Κ5bŊP2%EJ*NÇǎqFGGGq(SuokߌtüdϞ=Ǐ^xq~~<4 v̙ ?COOoر/^ ر;wD%)(`h.]v}b!heeuɾ}mvѢE^`PO<ϯ[ ѣGgee(=Vv/Lbiiyر#Ftf( M `e^xannҿ޽{׬YSMČ5*;;0Wre5j4vX6miiyqPxΜ9/_lC=kϟGGGlR޿„ 7o\v[Pj\CRnȨVJ7O8gϞϯQJ@)Tnڴi666ӦMpႊ.ѻw𼼼f͚ڵK))Xg'ON>mkk ;wO> PVSВq] *n999?Ӓ%Kf̘1i$n @Q6/^S ݻ7nܸZMY,Btt_|qɲ_a*((h}5jԣGyf##ӧO8Q)4hPddd͚5V\ɕ]\LA^zU|y%0<<|ĉiiiڵSǀ%E6mTn:TR/?N`+=0I233,XP^.]\233^޿h~Vb#`(ųgώ9rက ݻ7u԰ŋJO rI&.ZE)h@ۜvy湺Ο?^TH@+1-) %???##c͚5 .޽~kff&:%VfffOsssL":Pk޼yBB„ ӯ]־}MΚ5+55Ut:1תShyyy*THHH;wݻ'M@t.@#q XR0Ftt7|s3f<~^^^^^^666 -ߞ;wSOO̙3˗߹sg֭EG,) Z),,lܹO2eMEgA(͛رׯ_YtӧO_{NAAرcWZP@(`@4kl֭gϞ{~Vhnnە+Wzmbb'0*ݘkU)hy޽ҤI 4(hbbbTTx:` 5jh͚5!!!|ɽ{ 533{[^|yڴi{r@Q377_hѭ[LLL|_RNCC5k٭[N6aU?zK6idڴiϏ,_<7cHrsso?+WnԩXb)3vڹ+=' NŊ v~aVVV?㛟YzN:YqvvvH h(z 0 _?lذǗ2UVUEB@u |0i$OOO6//յE+WVʚ%EoyK+Wn„ C )6??֭[.\8իWbccP XR0P'N,[~R,˳ԩ%IXԈW``Kd2[n>\S W&]zƦI&~~~K. -)x//^غunj3f̘Zj)}+[[[Oqvv8c߿ߪU&M+ )hUV{TTE߾}[jztdgg>|W^5kϜ9#٦POF@=zt'Nѣرc%ӧO^ڸqcsss6 (`@RRR6mڴf͚+;vСFFFb#m677ťy˗ j (]AA3gV^}#Fx{{ׯ_zڵkǏ711 NZZڶm6nܘ0tÇ7mTt(ggggGGǺu늎a8 0227nŋ?^|>~+T*;;;%%e޼yvvv4hD6 ` HիW?9G >svD6!!!..]vo>Y1-) ӧOwrrr9}jjzIrڵ#F|CD(`IQ>p;=ڡCvPt.eZvÇ4iҸqc;;J*N XZ0_>}} ޽v4#GN8q֭[n߿St(]GK4BFF޽{SNիG{5 t ,) ,ܳgOPPK~z5M ^rΝ;wܩW޹sի':֢%E*;;СCWPPCϞ={eii):z޽{ o~vZ [[[sssu%E˗'NسgO``q׮]{ѺukErrr&L}ΝG9::^pAOOOt.CKF~~˗__.]ԡ옘7xnoo< h{:th޽/^СOPQQQ龾;wJP햖vȑ ##^zEw&JOOw$7oܲe& XR0# }=zLt4r޽M6ݹsG~Pg˖-CI Ǐ?~ 4uwwPhj'''G߿m6N .BKt٫W._|wvJt4u{̙r޽gΜ):TYQȥ;vѣAAA5jرNU3gرC>JmܸPoEK𚂂'N8qٳ 60kԨ!:ɉs۷޽۫W/)WiŊY ^ >~'._ܬY3OON:iӦrʢi/r֭=233;wn֭AKPB/_p쭰֭[{xxxxxN rrrbbbbcc[lp? ##J%E(ϟ9sɓOy󦫫G[jUZ5ۯ_pݻw9re˖J\?,) @edd={ԩSΝ urrhӦ|2G䘛[XX4jhԩ%AP(QvvٳgϞ=?\z¢}m۶m۶mFD999qqqݛ6mZժU|oVNss oHK"yyyׯ_Ν;wyL޶mv999q&OٳJ*QҡH#66ܹsΝ;{l\\Kv\]]MLLDu/_g,) ={v .\|ʕ+Zj(`IQ*((yŋ^zҥ7o:886mTo$% XR0q|Ç\\\]\\,,,Df(`,%%W^ vZnnKVlnn.:V%E IIIW\qζW,) zэ7 8%%iӦ......͛7o֬z/(`Z#===""B>Y~MsssGG-Z8888884jHOOOtLEK򢢢_{{{GGf͚+Y~(QtyGDD8:::88+Yf|j XR0],7nDFF֮][>8nҤmӦMDǔ,)  ĄEDDܼyQQQիWoܸqƍlmm-,,X2,) wΝ۷oߺuϞ=o֬\A ӧQQQwܹsNtttdd۷ׯ/c;;;KKˊ+(`IQPvyyy򱲼߿ߠAy+7nֶaÆ*FK͍uVttttttBBBllmlllll5jdaaQn]y)`iQ XYqqqqqqyyyVVV666UT,,) AZZZLLL|||X9&&&&&VZ 6477777cWZU(`IQ󓓓cccܹ#/x333sss sss33 6lԴB ,) 4ѣGccc_$$$?|nݺ5(`&yyyIIIqqq񉉉qqq 4I+WLKˇˉ)))??KE#"".iѢEdd<6̵VT)33bŊKrssUҭ)h*V)fϞ=gISagbbr %-[LJJ* 5L&$5k,447n4mTTI [n7n,dƍݻww҆ ϟ;::=>d+W\~}hhAVȼ_d2Wz'N\r"88n_$;x ~ 2LgϞj;_d20@ (`@ (`@ (ӧO5jԨѧOщ kƍWfM===Y ƙ3g Pn]CCC77={N]xqі*U255ԩӮ] _qqqqqq^^^YYYsAjÆ 366>w C=ڳgORRR@@ٳ׮]+:$5qĖ-[eddO>}ܹ~rݐ/\zuͅKںu' LΚ6m… @nܸѻwh ݻw]]]ҔNFڷo_%~~~姟~*zƆRXb啻N _Eh"22RTjСCS@gϞO ϔf&UR̊+.ͭV˗/@LAC&Y}@jE'B:A0#`PÇzZj >|uֈy)w𿌌RSS.yIZD ;w7xxx yf OYfEܸqi>tIDATӦ/j5%%E뤀խ[7]qݻ@ xzzuq&M(wƌs秥͛7O~%ѹHg̙]tt9000%%%77ׯ5j?ܭpN<2kɒ%CAj @w --f͚҇'O\|ӧ={Vn]wwiӦ}  LA  0P@  0P@  0P@  0P@  0Pg3f(d}bz3POzى'lmmE u'NxqXXزeDǀǎ{n^F}cǎNh'F'--UVdݺuzha ƍ7dydM%4y.}(++O:5((HoĈڮw.--1:66(`c,^H?9/HaaMb񚛛=z644L2ʕ+Z ,r22TQQQk֬),,V͛9Y ۶m3119rѣgϞ}MF߯[ѹcLXن)s'zjܸq322***8.[رcǎ.,,d?oUUUUVV?^UU5%%ڵkO666G544߼yl``={?)zzzgΜihhx%KoE==**а'hkkYF?8SN3]j!$3221ŋ7oŋ9ssf癊{پ{ Uq㆝]ggggg繗ݳgv޽rJ-Zt Gyβ;w~4,,ё+W:tPHHܹs V[[˩ҁpUU˗Ǎwر~ɓ'}}}9mllΝ;ř|gL93XϮEQQz x(Z(`W:t,g@GG &s?ZTTײ=ycdA>---w655UTTd'cذa}-řΡpΣ|`]]jMM ɱdXkjj}ϟ?롩iȑ=qppXfMii@stq50777nwUmii<|pGhkk#8vuuF^^@{xxddd466X>K>'V޲eY,ցX,ֱc6l0g'=y٢Ez?0$$カw|~}g?gXvP[[3|hhh|r᮫[RR™>i:Lg;::tttX,Vii~WWENN{>γo>󴶶feeOWk=|~***uuu=l xZ8 $VDDDaaŋ""" Y ~ƍ666t̙ׯ_ B{{;χZZZ8?={Vsg̘ҲsNsss]]]1vX##QFM<=ϔcǎmٲ#FZvmxxKn}8qbbb"gΜXCyπ"?500,|ǏWTTTTT?~\[[ӧGUUUgVUUojjj|L|𡎎ίիƈS,hnn~ڵ-_׷/S8 -##s9Δ_UFF@`i_ ;;;kkk߿uVMMͫW%%%_50>/^hllTPP}kw4 H-@\?￿k.wsmll裏TUUGٳv5{{{EEEEEE{{ׯs3 ߙ^^^ʊ3gΌȂ&&&Æ ]555jjj***Vjhhb,DYY3AGG{A= 555]\\zfYOttW_}kC|^7Whbb"''7~ݻwwvvw{.4p 0@@  @ 0(`P@  @ pqqd2>>>%%%}u [[[ѣG؜8qʴBnlltss)*****qwwonn9MΟ?ђG믛6m83~GMOOpgʊ+6n{f&ϙ KKz [~~~S_sfE @hZVVVS,--x駟qqq K,(I ojjL5jT[[[Y,;™hѢ?SFF`ђ\{{;vyyy3&LvZmmmmmk&LpС~Gox&055ݲe˒%KǀMt lRwdC  @ ׫ B}llҥK555G}]a +Wjiiյ:$$<000 qMcjrJ|߆| 쇏P>p6dsrry睂*F5$*++۰amZ[[yݺuJJJ^^^]w#5#ggg[[袢ݻwS9Ç ===[xxyƌ#''˾!@$ `a+,,dޟ3޳gΝ;9SSPP`N6ԩS...}-p­[ۿzի}c63,޽TQQ:l06QXX=@GGG+**~A-uI~goDa7D[0@6m߿ĉZ[[` EAA3dvtt v貲y>|}P VVV566vDq!F.H+W$''7c㯃,/_r9/_:v옛``sE`8 @p=6@Ϟ=h6.88ǏfT*OONe0/_vvvSZצM:$++ Gw@|'߿?{zz~sHwwO>dꥥ/^>>L&dL/B P\RKK+>>荍nnn666EEEEEE666|55oDp7X=z4==… )+Vpppظq#MmذAYY`۶mTܼn: %%%//!44Ϗ{ׅxC myyytttQQݻÇ=nد\+++)yyy|3fo~~ y, ,uuuvvv{?`vAٳgΝ){)(( xyy&999􎎎QF\j…[nիWmkk/ @G{y뭷F)##VTTy1""B_⢠0nܸM6l߾ߥOrf z<` hӦM8qRkk l(((p0̎D[[;''G[[3bʔ)YȨq#lѕ+WN>=e%%%k /_񣦦gggs$''l"00zl={Q vAq֬Y 9f`|ОBkӦMUUUzЇ࿭ѣ'NڵkP_fMBB·~[WWWWWo߾$ݯ^ZQQo@annnjjc x ?\[[gٟ9;;{ҤIaaaw566QQQzzzzzziii=ر#88bȑ...߷ԈxIX@O>>%%%|f 477WPPte9@nlltss)*****qwwonnkܸqܹsΝ2-`ɰX,x8zhzz 8SVXq3GGG9r$44TXeh=tЪU455555W^};w`@@ /d)Gӳsrr9S***LR^^{fhhhpTWW755 6:N6; <;;{JNNY_3S @hhZAAAS,Xsŋߺu{͛7E`hhO>a0'O<{lvv{}֭;w.y֭[\2sLF.h`]QQQzzzzzziiiAAAիwܙ8qq~K. ܾ6l(`P@  @ 0CKKKgg'G*`0/\`hhxnґ$.z ܵk7l //͛7^zUCCd4}v+H@bjjbcc#Ϛ51`JA߿?;;SRR}'O(((h"PBinn600555( .OD7p_~qqqi2;vP+W$5#I?0zgf͚E0˱0zŋN0{tww@g(` tw}l'jjj&$$@[(`ISRR3fxw^J:M$˗-ZDv3ے%K  @҄;S0 )LII!Pt60) Qnݺ榠@:̛7͛S @͛7tM6tAHwzzzaÆyxxܺutAHx}}cǒa`P#<<|ܹSq޽6A 9ýHIMM @BTTT888ƒ_E:$Dxxٳ F:(`P۴:]UUUqq1 4]]]s!7YYٳg߹stAHԱc'۷oN@#(`I1k,)qww&.P 22ݝt ~tuuH 0knnNKKsqq!S @ݿZYYt~?͘1#!!פ`C((`33DAh ޼ycGGGAd̙#P->>Q^^tyH0x)))oS ɜ8qbzz: 䡀XssÇy ¾8 @DkkkEEEA(`&^~턄.A맀kkkO8c``d``sĉZj"@_ĮuuuI .--]fnpp3\]]7]]]R*GGGGZZԩSIӧ߿t dX, 9s/---LHL/ }$%%_>##tA;|hh˗I-Kվ +--mҥ>}:yX >[ [ .\dA1a„(cccAA` b%&&0pvva`r{WUUcb]]ݲeD  IDATd2uuuI迀 ,--/\r][[[###Q~㝝I_?zӧO7nܸwް{4Yqqd2>>>%%%YDFFF ¢tbt xʔ))))3fpssسgHA||iHcbb" $,ѣGkhhP}y)'';vر:z6NīEmڴi S3ttt͍7o^aaHcqO~:EN:u SʊI fxs|W?78~xDDݻE+77ʊ{e^^^_󷴴={VYYYD#!!A?999eff1t/6k֬'O.V]]uuu>زe{$H!@)))M8133t2/K.zEDׯ~׃]0 @Q{{{A{Ajݚ_| 6QXJJJԩSI ^jU_inn^j#1 yۅ䘙񜹰P__&,eAR%''KGGG0H> kw=%((hGlݤPm@\PP秫+''3Q'RSS%jjjP~MLL⌍MKA>`X)))`0e$B7og}=?_.l0ӓ'O<==%oS```nn?H:$-YĥKƊ"%))I6 A _}ݨDQQQa;ںtJ_˗{Lt钏h"oZrrrP]MMMk׮4iuuu_|o=z#G&%p hUCCZ"w>m޼YWW/$'5~5j;w};BId2 GGǫWN@wAa@Co-H!\ @>>%%%}tRMMѣG;99P`(h ഴ4;;;)xsttLOO"`hZnnn666EEEEEE666I Fphh??ׯW766泿>>|Ce0~)}lB:NONNN8 kee=2//o ˆ[XX&0#GH \WWc@]]kkkwq1E$_CVVt033| CBLeeŋ Ës5LMM=zD:?'''0$4-`UUۻ555yxxڵk̙% ŋܜt~̜9Ν;S hZSrrr˗^^^Gqww}:!HHH6l Xt5kHiڴi'`HhZAAAS,Xs檪*OO͍tB;c%diiip?iIM x͚5 ~m]]]]]ݾ}93pΝK")VUUUӧO'b@Lqzz: i+++GEE饥EFF*))933sٲe=Nz5ř%''nyqH(8)Gf0׮]v횞ܧJ{ H*WWט)  @1chkk裏80fYjƌ(`G(`̜9t ؿ|@:̜93**t ACP'::&Ν{顯a+"CCCyyO08(`tuu ,[[[]]ݡgB)!ruuŹ vP;v~/ڱcGjj*8  @H777)ԩS>>>cGEE ^Ps率·`k׮^` &dgg0X-0]SS˗/GE:HTVVz>vm۶ o111ݻ۷oĿy Zmmmqqqg&RGݼy˝;w(֭[ 0(`ъTSS#k^reԌNXC+N q}cƌ׿%?~ljj*QРLXcǎ-++ p!qu֭st7o,[lŊ]]]"H0/5jCdd$e#  Byyy"Rddf\\ܰaD7?͛7I @nܸpBѭ?\zO?tq $F.\M:@?P"*k@zyyMN>GUWW }zzzZZZoQ /0TWW?zUtC(**=ZtKXXX8qB臮,X*u @Tn޼9{lyyyAHYYQQQ}[[W>7nq eUycssȟ~iĈB\}MMMAA t(`hhh#G_|Y(h^+rpW \(` 1cJ~׉'EFF9sFX٤{gCĕ+W{!DQQ?v횹PRDwvvV8oo!gҥvvvB$vX,+\]]^^W(СڵkC,?'O|7n{K."P>כ6mRǏ]6˗;88X8x@[(`JPuu_zz̙3'N h,11/??ذayĉ8~'-PBK[niPPдiD eP_xq׮]UUUSL[l )0YYY999½ ~h!D!44tΝ222CYׯҜ\]] L)qww411Ceiiy9sk ","hͥ'O622~o L)ihhannU)w޴4㏱"ɓ'999yyy&O|YfضmѣMLLLLLI'PB]RRRPPPTT3gg!S*]x1000!!tFppÇR PBs_X_____…֤Cemmϝ;tnKK˃zyyҿ9s"lllH.(`JEٳgsC !ƍ_uVV D.,,=[WWWCCn( (`JDNNʪw޽t钾 ƏojjK}ȡ뭷BCC5P1aAx,k„ &Lڿ?PL)bbb֮][RRd2Ǎ_"JSNz𡻻{^^pN֛7oJKK:::.\{Çkjj7n„ /(`Jxӕ%%%Ɨ.]=[}}}yy!)흓ʊ-[Ԝ;wtTTT\|\RR2n8O:::0⪫++++++UTTv{siiiikk7N___ ;;;lK: IssѣG-ӷnZQQQUUU__t .Y?Pnmm|u]]ݫWdeeyz 455555uttx'%%BGegguBhooomme2 #K,ٱc5 >\|o_m կ^ټysJJJ{=UUUMMMcc7RV"͛7/-- }Yee˗IWUUU#F033=Å >C MMM55EjkkcX4<ի={zcƌasܸq[l2=pŋIgiiiꫯV\I:ꪮҚ4iRyN:gX,uuuMMUVysuuuCCѣGMͷPv.nnn^|d2~Ptuu-\ 00t2aaavvvHW^zJYYа Ν۳gׯ߼yuր޳<~XEEd=ZKKKMMMH(`JTVV׿y͛7}tp8>5>>G;}\\\~  [=]~Ν;h_vڐ͛7ytLR>>>/Nbg۶mW\#i䔝-''gnn~%B' fccSTTTTTdccL:?|ʔ)VVV999ΤyF\r7ovwwCN=zhzz::VX q{/jժ/RKKt(uڵo~ݺucƌ! (!}9spܹsᅬl(`WUUs0==?pŊʤs%$$:u*$$zܹ{0?999ڜ)SL)//l(` ٳO>z('''##eΜ9syY>ZZZãlllMMMtttHaB#//$''Ǚ1jԨ6Veee ׯ_e߷I__dҤI'O155V EmmmzzzVVV^^Ǐ={k]444UTTTVV>|#LLLILJXONN{J{{| ~7"yM@$aSOzvA6lm6c p)J~ͳ䘙/I(`oo )AAA}O>a0'O<{lvv`+c M0F` dvA󣬬)pP m0 Cl @6A.۰QW͘1thlB66m1MP"FtH0I8 vP@  @ 0(`P@ DQ緵ܾ}z׮]sX,9sRRRN:E:}7>ɯh޽{511ijj"rq=FM~Q.OVÇW\ɢwԂ)X,k֭ݜ&#GrOC*O_hrq{>4L nGo `0-[L666^"fUUն6A&J77۷ϙ33Ν;}dd$T =ctۤgIp 1c瓎󷖖??g*++ҧ7oް}'naaA:MZYYqO#GL=FÿM:D-,XRRRrQ--Lҡ?޳gGZg$SSXAzɯRNN{J{{<<}=cۤgE@Jg'O bBBB\\\rfVYY{nYߎ"*QCD~MRf ;***L;ы/zC}0^SlVVVG(zҪR^^>fRyB"}>%"cܯy=nl=Fy쪪L3˗/9N}$><;;{JNN%?[i/|3 &xHHHx뭷H`0*OO͍t `Ryąx)Fi")m(K77+W?{l߾}sF9sBBB*++KKKϜ93v[nbXSLx"ɯ`߾} q566M^.:M~-*DFF.^X]]}cǎ]re~~>P}ɛbEEE;MGG'))t_Ϻ:ҹX>E)+++++/Z!:hr=Fh gc@  @ 0(`P@  @ 0(`P@-]➲m۶w}T &bHg f0999ڤHlO| VZeaabbbbn޼I:dB@Oo޼211!@27Μ9իW<8~88 ǀ""" /^A:d0FFF #//;==]UUt4I-`}}}`0̖/_~z$0(`P@ jff7MIENDB`gsl-2.6/doc/images/rand-fdist.png0000644016036000116100000004114213373111455013646 00000000000000PNG  IHDRKbKGD IDATxy\Uus]XYDEDEAp#pM,5,˯雥L7+-[,5Gͭ4wQpAeUYb ]^?!{[&|9GQSS#yCD  0P@  0P@  0P@  0P@  0P@)Tipcccc{{iiilljߧ( ! n\ZZzʕŽ{޹scQ n41~ Un|ҥÇ=zGm,:W^ ,Xjgqqŋ===۴icii9|}ntBw޼yU<Ξ=}fffG}K(*U޽{gfffff֯_{Z|yNt_6[h &L?x_<|paaabbofIч_$$$Κ5[n7o5jTHHȭ[ c)>}^?~RRRbbo1}sn0w{>|8//oݺu}M'~*{LMMܼ$iժUL?[|IUz駟ꫯ꾵f͚gyvaaa}U7tfXR[[ۻwݦo߾˖-رcQ(:uRByfΝkߺyOaÔҥ˩S꾻~?s,??{}~{`TUUhѢÇl3hР͛7UVVfddZjРAʷ_UU#^re͚5k֬ꫯ.]|k?~xii͛77''kѢE֭[nݺtwyu<֏aOO<rG8q[lٲ5W^nӦȑ#cbbnfOO֭[;;;Xk@@i@@Duc"U4P@  0P@  0P@  0P@  zRQQQsεR(0=)ӧEFF@(jjjDgP'BF'#`t  0"-[LDKCoKԲ;ٳgfff3c^ X;nӦMQQQ3\sXZhpmAڋ)ګQ8N'mg)`@T)ڋFQAoE*..vtt,..VW$\cڶm۪U|A誨sZYYսChm0Ck cvvvH=k,777###GGaÆϢCI$;v矷ׯݻE'afݺuKt :f{>x`IIIllŋ/_l2ѹggg޽;==}͚5PEX*/i&~IL7oӧO~~-ZreL111<̍7Ħ(a*OOτ)ɓ'kwצM4t֭[lRxO>jٳ5#11Jtj3wMMM-[}vPyuΜ9ZLt]{6LA gg'NkAg*_ҥKNNNlcwn9|4f,C0`ݺuOsڇK~RPM233s֭qqq+Vh~:::Κ5+77 $I̜0a_ U*f@Iߖ^{mڵj!-lٲz+V==pvvn~Ç߿833scƌiB4__Ç7:GsEIoʕ+,XNNN555ϟoӦ͆ O6(***266Vc0>7۷{0Ns4رcSP^ssqƍ=_lS5M:xI///x`YYYF裏bizyyqDzehfft޽7hڿ'#Fؽ{wfffyyyZZ;v`QQQnnn׮]{`{駟#NsEIowYYIee @KJ4mڴR4ߓgyƦUV:t8qӧkm׮]s9r̙3L@.??qC4W\=zM4q˚5k_f͚}| .L/qnڵE'֯_/7VZxqxx8+#`μy<<<|M5{ `-뒋ͅ  Z^^^qqqS43ab Z^^^W^E(`9PPrرݻw?=(`tڵkS,ooof(`0E˄uX(`xyy]rEt NX*h'VVVFFF3@s322ruuMHH(`pCJ,nݺNjN |(`@- X>0UК[[[tˍ7DGˊYh,+D(Q֭ (`3&&Ft xVAsk*++---3335z ZOjժ[n{%)Qr ,^z1K͝r$cǎ-Zh;a ;;A"QՋ`(`zuE)"Q?^t H,RA$IU(; XW۴i$:@ X  .NGѧOa!c ^% t Q;wNt 00, X  Ta$INNNZM",=diiٱcǫW)00ٳSE40, X$F`X<$IMff <.a'ccc__3gΈ,###Eȍl'O 7 9`Irrr<<}h^}UGGǭ[2$,,,======,,l[lqtt5kVZZ&b'LP;uss?޽[l0@=Y즦nnnV5j 8o'&&޻wO Э$IW^2dHbb򕨨ѣGbN\#|ܹwڵe˖SPL ٳ'O~zVDg*hm*: λv( Iϟ2ef"iݻw/YDt /^rJajzyW:ow~޽3UV{а xʕƎ0˗-_\RRR&Nhaaaaa1q'~P*m.`I,YA7n߾-s$J:ܻwoݏ{qQooo*)) KNNNNN )--#5MCbcc{衡7ݽ{uֵTTT߿1s7 Tߖ;wܤI]%Mep}%##wxff{IIIӎ|CBBϟ/:09sfHTZZ:sLuG$I񉎎JLLLnq=[|G}B޶m[@@ÇCmۦXcǎ}MƍȏرcȥKz1lذO>1WUUUTTh:/Z2sL##A]ʕ+EEEEEE_}UPP/aEEEnnn+V[|rJvɃwܙ^^^~֭+Vo… M>oϝ;} fccӘ>߿_TC)fj`j;;;{֭Gxbvv$IvvvRMonnnZH9,ճ$i…?c}o?q?w’~piiiϞ=?쳧z>e˖{j(`Y=/͛ע8,<}!)? ߛ ܀ۋN!'|W^8qbyyy3wK/3gOՒ ܀\C+`I.]jooo4WAAAO޶m`n@NNaQP㏧O^vm9r F+O?-:w8p` ̽% ~{çO~qwwwY@!!!|1cCƍ0aջ~ҥK'  裏G)//1b}d ~XYYو#rJ5ի>ڵkԸgP C0={߿?WnΞ=۲e?PPOFbŊiӦwϕZqQXsmٲEt -|Ewϴ/CCz.޳g/|QY@Q1'14F``۟3gΈOnn1 qGEEiɣFJJJ@, >1zov̘1ib }U]vOOOщ/??ӧ&=m4//Zzhn4!=7 ߿駟ܩ(`YQkϞ=g޳gO߾}Egu\#p%`[7n?$:aA=|-[L81<<\t0fذa? /sNw^@C:pիWkXo)S4},P; j֣G'N|-Zh={nذust Hׯ_OEI'N8uԋ/XQQ~ǿ{xxxyyjG?RBBBDDСCO=TQQFyfcccԋ~mۊNLMMWOOϠ n Bt ֲe5k̚5k'NHSoذg]~=wի<(4HC2ezbȑ`JyjeegϞcǎsDh}֭[gee%A 5#`j߾} ӧϙ3g9s=̒:Z 5m߾}fzx Y>}_o۶W_}#:$I?0dwwwA#`w{.88.**HJMM߿Iv@Q=-[;wnlllQQ  MLL'XpannP:{yrچV[Q##z+66GIIPVYY`.]Z*//OtZVQvvvk׮߿/:ԪU-[DGG{xxV޽{S<==7o~.][NS$I۷?xcNJ@<aP(<ثW/{{{Y\gΜyo޼lٲ^xe˖%!cǎ{YYYޔ)Shee%: hA;vlڵ֭E/[nussq8l._|?s޼ysi׮D%//O")h@z}#G$&&zzz曉C ƶi&00p„ G>3gΜ={cǘts*0m޽yիW͟?ʔ)&&&C=(55~ڼysIIɴiy6mڈ36gΜR) +33ٳg~Gvruu]dIZZ\y111$IZ+FbBh۶۷!KHH/l2bĈ7xcUвR(܍EEEׯoZnꫯN>Zt>|ԩS?pիW/_8{Jç~ڡC_|qǎ999z v)));vعs[~ɓ'2e˖s5,%%%,,ǎ۱cLj#D'd(`hNJJΝ;wq֭cN0aĈ:qKʚ]HBxw}{_~%**jĈO?O>iee%:c6mZ}||DԌBݻwTT 0999{ݽ{ѣG|gy]tƪصkWDDđ#GJJJƍw߉ ,+BxA`XJKK=,ۏ=zAAA:4뛜|5CPR(|8$$Dt/UUUgΜٿ>>a*?> @CPN:uȑhAiFt*++ӧLt(- XV0Iqqqddz9`ۋNOϿvP[(`{={N:uꔍxxyy) Fe˗/[ZZʟ z CPSSĉȂ80((O&u/^[o]t}=z0a‹/(:t,+BiӦӧ'##ԩSǏ?y˗ п??ݻo޼ݦM'|Rt XV ⭷DĨ9y3gn߾ݷo߀>}NmۺG``\N 5eP(-ZrJAwGEE]pBY>رr޽˗/]|y/P" Żᄏb AmtΝs)X>}^OG}ӣGnݺYXXNPR(˖- iiiϟ? .\кu>}(Kl\SN>AAACA E\\\nDtOrr/^wŢ=z׷[nƢ36WMMMuuʅi+V011޽٠v PK.ݸqյGݻwWN纻뇭_W\OII Bˊ4ڵk/_V.}JOOcggg1գᛄ̞=szpյeE{rjll{j/ ֭[׮]ET7&$$ܸq#!!!;;;##Ct(<,+ (77k׮(+K.nnn-ZTn߾=c (ӳk׮^^^C" XV0Uccc5zyyyxxxxxtǧ[nzH(9!!~zxJBOѵ ,+ rEEEW^U^jkk<z~#p]eE:*55RRR=ܹTQQخ]mn޼y9ggg777=;i ũS':fJNNVN^~ƍ7nHMMUcewwN:mVt^ \zujj[.\]t(@JPO? ԯ")))?۶mlN:uI9Vvpp$ף۷u֭[u~~~'* ž}ƌ#:ܾ}[9DNIIu֍7sss]]]===;u޹sg''';;;y5"??iiiɃ 0aÛEEEvAQR(#D Xyy͛7|ƍĴwﺸ(ˢvpp$Iڲe֭[333srrW_}***Zn-WVV,.]PJkfY@ (`@ Aiii#\~PeeG?BtDd@?Kt*0c@P@  0IL8bĉP}(`??d??Ҧ?Po<nݺ~-Yzɒ%}vUaP{1cFWf̘gϞ퍇1d[={7mo  }(v}&//i{2h%:H|ʷ aE:`oocoo_JFFF޽ӛCH $0DGG}%&&[n }(cnڴ+6m7n<4H}}}g͚5gI֮]aÆh33퐙7@$)m6""ܹsϟor ~U_@$M ~uݐ!CDG4o90P@  0P@  0P@%%%eĉ'NLMM **jܹVVV Bt@cǎ=󶶶۽{&B[IIIpp_rrrrr_HHHii\ܦOngg): wޝf͚^GiHg]pa͵L6-00pS<`E\v(&&gqz;cƌ̘1cϞ=DOꞂII |}}ҳgxQyZݻwWnb7##wnݺ ss L4 IR^^ހ֭[OwόP-33s„ _WkY[[}%77]vĺ}ȑ#.]:tPM7躯tMT@w=zUBBB4t ƎiӦlڴiܸqD5jG}ߊ}}}g͚5ӟIDATgI֮]aÆh3331Xxɓ'k(%))i$|箮CrSyJAQSoeeΣs8 0P@  0P@  0P@  0P@  0P@?+/~gEFt"77W^{ի$I/^5jTLLha /666k׮}W^}O?40͜9{555Gݷo8~<(333$$0""St@?Q4C\|yբsÇo޼9a„Yf]tâ0$Ǐ;… ֢0̝;^P$Iݺu:uܹsŦ#`` 0P@  0C&KIENDB`gsl-2.6/doc/images/rand-flat.png0000644016036000116100000002411013373111455013457 00000000000000PNG  IHDRKbKGD IDATxTTu;QVIDSP5 4a5JeIbɌMksS`LtEt#{XS݄%D mH1@ #?4 0 ;~{3QJw'E0@  0@  0@  0@  0@  0KT'YZpʕ6|Em` 3=혿9ɤ볡ٳ~]]]@@@zzz$nq/Su-@TLL23L>ȑ#GyR3`@^^l2WWWUV555IfǏ_bERR~ٺUV9;;oyG+RTZ6:аdɒDDD'Vϖ|AZu 0bĈ[Y9 y|_|aΈV9vʕ+O}QF߽{+WܹhHٳ)))k֬MZbE\\ѣGJJJ~O<+WسgOUUUUU՞={֬Y;_ w.I&^nIׯ_pww_hQ]]~Rvv_>}:G2eJ||+W(777**߮hEFh8_߿3 LNN󳳳{ܹcIAAANNNNNNAAA/) ܆@` @` @` @` @!|ĉKT*ѵ9 x1х`Ukk,IR3(B΀-0Ъ,]zFk׮5M{w'JK,rWrt A  0/0| -0Y - A  0@]t)**-**&fVcbΞז7o]RRv….Fvv1cLc~y0J?sh,:R]]kgglIss}Gkll|MxIsJhؒ`.g#G3/O$0Ƅ#G:99rO>]ꡫƶmf̘at$I%%%-ϟ`Ĉ...MMMNNN]zPՅjZߢhYb'TFGGG}Kcc[KK\zu̙7n ҂&S.1w"IRoXQl?=zS *,,7׮]k˫K閊HJJjvZL 6S;$i֬YiiiKEFFY'O={y8mڴ.WYYYKc+ 󣣣+**6lOw-͛>>>ׯ^nnV?a.\X~,Il٢h4͖-[j?إkb.>>SNշ9r䥗^Ƹ^"4F W3gFk7ojzNJURR[JJJLr531ORo}RmC FSTé ;M_={y8mڴ.g_|w<@W&$LX|FKKK- sw}93Kt䊊䔔5kX˗/\0++&##c…+V4길wΙ3g˖-]}0:k8mzL]W3׿}۷LaÆ~K yT\\,Iȑ#|g}k3U0yJNN>w\rrB!| vK/t8@Q` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` @`{>|ĉ$ 8000044"Pπ\xboo={L: Occc\қ V|||Íΐŋ֬PX/:<7oQJϛ7el0@G0g]l矷NI(_3vݻw[ & >ܚdf mu_QFYK.X⫯$i7o~:YRiɐ=twM:544>r䈵ӷ>44400,000,,"˪C]KRoO7-nǎW߿W^=qĝ;wZ{ɓ&M***͝9sfIIUʊ1l̴J5ok.Ze˖+V̘1cڵ+hܸq-cǎ=s按E dgg7xb@ufҷL6Ν^Y555m~ӳ###?RPP`VYknn6linn7sm۶͘1Lw^dggQPaAo7ٰ7WW׎Va nӛS4777ӷjo==-$$D!fDۨBZoh4,^QQ1|]RoMMMMMMZO>[nݽ{W$TEרE[KK˭[:M׏e{5vԛ.EtݼyӰ ۘݺuK$}oI~t7V[[[Qoh;;;K&;*E8;;X^KMMxYΓO>o?)''ǜ5RXAy8o߾Cu4W_}o>k5k֬4ÖH3߿ɓPa;wnҤI3g پ}{qqq]]]]]ٳgm6eʔz*88Jb-^oykjjjjj֯_g0[䰰ŋ>`YWUUٳ'77ɓUUU$ 8Pw_{zXB7yCRÇnݚw Zz#Gv{rvsmP7@w29ȹ6((fcbb켽cbb.\`P~o~wћ7o=z+**P·gΜ6/Y0rKεAy8a\pT$i4Çn䓳gܹm\ M;t\ ޫNq', @` @` @` @` @` @` @` @` @` @` @` @` @` @` @` yȹXv$IΒ$ 4H${{{;;;I'IW@@]P7nƮ1~69996x`\]] {5A+Xߛ`]o{7Z7 ~c{tO_כ~֥ka іM76=R;ڲtIڻJ; T,rRZ[[U*UCC/IVmll۷nE:::.t}^]E>,Z޴Zm>}z[kk[:Ͱw}To*77V{m3k3k,[]ӧOz6ޜz-ۛzazaGwnyZ]W 琓smP7( ! K^[#_εRc@18@ݕ[#_εRc(0dAC`U/!a79x@Q` ( oF9xbp', I0dBC`U/!a79J}^`dx=>!Or'l E!! 2b|9ɹ6(4B  0@dx=0Bȹ6(;aI"!2b|9ɹPu(C 9sm=e/g(  YXKFyMεAy8P` 'qrDεAy8ޠ H XKFyMεRc@1@nFSk >/[~8@Q`Ȃ G_2Bnr 0 @  P>n+,'r NX@`Ȅ G_2Bnr'l4v{|5BΟ\[O(y: 0BCd8:VrvsmP7!h@`v{\aa//[~b0 2o~9J}^p U1d\ `E!@|2WX! O\ ҥKQQQnnnnnnQQQ/_](!CCCDׅ.XƗ6mڔ{n} /0qĸu(a79J}^`*bbb [bbb233EnO *IDATojuaaZַh4u(Or'l ؔOOyo޼f67olnn?{$IF{MK놆YP޾}[$Ν;---mzkii1,C7۷ {{$ȕiZ$Ijjj2M7ACw1MǪ 7s6e{a`֭[;wjkk}Vggglloo2ȍK KlѺ=ln`uCЦ=ԩS-SJYfEFFN)aDnܸq$I۶mKMM=uꔋK:dhv[7Ѻ!hS\]]>|C:v @d=lau{p^N*F[ݺ=Vn| @%| !@` @` @.]rsssss|lÉ'.]RDb͛կ_ نo666{ڴi?Dec4/Usڱ*ׇ544,X`ǎ] (//ONN߹sl@\\\@@_~Y__UV[nڵ .LLL]h__C٦Mwޭoy&N'*¯iʕ}uaaܹsϟ?/*[TRR#Ԉ.6$%%R5G/l%΀c)(؆  |}}{# PPPcǎхϊƍg2v3gΈ1cƈܸqCU**[2h ;;GGG[g555-բ=z՛7o]]/"o>3 %uuuǏ )((*&gnݲӷ-|U>l||O|0|ccc={Ξ=ɓ's䴵iӦ/O N(||رcݻWZZd27o;x`ZbX?… %$ b ~GnݺqԴbŊݻw r  jݻEIIIqW *++԰_g0UUUVbX?sΝ-Z%tRίq(**:;;߸qg4Eikky7oKBB-}\Qx씔BCCظe999SS 0?޽mllrrr"""LM8o/)))ϟ?Ѯ],X0`?zիWof'N|/444ܽ{4--mɒ%E"ǏyvX̙caa۔1c899~7ط3g.^8===--m…?cTTg TWW߽{ѣ{9w\KO 0kjjZ=z(j߾}"##_yI߾}ظ~[ئcǎ-EQwfEm޼M6ͤޚ0a pwwln:wCCC7 0?嫫_{muuMz쩠~]ZZqff&糥_ *_l3`sfeed?E}k3RRRJNNڵk3ZRwA:uh!h~2LW88^ӧgΜ)((`XՍw|JYY7ЖHOOųgϚ5+$$klg}omԂT^^+ڹ:u*..nɞbiׯ_ٳg3\pŋ9m=6-߸իW ŋW\MJJz֭[]?|k'222ӧO=znjjjVSS+))QSS㼛֒zzzWtiJI"{[uuѹsgyyyccUV 311n&NEEO?ԩS'EEѣGs[@@ަMط8XW\e/ jkk˾PݒHD`Y0 @ 0( @ 0( @ 0( @ 0( !8::zjjj t?jiiEFF" E: 1D0xA dioaCO%%iS> +::FN Gxs{Qb>|`bb"T Wq K|L: @\pŋfjj*6? 9Ǐs+!h _z@ܹܹ3==tv LLLTTT^zE:@Peiiٳgw}n!̦/~j[Kk֬޲e H@&a"&Le` -,,# !P[DJJ~ @PP[ 7#aegg/\PYY߿U߱c“ƙ^[xxxUU pttɉ`26mj¬488;;tF}pQQѣG,"C"dҤI/^$jjj6olff`0ՙL&V=8//oĉ-7ndpٸq#}k;?611铂/))i۶mJJJ555 |TqڵI9EzSɦamm} & .\xⅮ.n ?}w#F)g;!h~L<ҥKSNuu$ 0&O|y)@,a8dffdggА !hQgll6>>Bv~~~III۶m355URRQPPhcTHQ!ъ}ܹ'NܼySHڮ[n/^e7߽{giiC555>KdaZϞ=+,,$9Ǐs!hnO>533bhɅ,Fr 痛sa!!!Ǐ駟m&X`<==,--{ݻ/z-z'OZXX(**چ^tEa%߈]]]nbbb8W@0a™3gH1,H^^^O& 2۷C$)))//SNxh%Dggg&)+%6͵>|H:4`N" C,66t!(B'%%5k֬t!Ń/gee733SAAAa$,񦫫kkk{A@T䧟~HQ!h1PWW׽{H###CbOVV bz<NRRszzw€$033ųBO?U4Op捎0!h ѱcI&?~t =`}877TL}K>}hkk߾}t yߤSIACEUUUu; %iB =`(*11ɉd@Ksssccׯd3o޼#GNd`)1c?C:0)L BX2P _|t:y {?RZZ, =ٳpKٳt .`3zwB,r wI:&a@p[]]ahhh߾} Lj_dee-Zw^A@XxCuuu&hnw:u4cƌ@A@(wD()JKK8p`ZZ,z푡?N:HtD)2eǏ;t@: @{p;ekkk``p9A@PEݪUo."=r`Q7zh))7o, ƪUlB: zWSӫWwiii /uuԩ ĠG?Sշo߄mmmY$nC`,Y"--{VbT Pi%FUV Pi%^ѣGfffĤoRSS۴i գx)455qㆵ5,=`hҪU6l@:u!v=`̂HgwʮYfݺu@K3gfddܽ{t>`!##m۶+V455\TTtACCC%%%%%%CCCZnĉJJJw|gee͝;WGG'88xذa999999C=}Μ9s c0;vXn]MM ,МoNRPP044ܽ{1cxn|򴴴ja&$@gAs𰷷_b bR3g#[qq:+;wnnnn.\(//:thll]] ^t?"ՓR__߱cږ|<000$$֭[oqouE𭺺6l,ݭ!/UTTwt ft҆ bbb@ AϚ5~(5k#QEYZZqoaaK^l;@A)gϞ{6s玭ٳgɓܯ}?(.....޺u̙ـ^d''/קmۄLϘ1cڵGDDİ{NZZZuN*ͦ/]޽{E999ݻ.A8pѣG#Fz%0[iiyHH-,bM"K 0EQ'Nxⅴ4,Z I;vu=jQNNNёNMMv2g 7o dbb㲲Ǐ;88$$$Аw>>>˗/'1cƍh"w֭0af#FUVVZYY=ztȑ.RSS(*77HRr 0EQ˗/#@Dh5n8 ;w}?ϝ;!H@{ټ IDAT۷/--tv=J___ssӧ|ӉǎSTT'%4Ν;o߾νܒ%\hoo?ٳg rU(*>>966k׮BԻwy͛7tv(֮]z%Aڋ5Bmٳg&Mz捺:,׀i> 0EQK.-**:q VWVV...`ZLQԃHg VSxⲲ ACU;/}ݵk,Ӫ`>}S`ZSjժd Vm޼ÇH&tx@-&&fر111]t! A ~KHHz* d`ظqcNNΑ#GH40<ѣGfff =` gϞ۶m6mZmm-,]=ƾ}H&a kwuu%>(B)22rҤI+ `Z_z`0Hg&aHX~}iiΝ;I{p3222 p{{{Y=`ݻw?vشi IgcwZ͛77nܐw8dhٺukEE_E:BW[";;/^ttt$@Xӭ[Gzyyb0=[zׯoݺ%--M: a!Z\SSIg< A:}˗ϝ;G: 8AWyKLLLKKWSS[h8gg{Ç6lPQQ255uqq!o«SH߿222ҥKΝ9og߾}QQQ:urss++++,,LOOY ;vH/ *bbb^~Ǘ-[p͖Lzŋ lllǏA ׀An߾=k,---ooo666۷mܸ%;88zӃpbv{sεm~ e˖S $ؽ{X,@v* V Pllѣoݺemm;v,..v̘1>>>m-@ J 0b0>ʕ+W/^nݺ d> [l@ (\TTcǎwp[^~4@H0 WQQy={?~4|ʚ={vXXX}} ((oƌ߿e``=e0Ge2񇰏Էo-[tmɒ%o߾NZN†deeqڵ4.55ĉ]v?> ׀i%aÇ:ujȑ277p႗W||<$^X呎'R|||[TTD* 5kܹsImڴiD￯_622Zz5Ƀ]pww755=v옢"8뛙y51 @0 L¢xϟ/_|夳|GccԩSeddN:%%('''AZСCc;;;t)(,vFҦa̘1]v%mH 9TTTn޼y̙?:tp|+++VN ]=AFFƐ!C6l0k,Yx(--cI0M+`z|q{|H:)++ۤNDƍCCCݻB:Pp Z+NKCCßYUUE".''o߾-jll$ѣGGi>|,++{}Kv[WWw颢omP[[[XXifdds>\z5yΝ͛7s-"IX<<?^GG'((HVVV؇+,,}6:u9p_]NJJ\0B1#--ڏ_p3t Ɯ9s ҥK 6qDa,i˖-4oݺŽudddۿ7`K˗/߷oKXXX[UUUq%%%ٳm:wnݺT''s cԽ~~~nnn/;׮]ͥ3l#蜄UXXعsgz%y?>q}Μ9fC :u*$_5eCCCvԩSjjjdS&aI>ݻtqegg;v^G8noX,SRR|}}Ig&`+UUU€k.DDD$$$vZZZvvv666prrKQԕ+W87//{@,ǃ 8pڴi߳X֭ wޏ?/YA ?~:((|CX}Τ"WWFի;w8;;gggpDqQYYٯ_]v}tq/EQ4_zumLk.[LCCtѢOPDDDY[[9s>%%7oޘĐNVVVVfCClԢ"yCTTĉ?|I"E9rvOEEEyyy :tϞ=;v$D;vjÆ  'OL:E+˗/L>]_>}RTT$؊ ??Gr&ǶJSSSYe,%%Ғ|Nɦ$,񓜜c)@WWƍ+W?~%K$oڑ/Y$11t:q/EQQQQfEEP NP?44t Z̞=t >}۷o---/^H:}ȑ#zY҉hh"GGGNsԨQo߾%DZyhCBBsJJ i-jƍHOΛ7`㈁м<! MMMW\# Z Cbf۶m~~~_})VWW'B yZ҉D̄ s(`pngbX+sOv Xn߾?Bgg]N!t222Wݻ;wH'c܏Fh is? \4aCΝ;_xQYYt`X#F ==K.ڵknnn>| H,[N__dttt9ȵk0 y=z _ׯǺܣG#Z/ŋ %OϷu]~9s&mO5MMM)))p`UWWWWWsV?#=$, ήtѢ_~ɓ}qDbFJJ k utF^^t uƍիWwyΝX<֯__]]=cƌ>}"Z-Zfv%z@>suu8qWrr2Dmڴi&LӧI'[__߻wo'Pϟ?O4.ҳg~ܹs\q077SSSߟ~֗n nnnd#A`$iU YIZx׮]>}oM:HT333v3!!?TCТ.;;{Ŋ ~./:ue˖:XZZ%iBAD,R%''i&&&AעX092mڴ;&YYYk׮Šhhh޽;66bŊCI۷o;?ؘ{D:99͛7fnnnMM \0Ck ܹcaa!T >}9sfΜ9˗/"HBTVV^v̙3ӧO:u*8b~3771cMBjpB``Ixbccq?=2333gL<߿/(c̘16m8p ׀ES`` |ܶmCOOIIINHH J9rѿŋ֜i| zϞ=I 0D'MMM695<<߁ŋ666 ߣI'Q;vC˹qʕMMMI2bĐNީY&--mĉ{>qU,%%'''?,--=|0Da{kkkMLL8Ҡ b$  KQ2e˖]x_qݝ;w͝;w]t!ӧOs.1 V_Ad~gϞuuu]hQI'j \\\Hg3/_}u& IX )))#wVVV'Ovpp8{l]]\8==ͭG˖-"Hl 0S})8͊ \\ĠCK︻Ξ=H|kjj³T%R}}}hhhPPÇǏ?k֬!COFJ%%%)$Jzz>p}}ӧOEj i]XXhlld2UTThKreee !??AAAeeeӧOݻ7P׉'G1h EEEqUSS|OOψ"a0-ZdeeϜ9#EtҥKBBBlmmۗM:Z{Էo_-[hkk>իW%)))N(J]]{7o%` !af{tk׮YYYyzzN8QF ?ӧ,:##s!!!0M+q,bzOmmmxxCCC{J,"O {{{MMMY^MMMQQΉ'RSS7m$J pccCCCIgSWWw߼y]'K6ugϞuѣ,)(ZZZ-[WXnsn `Z](_y.] ڵ Ə߷o_ҹگwyzz"jjj:vnϛ7,((PSSk$J 0@555=}4$$ʕ+,}ر jm*))utt9+.X`̘1nnnfRR7a40vd)@HII 4hǎɗ/_ر5k455ݏ="BIIIYY633߾};D{=Cq/EQ{MLL4Š]=}dr/BVrr1 !>~ƍp==1cƸ888`r(HNN$}_x|ſΝ;GMcc˗/o޼y֭''QF999уt4aݺu߿mmmMMM1Kp V:'N?~̙33 EIDATiOfΜrJ|zߺuΝ;ݓ9r1cFѩS'+++~W^zO:t(L+{d¨ /11ݻaaaO<1006lÇN:|_xx,bV}޳gO#w铡nnYVܧGHǚ1cƚ5k3@['%%{ݻwϬ=zXXXAhkkN |b/Dd2333srr_///zL+鮪IMMjo޼KJJJLLLNNÇOcc###]]]##ݻcquK]]ݻ{{{(˗/>|8<<\boD}!===###%%%//O__XOOX__{ Pdɜ:uכuE[[[OOĤW9/^Jlw_orX[[38geeatuut!+%//Ϟf:uJKK{]^^^ffɓ'mll,**JB;,`v'VUUUjjjrr2d2YYYYYYL&ڜ^r.]ulIO?EEEyCCSSSttބ?}d2 rssم9###//OSSSSS[n]veWh--ݻwJ;''g/_xgDGCCCnnn~~O233?0\UUU--- }}nݺikk v.]?B `Za)Js^^^^^u555---MMMmmN: 6---C3`Z t $H<炂ϟ?斔k3']VV~joΝUUU;wLbV9YYYuuu=zH$‚RNfWZUUU555UUUMMM +4v[JJ'rP###cҥwܡ(y޽mYb;{|@444]VVVVVV\\\VVVZZoYYYIIIII0)))r***222r@ܜ#F̚5رcE:t)66VQQ}?~|֬Y`ҡCΝ;Iz.eee%%%999eeeuuur^]]]SS_ ;vTTTرPSSSQQСCǎedd˳N={^~})+3f0`ŋ!xwLHH(++@ӟ)//,--ewċ)bwKKK%b)))ɱ{P:ut)bu)bvEEE99:{m%(vB9ׯ__z5+~%dvmmmUU,զ(]E=--b?U__P]]EQ~<Rͮ ܡCvO>BHBX[[;>>9'999|쭮NNN.77SL N UVV}Q=rviWVV?8o|I|(}}}}}W^ݻw("=8iyp#&qFaW 6t7'?B:oB@$\;( @ 0( @ 0(222<<^<χ={6t.|uuuݓ_wwj}i`R[["JYjmm}anMD#++HQ.f4UJFGGz}DכL&<c= ~~SNIP688c C}K.J1>>.Ba^VzSStO<΢$jٳ555sss!?>x'111n[*N#D1vUPP!HnݺUYY'DIʆ~삂SVo߾>}zkkK0NgUUUGGGaatq\fۍq5d0,Kq=! LhvF L>}*JYիW N΢TnqqQ:ȱl6nCp:III!<&޽{O:˗/*jffnk4h@a `OLLLCCNCC`} ~7nHOO|/_' ~NSy .H `ϟ?W:𝩩)Q^^^__o٦0=';;{rr2))IRΖZ3gHG +`{kjjvWR^~Y6X 0(`P@ @?HׅTPv4IENDB`gsl-2.6/doc/images/rand-gaussian.png0000644016036000116100000005003313373111455014346 00000000000000PNG  IHDRKbKGD IDATxy@?)&JJJ$WRHIE*rZ6:ZD,^$kٍ$GR b9J*U}9?2T3{fF3yޗbIE(`P@  @ 0(`P@  @ 0(`P@W^\rȑRRRRRRcƌYtݻw[GYY|׮]|Ziۢxe0.]dkkSQQ{dSSSxbXϟ۷J__?88K Q X,  ##*..n[ZZ6o|RxHLBrr̙3_mm,da +ذa'`0_-[>~:ZĪ-[5JZZ_~3gμrJ/677ٳg}=zo~oܸw4s mmϪ[v2Ǒ+V 0@FF&--W󗮽uadd$#####cddtU%!0Wmll:d„ oڵk7 hjjx>C\wuuueeeǏ9]6e֭gϞ-..fXuuu-Ν+..9r%KC\w3߿KwTUU?M0v>gUUUۛ@aa٧(++WG>YlٯjNNN#Z-//_^^Oހ?~LNN>vؤI.]Cܬ{7~{qudw[t-l-"Pm\IKK4h'=ѪS۠6o`v~>KJJddd:};~.{0IINdhm;~:X}}}̙M$ `+ZZZ?ׯ뫪^x/cccaÆ~ݻwmmܸqݺuqqq}IIIۣfffMMM033!n=ogΜyQMMO Ƶk:~>\XXXXXx#Gر_n߾=((8((hǎ[nk?'O 2dJKKkjj_>55RWWWyy%KTUU>|w^m JJJޟfMQFՋ ߿Y^N_:iҤN4uGu7^~Ed4(`P@  @ 0(`P@  @ pvvsNNN3}@000200),*@7ѳ|||?~6pݺu/M#""٧[4-ഴ4===)o֬YζsN$ @[ݩ1.%eeTee) 4G={v@@.~> VUUyzzZ`ȴ>&`iijժS***={ƍ[; A޺u+!!AMMMMM-111&&}?m۶ iiiSS/^ܽ{ @lq-`h%r[  @ 0(`肤իWˋ"P/8p{Hx8߆)iHS222bE:B;w,X͛7G Xzq)SLپ}{۔]vEGGŵ矊"Q!h,Z}ۋ/~=\9="Dk&YUU%))6N^^{ Jl@())O>ԩSVVVm?u>כt…  FPPЉ'=zD:0H;v͛7###G9rț7oĨuu9 ؅U"rdt a0(`P@nΟ?_II_~FFFaaa 0\ enn>}0}}e˖xzz%p p!_~WNNNdSM RDDľ}RSSkkk٧wݾ@Gܹ`WW7o9rDRR2 'Ð"z` )So6e׮]qqq?v|O?ʦLrqSSSl@>`]=H?P a0(`P@  @ 0(`P@  @ 0(`P@@vvvsvvYFw<iWWW[XXdeeeeeXZZv,{njBt"ǏMqss344\n]:p@rrr@@X~>[S;xJrrǏ9h<@NKKcuuuOS4ka2mS[__qUVzyy!h 𴴴~O!Ѵ_VV>TAA|ӧ{յx{{8fhtRYYON<رc?~$@дSRRاjiiq933slb[{NNN_f>}ڵQFߤٳا888p&,et933W^}***&<<<44?tvv„GUUUyzzZ`ȴ^q;w?ә6o}aÆQ8;KVV֭[ jjjjjj111m =b֬Ysڵxnڗ`HHH:thŊ^wBM= `ӦM>~z7Ξߵkם;w >P{޾}ݻv͒%KgΜy}EEE[ ֯_Oꪭ[&&&^~wo|ſF@p!iӦ]zuĉ=\TKKѣ}||x PBjll422Zj'OÇ;vl֬Yt9WWWAf.]"001bѣIŋ>}t PӋ/&;SSSsrrH  *++_>o11E9stbP̙3RRR􈛛[PP.K "  xΜ9#p~nر***w! 0yyYY EQQ˛z{{7"Uӫ;w.Ab S8 -BCCD/)""t*дnii' 8p…'Ntfooo' s! Æ :tݻwIM X[[;%%}JjjO8qbQQrP-777++Ąt|aaaSP<{쀀)\>=>>~ر|@K.988ݛt|Q@^lY||}z͚5+<<_}O?D"8}SPGGGO> %[cbbddd8μuր---iiI&]z5$$Ɔ|@:hbEDDxKKKEFF/(`yQ~FM:a˗/WoܸQ__O:_h'<<`0yA @/YYYņЂ}DD|p;;;qq7 ˤSaooO:]0̧O{pYYّ#Geddddd՝9RVVFMDQ]]#Qplmm1 B]ljPPдiӮ^Uss3gΨzzzR@]~DVVtqpp@Pj>RRR8Cdd7|ۺ:~&$_蘛IA=}tРA(_#<ڗ`$&&Ο?DPcccdd d2g͚`>ɓ';~ɓ'y@TƎ=z.B GAn[[{UUUKy󊊊>X^^pBDQe{kllE:/u^꺺mSn޼9a ~-ɽ{"pE2\OOA>|8%%?Ԥ 8 {~t-((ݻ7, ZN__ѣGӦM7nܿ+ @.1UUÇǓ3]8KLL_~ _ [Ah 7f!U?ydiii111o߶w2akkՎ988N3w}?(++:thƍfڹs'DƟKAx~]rrٳۦ̘1#!!իW  *jjj⬬Hvvv8F|yEEO&ٳ ZG:n`&aӟ>}ZRRB:[K,ɵK,u$r5܀K3f̸z* qŁ:H:0kiiIKK#[4󼏏Ǐۦ[_~nNNN^;n rС߿۷/,lÆ H¿FpDD;wwƗ~W[9j]zo>EWW7==FFF'@w`fff޽o4-r)eee>l۶m[4q㆝ ¯W^;! pΙ3ѣ- sHuָqTTTHTsswbccO>q__ɓ',Zh#BӣSSSoSPPS޿ogg[ZZp8 xhʕFoHJJJÇWSSYh=~8??xϖTUU/''UUU}m&FY)))VVVmSRSS;n^^-,,( q"kojj>|͞=\RR%HIIM:;v,55uذa&&&k׮%ui"##9~AϞ=; }J@@@{-**޿?ѣG #Gr޽spp0`9###irow-++ & (h:ZUUj*"##:-[,Xcx~߳gekҲ0`eTcc#ZJKKGo mwmܸ1&&`XZZ-D] @}٣~V0hР͛7>}zРA[cDDF͡%447[l٘1c###o'O3g?j(yyo=GӐ]AAy{d~>}_zECxǏ<9x)44ȨlťK$$$xLEE~A۷FCCc֭%%%=\Ԝ9sy OP|QV$##czyyw{Qbbb<[(`+--}ܺ$66m$A1d__ߤ#GdQs̹t """f̘v|ãg aÆ?~|=Y   {!!!s6mdjjjlls~)/_$3\q\zjС]JFddɓ?6_=dȐ[ W\1555lllоڰaCEE73;;;;@x,$$ٙt ~:mm .t:Yvv۷o)UkCm7TTTloz)))* \rѝl2--7R  ;hߔcccǎQJ'&&n޼91 Ɵ?~m6+++W_`‡dN<,--_xGA$.AL}}}ddz*55uɒ%4_b2aaa|  3ƍx=qq+++SLa  3.]TY|ۦXYY%%%˗/$lْlbbŋ)RRRf(4 7nj3tPADrDDҥKڎ6wqqa*x#88r&KLLlʕWUUmbkkXTTD6;\q\QUU566vǎgϞ3f Pfff+V  .@kQQQC SUU>ڗ͛Qhlq-`*www&dggG: pGUUtY@4K>~8xtKs&L4i1, 00 @_W\0aڗ.\f͚zq@ԡzٳ .$:7cƌ쐐BL҉@UUU111ztՋ/.Ydʔ)YYYCBtutt?~cXXT ;w`YѣGjjjBtc̙N0uʹs,X@6poԩ%%%  dp_p4|Ǘ.]9rd#Fۗl<ަM伽Iի״iaÆg~THHVUUU󤧧R x-00Gf̘Ae$58߆$X,֮]Nqu֑=RWW7tЧO4˧(++KHH5 袦&""RRRAAA?K 5!!!fffS@(f͚ehhȿT "P]s))7LMMۻ,ļ|}}]l P mmm?~'榦#POLLͭb988\~݀sʕӧ/XW} /,}}ѣG)0?^:<<ݽK QWW5jԍ7HGu А׹0)@Wp0ptR--͛7}ٰa[ZZx  +gΜ8p W7t޽XQQ` P\9qW_}E:;wz%%7oeff*+0ÇjMbbbYY̙3y4e˖;v a2ڰaÓ'Ox 6a ZZZ'N`2=_ȑ#nEmUTT?v8 [ݛsww'h%77Դ|j_:dhZnݡCp111/0h[iiizzzStuuIxѼy󂂂C_:spp(((x h:*!!QSS~ƾ}wD A u-IIIsĖ:p@RR0M"7M ooo1NH炎0L~/ׯ_e˖-qFvv65{qrr25i߿}Jii)Ffq۵y7pA'++K޿oee+'gjii"#۸q?SQQAbbb6oD8ٳا888Sƪ'Ovz!C̘1#7.!!ٳg7of@M6\jOIIi8Kh444]ݻw7nܠr|!FUbby^~M>|PTTfu);KVV֭[ jjjjjj111m9p,˛6mZIIŋ\o%6l@J&N8dȐPثW/&ѣGNNNW)"u?#..ʕͅ/'_#i8@+KKKWmhhm6GGGW Ңyq333YQ6tP"USScooOſ}P^^~MPw۷MZx˗/HꫯvL*>k ݻyyy...1oFnbbb||̙3IBI555>| `0vܹm6[ gbb"FEEM>}̙(` ˗Ɵ\qwfgg%))e˖={ ..u=|S(` Ӧk׮5o߾cz:bŊT(ER>quݺu+&&fܸq0n޼YXXh"A$$$nݺsHY@Wp0%''3FJJt066oΝK:FMM'NL6t2~xohhhmm LΝ;oN:X;v]ܼcǎ_kEEŵkHI&Qyj9r!hqɿW~ ۱cGrr2=xСC8P0 6?߿t<_|񅬬sH##'OǓ\扄77SӇtO111/_&ҿ陞.!!A: D)p555OG嚚111ڤrpp6mڦMHBS Cqqq;qIglÆ MMM{򥩩izzHg>BS ,^z5uԴ4%%%Y@[b>|tN"plذa֭h_9ooTA:ɓش0𬬬kג@AA{͚54/ &ܺu?& =3Z]]ݦM>d2Ig!|򺺺gϒ O6mҤI}a078oEEE?tܹ˗t;}ÇHg\QQI$8R(N=~xJJJIJFFƔ)Sx t0uT//9sTUU3ڢӾ|%z [_}N[Hgᱛ7o.^޽{UV{ʕ+z" 7cpJOOxԩSIgYf9q{zz ٗ{ At$77G 1̋/FFF G}=uuu//Bq X8544577Bkk믿Օt_~ӧO/.\~yyVNNDtVzرcǎ PRR"***f̘ann.܃{ ^zeaa믿.\t#70 \9x𠖖VAA͛7###E}gΜ9m4/ѣGGFFnڴ),,t+~mIBuuY&Lp!Yɓ'666,T{`ń-`oIIA: @_|P-))… }...tx'!555r888\t)>> BO>Ovrr4in`0,,, yY&33t"~qD_xvҥ$NgK,quuL&8r}WWW~MJJt޾}{y---10M) IGGܜ.t~ŋ'O ***֬Yt}}}q@S-ବ,555*H˗/}CGfffVVVfff|}Xzh_vFYhѓ'O={{q_~ v8p5kH'ls;gϞ{7oLLLo>e,Y(,]t۶m,ׯoڴiȐ!.84UVVſ{ AS/Ӎ'N:x={L4 ;?Z[[رC \A׮]KNN611100BP]XX㦦&V NڿݻH'J___{{^nf@PBB¹s߿:lذ_~e]] Rܼܙ6mJJJ500pppXv-5F~~'=m6 tÇ511YvE3EEE:inn0_>pPEEELL) '###O{g߲Bw";;{ƍ7od03g|Çʒ¢좢}1BCCcȐ!#F=z6/_zunnn~ 4l0%%%eee()))**ONNN4фDMM ׷ƾ}woBP?~LJJJJJnlllhhhpyy9߿۬_~ ***JJJJJJ6l2.  JJJ򲳳 KKK++++***++[ZZdee'###!!ѿ99^zIIIIJJի։ƍ377!%LfCC NsN DT^!hc [w![6m1p;ŽhkkOIMMŕ΄gϞ>% F:V?<==WZ`0SRR󟶃! @Bm6c [wa#nJHHPSSSSSKLLC@KA.F` d.dfm0urݴiHG]=F` d.>e!&  0(`P@  @ 0(`>C:FOxzzKHHΘ1#$$t?R~H'?IIIWevvsNND/W+:ɎniT >C*((>Q'Mŋ7n?~ǎsX,>}ݻwkjj=zwqҡGKKkΝϞ=eUUƞ={3jԨҹn/W:نi$˯J+ hxbfdd˓NbX7oniii1%%ECC`h_yWWW) TUUwE:ݺuth_!:4*e (((2Uϳihh{yuuСCLժlzzzG8XۣG ا竨\ 7%R3S(QZt0IÇr^3y&NXTTDeV8pҒHmm픔)ZZZ:q{sL?޶^ܸpႉ  FMq?vX) zٳا888#(o>MLKp,B,,,޼yw<~t.?heeVXXА? <ڵksX,ٳgIM++++v! jҹ>E Mg)Z};fI-8|.:CcH/@Z4!itqpW%0il Z9( ^^mw8yF/#`\__bQ.^^^G})#7ktyJRӹ=y4b[lj BPhZkber-eowBMgx 0` @ @ 0` @ @ 0``?9999889-M @V|||jZ$V4'``X,bX, ;>>I2zvww???iR$hh4ߟ΢@>y b2~0LA>9+^_]]moo'Il6677A8+-$IZ=<<  0` @ @Cg#7BIENDB`gsl-2.6/doc/images/rand-gaussian-tail.png0000644016036000116100000003422613373111455015303 00000000000000PNG  IHDRKbKGD IDATxy\T (iF஡$( jV`ieRj[޵RӪa=IfjV 傢((EEy.Eaf~3%gss;h4LX#  (`$@  (`$@  (`$@  (`$@  (`$@ /cv^|={H ccccصU1zfzg̘QJ<\-   ֭[RRRAAAzz̙3SRRdG3{4ʋN<9wnݺYN+1eR076U,ٳg{OwyYYɓ,X +1^wU<%%_~;vԩR*10Z`ĉ+A{^{wԩo.tDUpԩmڴqrrruuׯO?TCfg~۶md@^Zv:iҤ]W>¬ͭ[^uooJgƎ۬Y3gg稨Ǐ?TOm?m!!!!!!6l]v8ںukTTTOի?}3ff?|II֭[ Ο??a„ŋP-;nܸ[nmݺ5//>[pw}WmV'|rΝVz+L?W_ =sLѣGwرcΝ8p`dddZZZږց^x_pȑ#˟` `n߾]o{ק|aƍ *]I5U+Yao6lѣGkeU]U-u떣c !,XPӄ3g}hƌ#G&U5|O>>U=Y'RWzyy.* ;HJ`̘1~j\t|uٳ~n߾'5>TVk[O&ZmU̙3zJS~͢v#"lŋuGDC^ǏoѢEV];@ԚTA6QZZw)S?СCTz~:M}f̘ѣG@l4 5eʔhLMM>{TTCݽXv9 6nعsg)j#༼>,,,LvQHVV#w߭t8880[F,uF/_`ܸq3j9k;B2/_>a)`-֯_߳gOggg^|^sqq:u۷- i4~Mv X;w1"666---++kҥ+V0ꐱW^?pffg̘ami5oήEN2Te]3 dm,ʛ?[oueYA/_2cƌ[޽[eC{y䠠kΛ7o]v}H4?/e8.ytLjB[}̙3۷odccӴitmNвeˉ'O6i i4 R0 ->>>ׯ_7Mo߾UVeggk4[nos޳gOO2Vꕕu199Yv3##߿|ɥK/:'\5k-[~7gX'FPF f ۷_䫯߿[ʿ\lܽV^ݫW/04M-/\0~W^nnn<"!!?7EEEEM8>hР+.\`mU\dd+һwoUV-\pߨ5` i4 0oٲeƍ[lIJJjݺu]S~P !6mZŋ !:uԮ]'NTsL>=!!sNNNaaaNڳgO``T†ې2sR;;7oΛ7Ov^/^|im>{/_9`:D9"; 0WVV֠Af͚5iҤM  z`>(`~CɎBP! 9rLv"a iӦO(`XU}@0ԧ{oPPPPn3`&(`O?^\\,7PPn;::mѣr# Uxgf ӽ Zp@믲Sv0WaܩS|*nРA`` 䢀 ,ѣ䢀>  瀅=z8pF (`p-ϟ?/+PP߽,  Q UZ܉@" ꫴwz]) ZK0WXH E  1`(`ҥKzzM (`}衇:dH@C}ޫBBBo< (`XJGB={8py@PUMA !z~> QP_5t9G ꫦHBC}0HAC}\-ƪ[nOya *4r'% !BCC`b0Wck6Y0AܫW/ގQP_rE ",={۷4y@P 8- e (`6S/^3M$ڌmmmw믿&PP_m X0 (`6SBн{  ֠#={z " P`B0WVVF070W)hA0! UB6mgdd;PP_GBL| ƍsss͡&HKQSȑ#jdl,u*`N0 [tq:pݏ?^TTdTCS;::v999٨@n޼]-bccO:%;Hݻ={2>>"LBW] Xѻwݻw)U xսzB40=FFF]6++ݻϟ;wY͛'1̊Qo^UQӧOOHHܹSXXةShڼ0_u Ikggw9#E}'>aDTzaaav3F$00`(z036F0~ܡCŒ cD h4uKaccH~cGyYhFBC}z܆uX;,5x$> aÆ!!!{5x$> X0 h(`OPP_YY#'N6P@u8 ;PP޷!iq70c\%߱c0A= 8444%%͛0WNNN]vݿ# *h>}ܹPy@P`0P3iࢢ"Ayi`QP_۷o7H0A o߾0OA !zyׯ$PPAFAAA{1H$>`AQ@mEDDl۶Mv >B;w.?? 3m=v]U tӇ`0Wc(׷o_ APPݻwOKK5X3 3`ٓꆻ 6$$C բ>^- z˗ B։ xA%z>^,4zh43vR4hPZZj>sL>}0gp6m5jt)>öVdd-[ Zփ {V~QꃓJJKKKJJ \??l;;;îY0'߿ JPP XѿfWPUR\\zmc… _939`@O$]|2PP񦠅ۺuV@m0g~G9 @?0gҥ͛7ϟ?oP mll"""d$z8`(`(N*h'%%oDCqF0r>>>w_rr6@I0g)h!7mdMP Q ř{dggu+CCq&(`;;p @PP֊ڸq@%0g쫠 iӦ2co2(`(SBVZy{{s3ڣ8bРAB= 3YGEE&5PPi.BٳW^5(4i6dkkyfl2ӌ7# 39`!DTT/'# 8//oҥ111ξ111K.3MD>LY-ZhժofhUpFFƘ1c|||aÆ 67>>>G0e\LYYhfS%* ,8p`Oظqoy[n366UXs 0ٳܮ]|MޑP]tٱcGNFw^A`v?anfP ?յYff8<~0S& Z=99988ě`)ju`:rH=?};w2B :4vX :th||_~sҤI xwM'Y'&&~,E|…!C/yGO>m`a*ࠠ\&SswZ8L'>>ަ2sdp [bUV||2s4/40jTy`|  02Y;rHnn0sU~u֪e˖o8Ð5-۷MlO>ݣGǧN*,,,,,~믿N0Reoo/%z2^#NX&L0a1m@%"wѥKm۶EEEa̡ᇲ21 ' 0|XvQPYMA !z{2` sֈ#VZeVrRPPYBtum Z{,;N1bڵm Zw'%%@& +++3)h!ij>7N@&;0e#`!3c~DzS0.  **_bjPWwXacc3f̘>HvFd+;`\/b6mrss=<}1A Yև1T`gg7v%K,ԒzW^';8K/`OOA-_\vFCq^B/YTvDCq ppp}?(`(΢oC*o̟?_v d&z}R,$$dӧOGG ]b a~QF.5jTbb<\݆kƌ3grhi?~< @wC=tĉjyvvv-Z=uꔑb(<- m߾=L 8??iӦK<<aT I{bAԁ:utQ%;vS(XѾ}A3-!CTbŊC巯^W^Fc ,1c'|);23f̾}Ν?gΜ= ȵkfeeݽ{sΝ5kּydٱnժѣeP[fZ...۶mKNNnݺu֭<\铧Oйsg''SNٳ'00ęa4瀵MxqAԊ KecnQG\\\xx / ;),Zh۶m? :V125ˍ7ɓ۶m@ͬe%瀵5j4k֬iӦ1? 곞B >\j*AԀ0{,]tʔ)ׯ_@u(`(z.Կs:u`γޗ_~yIAT*r_~eVw`uׯ__z *GC}Y 6\tɓ egP uFFFΞ=[v8+ Z?e˖q5`+aW!y{{ۯ QPu^W_---Od+a瀵4h';  YmH:v8~c/0gWA6mիW+Ak~oVff,<+ IW@@/__F322kAPPSк/_>ytYkGCq\A@@ԩScccKKKeg&p&Mrrr3g U8FjР_'رCvzq`Rޟ /'; `(`(K/7  1]{իK,FF*vvv+Wٳgppp=d #(ރ>_<ٲօ8\!C>3%%%Vx/ژ={ɓe&(K|kC{gM-[&; `- *Zrss{&;>LԶme˖=ꣀ8'M4xׯ(UuoܹsGv@e0}zXpK\\CCqаaoҥKܘ QqttLLLܲe˼ydgmHP7ww͛75mtر8-Zl޼O>...>8R(`p}m޼922QFÆ P qtuqӦMBPP " `ӦMQQQ%%%#FP Qe˖?(`ԩSRRR _{5qFCqakn׮]Ύ@o8.2֭[߿֭qqqwޕT0<<<~AI~80Aq|8;;W\<0EXckk駟6gϞ)))(`c6mڂ  ; `I  Ĵm6:::99yvvv4t钜֧O q @Cqɸ[ _d q)L6-!!aSLsD8FקO#Gʎ) x~͝;Dv"PP,?;w=zTvPP!ժUM6+ 2eJaaD1&...555''cǎW0 0Ufkٲe~9sx ى(`(YիסC"""ƌseىi(`(67&L?5k-??_v(@ ͓yRRRrss۵k7w7n q9kٲ姟~gϞcǎϚ5+''Gv(D80Aq_۶mvqҥvM0ŋCFGCqh߾~z1{{#G8p@v((`(ې,K-ϟֵkQFuy([&Mǂ Zn=vh4{ذ[斞*;lٲo(66vԨQm۶ x@TVkFF 0ԯ*!!UVÇ'|A١8 ؤ(`4iʕ+7SZZ}5k^^^O<Đ!C~a71P&E%++Yv^YYفܨ~EDD4o\v46) X%NNNΟ?iӦ-[ܹy>h^z#;,lRJrsse>|x۶m{ݻwg޽BBB:w456) X%@'''߿ʕ+ݺu޽{PPP׮]6l(;#\/N4i˖-B~-ZUVzVCAA ///СC:x`JJʕ+WڷoߩS.]tСM6~~~vvvc¼PչqF׮]ƍ'裏꫔OQ*qGUܫĉǎ;v؉'Ξ=׮]6mjժe˖g(,\СC+W,_s?^R*iԨQQQ 'O<}3gΞ=qM-[lժ߯mӓGW'""bڴi/_/HJJoJlmm9eee]x1##ҥK/^tnnn^^^͛7j֬kӦM====<<-E@puSSS˗deeu-33SR*iذݻwƠhrrrsrr233]}܂|77777&ڸqcGGG'''WWWC...6jADk^pu5jtM݉w6nܸXR*iРAii) [AA͛7_}Dw߽{ƍBwww!Dƍٳرcw-4vةS%z0b#h,ݝ;wtܹsQF5~k} PKS思~oz`xMc:u:zԎ;@T(!CXBwɊ+*+5RaF0 `ѯ⣏>ZlѣG&jNM?7=tu\\\mۖܺu֭[mL2?SSSϞ=+7%:w\e ,HIIYbaOׯ5jQF%&&YЏ]Æ e )))}ҥKe_(??~< @wC=t Yy`=6nعsg),LAAT+";u֨Q-[";%i޼]-bccO:eSoڴ3fLiiiii1c>C0F*ܹFٱcO?$;& @EW^,((ضm[6mdDh}ʎs֭[ϝ;O=:%%e֭jb /AAA7oB8qbȐ!rww P #`7n\ll};v|gǍ'7$FH (`$@  (`$esbIIENDB`gsl-2.6/doc/images/rand-geometric.png0000644016036000116100000003014013373111455014507 00000000000000PNG  IHDRKbKGD IDATx\Tu3 *huSjb3#Jjn^7}ȣ۰v[+͚߭7S6Ї?0AZd ?Ds^ϿpfgDt:%kD` @ @ 0` @ @ 0` @ zrȑ7n|M7Wڻw.NM\ xSN]:00Э/w_RRRQQѹsv+r'(t::dɒƤ͛7_֝@rtEǎ{>kxGG… -[&j0w:RWr?x@PWw˖-{g;Wkƽ}YJJJpppLLYXXcC:yΜ9Ço~t:[ZZ͛9lذgy槟~Q\|kgy&**v}̙F4hPbbƍr- ,666 !!!Co Ν;|ЩSVVV?o]cɧqҥW_}5&&fРA7xo''obcc99>|uΝ;_3fݮ}}Q}}3g>QIf͚f͚G.]t֬Yٳg]Gx^_aI|I]?G^x'.^XRRzuƎ震zh}][[ٳg M(Iӗ/_^[[[[[|򨨨Ǐ0mPsYhѣGp 6l _xsx?Omv}~['XvX$Ns߾}G{-(^lٲ]?5k֢EzEuw.---tΐ!Ck<$I/^O0U_oNj/;vvm^E@!w---Gt4vX䆆kvn7]:w\#G񚜓'Ov=Qz].\霔ٳg:u/$׻.ǎ5jTS%vtzІ ޳x}n7 4C\sͥK$I >wܠA:ŋ{p #>J׷t6^u`^ MUUU/=~ɓ'{]vĤ>YYY'e/kBg v ߶cqҥkm&,I&|`8}?i]]$)**h]OW(^ujÇwZ˵m۶1clݺܰa󼼼M(Iӧ;tĈ6tɓ'2v ?sw>eN89&M*((!ԩ_M&S?&Q;]lʔ)~?fp)//_|s=Uϙ3gΝ/wBI֭[駓'Ovo/?{?0J \e˖9rŋϟ?t{/η~;jԨ_WSSӧ~*=j߾}᮷G_~]pGߺuO?}ɋ/~ ~jhhػw… Ge˖L8?ioo]hԩS7$I=؟纺?QQQGu}tƍ۳gυ ;vΜ9m{x 0o1cu]CBBnWTT0u԰O4O??uda\PP ãܹ3666 @H2cƌ^oaÆd%g| bX,}ۣ/h+++ݏ$$$TUU˗/?2s00|%蠠 .zH{{!CZ[[{?ĉ &_܏zçz^㣼^`>?%%%p_7tѣG#""u:}Z*S>9r#qqq= |46f&+WWx%%%K,q8#//o :MlU2GV\\\ZZj4FcYYYQQQhhh7y7\-x ࢹ7a0` @@몫f`0 fu]6!iMMM&nvɔM:ƪgz/2$ڑkGf̘|mH ЙNknn;wCCCNZYYywRXXhX܏X,`egg}Ǐ2eJFFƉ'.*++ݏ$$$TUUph^?jԨj7|󣣣ϟO[V]0S7lhh6oXZZvAe~q~N[/>*?~ 7G?>qӧON.\#C immW\YPPk׮OZ/T_vweQ  ઠZZZ#---wUQQ%KJJϜ93vئ?Յ7at{#F?KwRQQoJ`[O'O,#96Nl6[VVVشiӄ Q/A*t{,55G$iӦMyyy{7n\櫓1111;;{޼y$k֬)//JȘ7owyԩ7L w-//o;v|'U_IŠKKKFh,+++**InnuƏ2qÇݻ׏(. Ue+0\xF @ 0` @ @ 0` @w\]]m6 `0555=ѱbŊoܸQ9 pSSSzzdvd2edd477wwO?]QQ׿||\.=Xv|dƌ)))999]O޽{e u:}Z*S>z\XXhX܏X,'_\  peeebb*'MMMiii!!!aaa'O޷o*cO>`~$22uuusΝ5kn?qc=_b޽L @`ttt5k맿կ$Izw-r,WᝮwϞ=X~ꫯz}ժJ&/|4G***;bZ; pfffs?bٲCos?}d666&&&fggϛ7O~{͚5塡ܿ0ŋsν$Iھ}… 7o>dȐ־|ʕv4պxbͧE5NtƟ.}GUQQ%KJJϜ93vئ=߄uҥK.D/x{V|||yy>\rIO|46f7m4a҄k? ${v%%%K,q8#//o زeK]]]{{ɓ',Y^1?  |tφFXVVVTTu֍?>$$dĉ޻wdRyfA 0hFϋDQF}7Ѣ ބ  4g&T= 0MYxE 0hz+L@{^` @޳`*WP," 4g&T= 0MYxE 0hz+L@{^` @޳`*WP," 4g&T= 0MYxE 0hz+L@{^` @޳`*WP," 4g = ^'= 0/AP," 4g&T= 0MYxE 0hz+L@{^` @޳`*WP," 4g&T{l6 `6kjjrXNx~`*=Ԕn2vn7L=tΜ9W^QgHE 0]jUjjjnnnxxxxxxnnnJJի{U~~~TT_` @>g -RPPMg333m6͖d\&T{v%%%K,q8#//o \*`*=V\\\ZZj4FcYYYQQQhh4`*=@bbbnG{~y&T= 0MYxE 0hz+L@{^` @ a_u}}$I#G4LӧOU`*vϞ:uj٣G^n]wݵcǎ;v}GG>uꔚB800]\Wcƌٶm۔)S܏ܹ׿ulllKKsB=?D(2mڴNu7uԲiӦ)3!<BP^W~7 i`8((H V{wz77gqtر/СC.\ȷKX"}NMgeF`X"4haD(=oڴ7feF`X"x9s;w=zӧ?C^Z>,`=C q_t?~z|BB% @yj 0i}Ϣ+,`EWX"=D(O{]`IEO6`0暚ܿvv1cF=y?XQ $)00ҥK|t655L&nM&SFFFssדsrrv߾ /~K @yVJMMu477_t=q=;[o]xJ,`=[XXhX܏X,>\(0&`PD# UUUܹs{6mڼy`Pp8"""܏DFF644pN'Z D(t:gΜYn]eee^^^7Z:oT֗`PN׻gϞtMȑ#Ovھ|&s,`=_^^~"..7[KD(Glfffs?bٲx󒒒g ̥ X"{v%%%K,q8#//]'{-((ooo׬YSOk"X"{6,,h4ƲP'lqqq!!!;v㏧N~K|ː$IٺukwuԤI&MP@% @yZ߳Kg0i}Ϣ+,`EWX"=D(O{]`P,"j;]={5q'K/M4bZ 棫6>>HEEE\\\w>}zԩ˖-P~:FB̴lGl6[VVדL믧2?#p!|tΞ=dɒ%p߿?;;[>3SLYh}'bRCB +...--5F(44|;Tyf@B!Iu>V)mj``uX@%I駟D-V-<`xP0dP0dP0dP0dP0dP0dP0d_X@!jM&n&)##x≑#G۷O!dѯ^jUjjjnn맹ZzuNN+++UΟ`@F(]b)((5v`@F(]GDͣ`(GWለp? j CQ^VUD"CQ>j;]={5ZNoQ.`(GWm|||yy8QhdUi܏l,QhdU;{쒒%K8ÑlV9 4U[>jŠKKKFh,+++** |O^+AWPOX$lݺvz950 #P0 #P0 #P0 #P0 #P0 #P0 #P0 #P0 #P0 #P0 #P0 #P0 #P~3AYpppkkZ```ss^="@N=H111N3fA0YLLw}'z Ū @FŪ @cEOX@ȌF#Wa %hEj`Ej]uuuOZx dѧN=bWê V0w|)rX@Kê /A+U ;!<`^9((p(w0wz^w_*wZx rw~g?0`˄ ʔV-<`p2dH\\rϪ ;S;gYZZrwΪ '*wZx :trw'l6 `6kjjDOt"XMMM&nvɔ,zuNT~~֮]+1cFJJJNNNP󇧥p8E>A"õNaabq?bX DsU 211HBBBUUyj]pAGۇ ڿ;K4\,܏z×_~YG?\EEEUTTDEEG꒒jkkw¯|a`_WݏTTT(?hp!6f5Ϟ=dɒ%p߿?;;wyx$Ix|a@|w ,(**$)##cFQP's H< <<$෿#'gg@$~V]w%zx$IIYMX\u0` @ @ 0` >l6 `6kjjDO$_O6LӉE={L6mĈCMMMݶmfcƌ =zɓ?cCTWW.DO4hjjJOO7LvnLfs'9r}D"FZZ?m۶+VXիWJU999IIIvjjjo_xW_}UtΜ9W^=NOx|7$_kGf̘#p* c>vة:~p8D"e @,zG}ለp? jА|rуzͰa¬Vs=#&++k͍iii=ٯAAA.\!C J -|gΜyGVID"L}}}QQ… ΝK/G=ӟv-$\`׮]HZMQQQQQQ򑺺ZS ӟ222D"ݻgΜY]]-z7h4G̙3cǎmjj=@%h__^^~"..N<SN]lu[EOǏtXZ>`_i܏l,Q@)Sg%%%?DO*gAѣ iӦ &buϟ3fL^^^CCCCCëzE\hgRREO!=ܳm۶3gδ:u޻kK0uHOO߼ysmmm[[ۉ'~s 0^|w ,(**$)##c/iO_6l{7|>;w܈#nn=`ZpqqogϞsEEEtM`MG9` @ @ 0` @ @ 0`t:M @IIIItt;#zھ}nڴ;= o0>+Vٳh4CK.---BCCE'=F]QQ1j(~7aL;>,zoq Nka[~w!z(q ̍7N6m˖-goЭoO>:uS}Y~ @ 0?r㇂ IENDB`gsl-2.6/doc/images/rand-gumbel1.png0000644016036000116100000004473613373111455014105 00000000000000PNG  IHDRKbKGD IDATxy@L>TJL$)J%%E^ŕrBd WEU!jXhWRJ'̙WΜx9L#@@  @ 0(`P@  @ 0(`P@  @ h4ex|+7իWkjjJIIIII 8pٲe=yvXl%%%Y,wޝɓ6MAl(Cq|OXxq="##[?3eⴴ={Ǐ;9yؖo%%%W\iӋQ@ Sb2  55uҤIz^^[[qÇ 8O[x )XG*@da kȑ &$$ݻdZJIIIFF*)){uҥ_~ΝIÇ_A2 11mt=[VVrJEEE%%-[p8rGGݻO>:tÆ /))ټytn,,,n޼YBw Lfyy?bynfG9bMm~7n9RFFFFF ɬٷo_~$%% p"Q{ĉ Y|޽{V^`#G9b޾}[˗/>}zu;^~!Xtgaa7oF.]>}[r۷MHS˓5443s 6|𡲲ӧO7nܘ4iRS`04HG?~x弼܋/*((DGGׯr_~͛7߿oG{(`! VVV+11~IAA|nnn{^݋/zWCSLiku۷ox:W)##ýѣGC_}.//jN׮]۴a0njw}Zr.,++ܹs kG455_|sGkkk<%_oZIII y݌3t颭tҀbeeeSk~GZo߾}%%%Ç~u֕+W2Z1vcS;RѣG7nTVVz;ŋUUUٿ򋕕UCׯ_nеrG?bl+22RAA,輼˗/+**rIL$gDHS Ǝ;\ZZ|riiɓ'l⬬dee&Lp޽fۦ-Zw҃ Znܴ{6p#!!@ 0(`P@  @ 0(`PPmlllll222YhpiiaZZZZZyYYY3O/Eh566ҥKK-ZdddL&EwQ߸qΎ{]`` <ENJJ^STTT{p—/_9 @Pt޽\RRR3bĈ?&@{q(I\\{IeeD+>yW۵kWǤK..eZ.X,6bdgg鹹:N:kNA&$$p/a:::|:(77n={p{ŋ}x)S5@[ߟŭ7"=o71zwrr={v=z… _p{꾎ڸq '}gmmmiii&Vh2XťSťA$Bo+9f-((8pWjjj##˻tRryy\UU~)11h_|y|MJJ|Zz̏-v#`-%%Yf>}`Եo,뾖ؾpʕg۱ڷfvO[f֭[wɪ*77!oo8qb&L wQOOOG1!.iЌΤwڕ2w\RRR8qѣGuڵBJJjڴi]tyÇPSk43iee~KLLÇx6m]/haFM1;v4Xt ғ'Of+YYYJIIM0޽{l?>}RTTlꉟ>}Zp}III;~-rǷHK;x DQ^^ګW5wss{7D~T0 t#Gq?.-Pɬkpႜ\k0@5w cH@  @ 0(`P@  @ 0(`P@  @ 0(`P@  @ 0(`P@  @ pzzMFFFkd2#(Zfffiiiiiieee?,YdϞ= nLC:C#\]]ccc/]TdѢEFFF<^^^LfO_#Pt| ;;;%vvv<%>>ĉ|-त$}}}%zzzM_^^ngg)++tEѹV _/ڵkEEE;::ܹ)6 LJJ_DfcEz,fX%999߯V#` &$$p/a:::~5b, TF6m///kkFW|~ EZKJJ gBBL ` xB䦠eeebbbԞ={Z߾CF` uDn @o(`P@  @ 0(`P@  @ ^MMMFFF^^^mm-cII \L:@{FEE|RIItIEE=z;vɓHGLC:08,ԕwi'6LRRjo޼ sNXX̙3_k4M#PfڵC i.\a''')))F_#=`sРA>}JHH8}tۗ`HKK޽{͛?8pg`)%==}%%%OǏ5jT_h #`Q!!!#F077I2 cc㈈M6l޼'/ &5#`puu=t萿ѣ:::;A֮[|j_|UgggSSS///>mQ5#`jjj첲u&-&''ؘ;vL\\\[a0Ͽu`ڗ`DGGgeeYXXf P@!1///00PՕ~ȑ#nj&Mh¥(BvؑJBbbbTUU;v۷qZ իQQQ]v%ٹ{'Nqưa&zFIX1gΜ 8t Zbw6t1o޼/R} ŋgΜCY0kF۷q͝;wƍ4>#GdnHk2LYboo]===YLA=ߺu̙3l_aee6eʔwޑ+W 3gΜI&=zHEEt ̵6SЂ1sAo޽{߿/++K: (߮۷oqhс(0eeeufSMM͌3zyY@@pЊp/ԩOttCHg@޾}O:H{tƍF֞:u*8 0LAϗ/_ttt^*ԗxuXX.,_xXPaÆRA:˻v튎VTT$,P(`>aIIIJJJ͛n߾ݩS'Y_P 3g:99555SL144>>AAAP\MMMF: EGGO>=22RSSt=A;wbѯ} MYY, L0kFURR} CCCYNLL… a B?8q"ۗ`:u*66ܹsPPnnn\\\>}Hgᯗ/_?^.p .\He0ڇZ` PǏE>/9u P:peD} {hh?C:Pz'rrrܣGY*66vʔ)jjj@GR扟>|t믠p\&@ء q b٪P[[kii9v؝;w(pرݝtb vu1 AŚ111#M6Ȑ$gAddd4'O%$$TUU'Nx5AFN81uTo_1cƌqϤQKKK ͛۷KKK7o޼o߾]v 83)++;v֭[IWW׻wCѹVWWK./YhskÇo똂Ǐc^ddٳY,,f"7} ;;;%vvv|8>ADMMMH{{+WBNJJ^>|8o}yyy|MJOO%KH.111ߓQMŽںOC.hvJ: 8p֭˖-%hX"**~+*****ڿW~vɁyyyUUU?~\|HQeee.\sk_㤃a-`YYٰ55555gϞ6uAݭ[zyyHKK1"88ڵkVVV,.^8z"Ξ=o߾7oސ$lF$;z Hnnn>>>b ʼnIX DBCC ڷM֬Y#))yQA pL4iժUGFFjiiM zYYY>|-oۡn"ѣGbb(LAE:u>k֬;y$ @zv{՘1cIgF` T4p@oG 8׈M(`h?+VN!6nXYYA:Z)000Ȑ"E|r111}%r<<<-Z mmu֭\t pjjj2x`Yhzȑk֬'0PKHHH>}о<Թs/nݺ533t0ٳgoN<1h ''''''A@0LA7/;;{iii/UUUڵk٤)h{h_~?}닋Igj }||ž?`0zahhhff`EEEA(p/^hddD: m999Ԝ>}t 1\bipppvvvvvvpp/_FDMDDڗ|ҲBBB~ߗ3!7^OOoÆ ۷_x~܎pҥ<… HF )%%%jjj^RVV&-[ֵkcǎ p?`B7( IDAT׮]#D$ 2Ѥ. eggG:PPP8v옃CEE,{-9sVTT`Dz}JJʔ)SH!f4hIk.]T6l?xyy͟?_\\trĉSNǓ<֪8={%$$:ujРAG6l,"ܹs:u"@~ ::lȐ!ߧqB"##%%%ѾD888thiIXL&[nJJJL&.^d)DÇՋtaÆ3gΐr!>>~ڴiK&Nk~ xŋIubbbgΜٹsgFF,8ݷ8 [^^vFF ,ؿӧOHcmm-[j4dۗ5䲲2{{{^Gj3tĉ֭+**":1bĽ{Z1b/%$''N0t̙3qGHad~xԩǏ?y˗/KJJJJJRRRǎ;}#GT,z|ުDDDܺuth[g0=z044477?~SpVyڵC ۳nݺ@g@DEE-_<%%thcMM > W8 %ܽ{5ZUvvv⪪vvv&-UWW_rLeNZjׯ_Ig6k_x1f--/_DDDhjj=:))IP555,--MLL~WAZڶ:u?Ƚѣo g6b0XduH]~ؘt"y̻wX,œ N|}֫W$Yev튋ҥ ,tC$,IIFKII: PEPPѾbܹ:::{!ڠ5k~~~666y{{+3AZYuʕ UUUʺ|rJJٳgRD| H]]===]NNth??{65k@=`&ЬDϞ={=Νۿ@$?)^^^^111@DzQgggfee|Z!}gϞIHH@%ߌ3оֶ_~'Z7|)CN>}ϟA޾}kffF:tHϞ=>dɒ YI(`իWgΜٹsgAlmm KsP 7w\)7N>}…hAq(`?߿OOO755%xCIIȑ#K.,0Yfuԉt9sڵth yH;q℗ӧOIP`0^;v, c=zpss[dIYY,?P`0>>>s ͞=xƍ\`0 Lcnnno !FBB·oߌI~pʕ+ IgCNOOhj͇Λ7OYY[n#G dN7o^k; kܸqsrr"E 0-----ܼHƏrY^I۷oߋ/|}}I#tuutRE9;;M͞5kVjjj.R#|ҥKSRRHA|M: 4@ݻwDD&,@ gϞ=qē'O$%%Ig~޽ѾPa[l!@E? >}:((͛ ϵzٳ}eccJ: U` x&,,LKK =z5k/^\[[K: EnMٶmٻw/ Gvtee*#4%''g.\8q",a x޽{:::h_hʥK욹 t XcZdjjz Ԑ@[kNAcZvҤI&&&w&$LA`ZOLLϟ !P"cX>| 9APUUMLLٳ', L=zGIHH@nݺ5tP/պui&A,*p3۹s炃HεvTUU߼yL: %6maaK: @a :ƍFBBg ,4 >>> , ے%Kq^\+Ol KOO#[UU٤IvI: ` h_8qq+W9sW80̟?t {{TYZyNSyyy?~"nnn?%0 tʕS}VZ5vX(`'ǎ;HV(`:KOOꕅ @CW^t,B3G~~~f'III)((h„ 1b8B#`:3𛎎MNN,BL[^7n @s+W1cFyy9,L[>>>÷n Iδ0Lm۶ 4P7cccA@THJJ^~=((㤳MO~~~c2QTTu떉ILB:皋<$엢p8AAAzzzy3ݻ7dYx6x葜5jԱcǦMI: a .]pB)@t͛7`PpϵPOAWVV+&&_~H۸qG¤Igh?LACk}?SCCcѢE555P n.]xb)L&ӳٙt*V)ϟ?[n0 FIIYoN: @{p\z !++|H: %˸P9sbbbHg Leee&&&4g„ Νf٤OG@}ӦM;q℥eRR,$,h: %Uf͚U^^niiE:(`:{n>}Ih VVVN81<< .,]t 033 WWW'@Є&\.,,x<,mP YKQB|}}---Ѿ VXQUUennq0Hh?'''1a„{ijj (`fI''' SS۷oz葷 jkkI1ε^t~ɢE"O ?O?%$$w?1c򒔔$DMA߸qΎ{]`` }"g(ZIIIKI塔wڒ uJ266~%8A)**r/޽{aa!h"iiiAȓXf͘1c޽K:@QeeebbbԞ={*##O ŹTPQQq9?p[zիW.]zQYچ|"WºtŋܹC:夥͚5k]v%hE䮄;qĚ5kH"55HYYY##qZ,bccsrrNJ:Eu̙37o655!eTk%Svvv?3 T0{ɓ':t7o_#Pij=xoQ\\|>jjj 'Oڢ}Z[nW^]l .Z EEPj\^^E: ILL\`!CN:%''G:%EmllhGGG6ɓ' :#Zmms΍;t!vu''e˖ڵKBBt&@EEE/@͜93>>>))ŋ0(`?7mD:Xu֙8pt"u(`ꊈ(((1c tpDq@߸qcNH>}ܹsgŊfff"DU6*8ywR>|z?;wАt(%r߿n:/͛?ԩS7o\VVF:0|2,,ɉt[hͮ͛7IB~OA/^XGGg۶m3{]vǎׯ8@!_sn `'Nd٣F1b+**H'CSˆ pZضm[tt'Otuu҉0SЉo޼ڵ+P'44~RTTx7+W=zӧOVZt2PZ8 KPo߾5jԓ'O uDGG:u* qرAPp8&L1cVEEt(h΂wwjgggAnݺ9;;'%%9s&11QGGgׯ_=D FիWcǎ&@|ի ,6lPLA wUUѣVZŏ{///JJJΟ?W@p//^ SQ>>>W^ӧϼyΝۧOҹD Xt hQMM}}}_;w~wޤs@p 6}e;w?7oTWW9sYH:@ wuuILLL×R]]qG^^~ƌӧO>|xNHG3@po޼9!!!$$ p8nʚ4ih4( .߿ɓ'ݻwk̼}vHHHhhΔ)S,-- }^A ϟa|UYYRPP`nnnnn>a\ﶃPūÝlffkjjWh{IJJN0̬gϞ @pgee3f޽ .I*vHII wރƌcff6~x555ф X:~sssMMM-[i&^vd&&&;w&PÝcaa1wܝ;w0FEEEEEEFF~AOOdĈ}%BPՑÝfaadɒ۷6<<**ɓ'Ϟ= 6W^v/^L:uӦM?#SFVVֳgbccccc={d2n``0d}}}---= XwCCCmmm;6o<~ "33ٳgϟ?OJJ+,,2d 3dz_,P8'Nطo߸q lvRRҋ/ 2dȐAiii 4NA TwiicBBB``:_PPFFFbb/RRR^~+&YWZZZZZZ222 XZ>}jgg7~GJII;Py7o޼y͛ݻs4-@ Tko{Ǐ&p8}>Ȩkii۷o߾}۷o޽IG?(`jpYFWWĉ,K`h&//ݻwu_TUUՕq>}ӧO޽{ x,P_~f>|~p0QRR^Wƙiii陙;wիW߾}Y,V=۫W/ {IDATSQNJJ:xݻw7n,))I$+))LOOc׹_~k={*)))++X,RE(oذe0GӧO_pWWW>}:..yڵ VYY_PP[x=֭[]mu֭{(攖:ɉ`>p?+W;wn.]xK^^^qqqAAAAAAQQQqqq][˗/ş>}ϗ,--E7566ҥKK-Zddd܎W+//ҪYpŋxFII Ifff[n4iRw{A&CN{nb100n ppA7GBBׯKvZQQѾD@5Bg~pqqٽ{waC=LA NxaNxof":iӼxyyY[[":;888::2 wwwOOτv{) {'w {>tʆĨ={,44TH "mi7oNxaNxaڧ ?^WؙG;ᅽ^;ŧ[(0(`P@  @ 0(`P =|p޼yݺu9rd@@D|xQQ tx///| `whuLAAtޣo֭['MTݻ{hh(T@oYShV'==аt_`Att,~>;nAHHI$%%s/KNN&ڍƿnuox;::3vvvxϞ=.\K> 9۷o?r М"EEE%ݻw/,,$ڇnuˏ?^VVŅt"駟̙3rHAʕ+%%%111#F?~|||<&7.,,t~w_\\{Iee~8uCM]X,6bdggL5@__dIzz: <V?urss544JKKy>YYYVVV?&$$p/a:::@׭5G:o}_~ >&˧R?z///fff@L6ˋ{5,..fXfff۷o8p oB D0(`P@  @ 0(`P@  @ 0(`P?۲e ͛7Ϟ=Tcr8*>}4t7n :`YZZlE:` ޽+jjjjjjVXq!/?` <ܿ͛ 577/.. "PА  ^xq1q w۷ogΜ=҉ #`OQQш#ܹ`0M@:` qrrZpa]2 [[['''h #`0  @ 0(`P?X 0(_IENDB`gsl-2.6/doc/images/rand-gumbel2.png0000644016036000116100000004535313373111455014102 00000000000000PNG  IHDRKbKGD IDATxy\tش(DH[vQXc˲b7Vu:I96WT!%)蠋R}KMfޟy==|^x|:á`I P@  @ 0(`P@  @ 0(`P@  "1qrrRSSׯippp\RGGo߾}occc{=[wBG+[uuussݻwxW6#F~5b " W}||O:c{̙FFFo޼a{Ș2e`}[WWwj##˗/wIY[ ._C7o|,!//݅f̘q= M6yzznVlw<##c| )_Y"48355 k39dȐ>+Vfeeq/y]YYaÆ>}:tKGG===ׯ_ߦ}i4Dk{}2nʪ[np8VRQQ߿5k>|кbFƎz˖-rrr>}[hsNׯYF]]3<^=ѶZ 555o Cӛ~aÆ >.1m,lٲeoۻ[]]=??eUUՀ7o$&&jiiEEEu%Õ+WLfGvUhK,x䉩C,Yr̙~uួƎ~ut4#mm6̝;yCCCyyyhh3:ztҖ0j/=CWVV>|YYYiis甔Z[|۟|:,gwoggÇ>KLLl]MIJJ[ZZ ~Ⅱ;wx'Whsss?iG^cw 8++KGG2O>3g#,YܚRlhhhs_H{isBݻw222555u.@0 ĚABBBhbbhQQEEEjjj-f0EEE?K-UTTdkkiee;Ehh(e_UU=3~<;mz5߿=r̙$iWF2337l222˗/xbˠlCCCc4hٳg_~]SSsΝ&av=ٳg陛ݻofgg8p5|``NLLLmmm^^?|rZN~<ўlCEEEllMԮ\2SL9w\aaacccqqmmm[200 W{V\\R,貲+++s_ S^1/k׮h;vYfٲeJJJrrr_|^ ==VQQo߾]mJ9-Z4d)))99#G[{>>>RRRCݽ{wz;z gGVSS2e{iVFEE9::lݺp]]>}x]z!<m8$$ǎg>[땕$_I@XUU05:rٳxI66$P@  @ 0(`P@ \PP`0 caaaGK#---ȴBd2l6f3L++v|k u<`//T֑E]uuuu/\`llό=G#P{uuuu/PE 8++А{d̘1=ʺ֭O.ASҵRRR# ߿f͚SIII>g`))iiNW\lپ}]vOdeeUIuEY,zHIIQqq1^~eeO:NƿF5`L{?c޼yؾ@󳷷Jcc1 E ->>~޽ 6\rE__ӣd*h+**FFF&''kjjjjjDDDX~/ 6j&a@  P@!F`899488X0mzw{kt} u?z*88ԩSt ggʼnEo @ݼy[Y,C^^cк{}ɯJ {LMM fff2Çt:nŊ򶶶YYYK޽{DVVvذaOh+>SXX/_lݻ_2 DӺu뼽 \]]]>|occceeӖ?~XѾEEEj_vSN|[˱<7x|"QnݺǏ766Y6nEHHHWfxחQg/<^2|XBB=~]: ڱHnF^vFر555˖-SRR/X,鶶}sNGXeeeˣ.//_pr.]Z]]݃_><~z/ӷ(zw1Q__:(s\~o[V)heUUU...+0gΜ9sKCp:rٳ C10@6$P@  @ 0(`P@  @ 0(`[ `8::X@VVvԨQ/^XNhXZZ2L6fLU]]]G˯^b]v۷_%ȴEp83+55߿udѢE&&&k׮xᨨ(OO:NƿFphh KHHH }@rpVV!Ș1c=z߯177STTHLhWVV*++sTTTpIIɊ+,Yf>}`/266V IzBt^|%Koh;w" c=VRRjs[^^昸ٳ:݊;=+(Z#,K__{wwwN{zl]G󳷷ows?#ׯ_766c>OC7VWWZF;v733S^^e7f{jŊ3gΤhׯ_ߴi˗-,,zuZ###555555SRR"""Z۷ YY+WܺukC ?/^GB쎀D 0(`P@  @ 0(`P@  @ 0(`P@ I:1+++;;;//O> CUUuРAZZZÇ:t(pHg:E;wjii(+++**655}˗O>}q]]㭭---ǍקOүDM0_;vj޼y3f̘z Pooo6yoVFFq#`V!!!&&&ӦMKHHSh4 /2*** <<\[[ȑ#߿>ځ#^p~'K. rvسg$,BWW׼k׮ɐqZ[[,P(OT__?o<))}Lp۷x{{ ׀Ahڪ\rlh4:C I&ڵݻwd#@CozܹsϞ=+)IJIImڴ)##ѣGcƌ ۃS=W_' )S믤.N)h;w|չs(۾4m̙<0`QΝ;G:/G=?&&&%K,?I#GGG`0 y,LrF\n]HH/F322JNN600;vM:pMM%dl6dZYYX ,*TVV:88=t ڶmKUUD F(Z'O455~GSNX| =djjޯ_cĐ₢=B*t̙3O<ٿ? DNNĉ|Ν;J -ବ,CCC1c^;pܑ'NXYYBF\\իmۆ[;j:}ض/F333KJJ~y󪫫I!z޽{C:aVSS311}w6PUqƏO:y'Nضm>z;ہk{vXXرcIgs.[lΝ$ p ;}Ѿm0[n9880t :p;vBE8p rssIΝ;wnȑ}O!--} 6L2!.v׀5779?477'͛nݺ͛7׀k׮ .]Z`A]]8@i(`Ç7mD:2dȽ{̞?N:P xIHH(..vtt$D_K.8qbTT8@Q(`ѣk֬ӧ gڵ ,8s ,@EmLj+==|%%%YՓ'OfΜy!IIIq0 8}S&&&>~xƌ}MMMիIz~   uրL& @BBv #( ?/_N:Hqvvvʕ+ۇIF$ѣGlYD˗/͛7tP___yyyq;|/?hhhDGG+((LBZ>t q7dȐX))I&={t0O>"hgΜYxI"##I@ÿ._,Z? z uNŽ{7nq7t_pg&N>}mUVV~7>|pႪ*8\2w\/5)))''' 4?S^>}mggwiqݹ֮Sl6ĤGԗkoooccsa̘> ={6W( >G)w?~>qҤIO>%xhwKHHHVVۻ;=IA}>|8 ЛΟ?lٲI&l#uuu:RRRbddT\\:::#垞_$&&:99}7?3nZ cb7 33{b뷻p~~aŠձlτڒN2a„ӧmQG]AAdN>[VDjxxiӌݻG:?-`77{VVVVVVzxx$$$.Ot-sssKIHHڵ_}ՁW)uP###555555SRR"""I8,Vf̘t3g~t(; ,|s΀ .L8t vTTTоFRRr߾}ܹs}||Hw(`qt֭/t c?{+++I_(`qt֭3fNĴ0kСcǎ%@LΞkC )))۷/,@XxxҥK7o޼a]ĮWTT=zQKKK^^^^^^KKѣ< T5a/h4[[ۤ+Wۗ ^:,/^ <8 `ڴiaaaaaaϟ?>,&&fȑFFFicc7n|Y}}=? ڧ~ѣGrΝKٳO>P]dɱcx\WWzg#A"\&&&Ÿ{… ?|?x`q(5gn_&'''z+ڢMvݸqrܸq!!!8 IDFFZZZN%!!cǎk׮mڴťt"yϟ?`ee7|ßHG-GSq%&& :/`--1cܾ}{ܸq /// >t 㯿_̙gϞ&҉DM-4'33ĉ#G@>"Duɓ'ݻ惖x+..vvvnjj:t(8FMfii9zhn_eaaA:AݺufΝ#@ttcNׯ* h\غu۷:7TUUN T&Lʊ5kV~~>Az ƌ6vػw :/[ۻ9sF]]ȑ#_|k.ނdee9r lٲ vvv#ɹ ,::Wfee1TqhND7 <8!!ASStϟ߰aÚ5k~IIIq,hv999rrrh_] .LKK4iRvv68B^ti]].]ۑa3FxxeͽI' ܹo666pAo177'DN_bEBBBpp9ftQ;a„Yf?~<'':;;رcSL={)~؄ݻwNJ:?<**i8N-z* ***==իW4mL&믿VQQTNIXO<>}I%KhӧO꒎"4E ԩS믿HqpNfACL2t #t:}剉o633"Tyyy...݅׮]kddtƍnٲ_~ٵk3S AY[[gffݻݻw26JMMoYhڵkz~~+++{uURR2jԨW^u]dTM6~xqQ SSS̙lٲ/_N -`;;;??????{{.?b> CBBb 044ܾ}7oH[||޽{++++++=<bkȐ!Oqㆁ+Wz2ydSN]reo'o(`f6wm۶o۷oHg8k]]۷~t(_(`mȐ!gjjjUUՈ#~'ܻ@tcRSS_x1|TWW,:jkk?222--M[[{o߾% D Xt>~```TTTVV{EEP P [Fyܹ|RWWwƍEEECA7o9tѡ}IpF/??t((`6v>} j444<==srr'NbHQ8 ?jjj?g&L`kk;{츸8ҡ@EDJJ1"N^^~Æ fZx)SBBBI$ğYYY#Fxb]]hpMM%dl6dZYYu=dnnիbwwSN 83NO<̙3?{… _@:ZRSS[G-Zdbbvڏ޼ytzY,C^^^.7lؠuVA^~}ҥ9s899YXXӇt. vCCC]\\G\\\BBB]СCKtttxiii8PUU]z{F?2dݺu ?a=SWWgX#%%%FFFŝ{ս{x?p8JJJ***yI`` 띜cǒEQbw',iiZ))֑F^bҤI'O2eJN͵'źxb``W_}5g4qbw gJKKΝ{.;=!H+ƌᑟ麺yܹ3##t4GC~Y~W++O:7nܨeA@Ԥ\|իgΜ9355#>#`LEEE޾BG'Ǐ?p@^^^PPpuuڸqc\\nuٻ(z陖mH֭xᲲ2kkϜ9WN#f%%%| !Ç^TZZjoo?g+++iiiҹD&aUWWZF;v733S^^e=d2l_)^_~enn. ^>}5s9s(((_bW4}DDFl}{{q/s΅b$$$$((&&&gϞ;wСCI q,`(^ׯ:tƍIqW[[:d[[9sҤ-@Q'OannN:_\YYicc3{l}PEn/^0 Y𠠠dsss[[[[[aÆC(`r?|p٤t7nPVV5k̙3'O}CC  ٳΝ#8NjjjXXXxxǏ-,,lmmgΜA:ZPE^fIׯ_ߺu+,,͛/M&''G:ZPE8qC&OL:'ijjJKKqFZZh X([>|PRR*..wXy۷o޼U__okkkmmmii9`PE\pÇI7nܾ};&&fСӧO}:&&毿"RSS[QX,SSSKKK qIJJ , X([V9rڵkIo޽{722222fO2wB e ̌tb^~Y]]=m4KKK+++mmm~l,P,~$+((033377MXϏlnn0334iD,P,SNݻw3:_VV6eKKK333##NB 5 3z,::::::66Ǐ777011[PE ,OTUUuwFEEeee;vҤI-g],P,`]qqq߿I&O`A-}ɚ)))1SԙK3C6I:4lذm5{&::zڴiSQXݽ{ܜt /^&5` xMMMR][999222h_h(`j`1k x xqqqZZZDmXΖF0DDDX[[N( )@p D777gddhhhx\}jjjh_1HKKK)@@PTqm_| 7 )hQ)))+(`]fooO: +W̛7t (0ayyyeee'N$ LիW$$/OիWIAې!!lcc㢢"IIIl oCMϟ7o@ I \p!@ I&9Et: @&aC޿?lذ#FuC)0 K\xq̘1h_&_v-@ J[[[A0^~=n? p AKNNȸx" @m۶m;w!HB ԭ[ /^L:߯]_͟7hv}gϞ3F(((pttd0 ѱt|}}IJd2l6f3L++:ҹٳ ?^]]tQ8啚:h"jwO8<~x֬Y[nuss)h^BCC]\\G\\\BBBH6mڴ;w}(L2443f̣GHh'..?tҔ)S SҵRRR# ߿vÇJKKKKK*++lvJJݻwVZ%--ݳ@?#G;]q׮]|٧ BT^pb' t TqP&ab``=bI(=<ՆVhǎ̔qP K@8͋bdddrrfJJJDDD@U;W'qP K@*qww iӦ %|× UW5`  @ 0(`P@  @ ? `8::N$ʺXN1zc? @6~&&&IMM_~ _555L&fl&ieeUWWG:h* G:X`z*88ԩS|ҿRSS[G-ZdbbvZDUw6>vAWD`6o|s ,!//w#p#ڰ:}_GG%Q2443f̣GHm=4h… srr@DxxQziQTVVQQQ Guwo_|:99<##1?DTTT޽̸/iiZ))֑FL%>qo?~<$$ƍ| 48 V6~rww'𿔔9J{!66 ~˗_|O?ď[dffrX,}}}RyD'mgEEEVVV| _vvv~~~#~~~Oۗ.]233C.a)++ٿ%7}VKKã_~֮!K4u3---/_\\\SUUT ~?R{?{+ϳg̙8gΜϟN$xm;sUQQpvvx^1)~]*++{w+@  @ 0(`P@  @ 0(`P@  @ uV-[̛7TFp83U;644tر4-==Ɔb jp QQQ9v옛[SSSSSۯ@[K.5jÉ~:8  mZYYy&22RWWtф֮]kaa9rtфkܹs'??ܹw!@4SYYill|Mmmm#;;T%%%D ?W^paKh4}} ^l*#`p @ 0(`P?;NRIENDB`gsl-2.6/doc/images/rand-hypergeometric.png0000644016036000116100000003164313373111455015570 00000000000000PNG  IHDRKbKGD IDATx{\uD.bR=A5Z^&[ѲMj(ef̘O---w_:~즲^|:-ZF>/~c`2(`x.lii>|7|cY姟~8p`mmy_~z˗/7oy떛rssx~W^mfٯ+byYwӧ_z3gZeWtȑ@ÇqduϟϛY777f 6u ?}..^x}?=L0U3`ɔf׬_-&ӧO6Q;M Çx9=={z̙3v-TVVZ###-tҥ#*ʙ6 bÆ ޔ= W\ Y&!!a…ϟwf;:~]]>6;mhh /wr/^zEt[nef뵚kfJݧOˊ---6{5K [ׯիWWzj~,jookG!x/,۷ΞѣG,sӧ~͵W:~:n͙hkkl]#NB5hР3g "//oС [/\` lYR]p nqG#t:jg:uw泼ͽ{mGgϞyǎwyD*>}短o=w3|:. zKnܸ5;;{ɒ%7s'M^we=}vVG>#ZًKK:uۍ f%%%k֬oViՋ-ڿjW*>}z_|a}͛-?;ؗOPpx^m?3<<ڵk̞=ooofذaO?d48&3<<|Æ ׯ3geI[;rHHHۺ?448yڙٳ=ˠ,s]z/,ׯ744>|gz袢+W>}OӢE,:ؗOGg9/>HP2Fq!!!ii'O6mZppp'Mt=yɓhѢ:{f2߿9G:|||j3xܹ9s <;عs{mCo&LȰ9ʲكj40ѣG矻˧/;;;**o^|˥Akknn =}-ҧ~Ϟ:u} s^jO~С˗/O,XOud0z/Ri>>T*W^_3fɒ%sΕp< @ (`@ (`@ (`@peeFQT*JTUUu??L KdZF1))IVz^V.l ++׿ugy2>ବ'Nl۶22w܄.mooڱcG||;3}2kZV̺{ }r&.++-//wf5k,]=LA]r2t5+~>ٳg܀g0ɁoKKHKK_+.XW_ur//߿luƜ pxxxiiixxefر駟n>44FTa05L))))--v֛o_ NIIt#:.55*7n+Gi/\xʕ`0dff=z4--ͲRYe]Βppppaac"#####?^PP`k2x 6f$, 0P@T_}ՓO>9pKtI͚5k HLLuF*++5JRTJ쎘?:rH??ɓ'ީxy 2ȑ#7+Jmĉ/^ͭx݈hLJJRz^׫䦦&g3ǎ'o[bEgՇc|>xu>s3g<}:qĶm,ϝ;7!!!==-KxϜ93n8 d!uJe[[ۊ+Fѯ_[ouݺuCVZe==zt7;H~~V^^9\auT6|}}}||np# @|444lڴ)++kΝeСÆ 3gNEE;߿̘17f#eeeqqq Ɩw|_t.ŋ^M_sxX9P(/Ⱦ}ƏowIμ577WUUeee 2ɓƫۊF{l2eם٩r_#4vP(3gX444]RnذwfI's=7F$/`WDDD,_˅ŞK/un8N&k>}l;zJ;[[[;j((I_Hm$<<4<<2RSS3vjgKnii9{lffAN8̖';vۻF._(((1cFXXX߾}>o޼ ˭݋g7`p)^9wӃO?8~QQQp̙Glذaѣ.m㸯8NP(lAã 'a@Oۼyo[)ɣL` 0c W@ (`@ (`@ (`@ (`@\YYhT*Jh4UUUnooΎ3fΝ;{,' 6IIIjZzZO>diiG}t[nݺ'*d'Nl۶22w܄ c둽{ǻ17FxmllKKK[xBذaÖ-[JJJ X0իɏ?>~ĉNrLIov]r2t5gV߸qc^^'|x˗۽I =`pxxxiiixxefرά^[[;j(ؽsםSRRb=RZZ7` {,ǧ [2-Ng=RSS\}׮]w}wv=bEO%^paqqʕ+ `xY>}755,w ^;D ^;ND3`Jqx% XWD'aW.((ʕ+S$F+QrGW+Qr ,w\,ẁ+QrGWDgAWRL&dG.:BT!$5|gFRT*FSUUZ555QQQJzL>}L2@dZF1))IVz^Ve2}ї_~gB6>>>mmmSѱVkYYY'Nضmedܹ ZzSt: 1!h߿`zN;jGZm^^UN:iӦ׻9Z $$.++-//lfVe˖`(`L `0Z544t_׉{ۗȴ]WVVϻbFFẁ@B2-n}}͜{^222~ަ iĔXFGG]̙3#F2 it:NjwaSX沒@B2- \`0 ̣GY`v|||_.:x ppppaac"#####?^PP(:W $WtN1bϞ=2݁ t @B0E(`8 Qp uqVCC ꫺:B1dZ#tvi*x%f Ngϟ_paDDDNNν޻o߾}M8ߏHKK;|Oƅ@0HpTTȑ#sssNj=?QQQ (`P3Yf?~ܦ}M6frO0 tvr@@3;p)JPgAvdzYc 꺀322lw޽fDLQ VÇ/]t ١@B]]wݵn:FsBQQQ޽;:: #0HȩoCJII֮]CwyAn(`_G裏ƮZ*%%ŭ O0Hȅ~g~}p+ MJe+ 3`PL , $i?cMMMWnjjzǤ@B;8~i||; õ@Bw}7~|pĉ7nhlllllo7l0a„z(11ɸ0HHd/ 꺀? ۷ouz 꺀)W1 q%,8 Qp , $DY0HH\YYhT*Jh4UUU-yѴ#GEDDL<?ɨ iƤ$ZzZNNNnjjpzzرc?7*..~>,:^w%,3` gQ ! ΢@B0E(`8KQ(`80H(` gQ ! ΢@B0E(`8 QpV߾})`  g1 Qp , $DY0H4H(`8ǧ]t 0\T*` pB\ B̀@*0\@T(`Pp R.Rf  .@*0\@T(`Pp R B\ B̀@*0\@T(`ȷ+++5JRT%f͚5x$&&d^ȴFcRRZz^V'''755]xĉ/^ͭx{8p/@*2-M6%&&.[,$$$$$dٲe 3#6'R=7@*2B1bĞ={:T)N1\"00H (`  P  .@*0\@T(`PpׂPp3`  P  .@*0\@T(`Pp_Rf  .@*0\@T(`Pp R Rf  .@*0\@T(`PpPp3`  P  .@*0\@T(`Pp R Rf  .@*0\@T(`PpׂPp3`  P peeFQT*JTUU9Xz'T*{,a/DTdZF1))IVz^V:[~޼yC 9rHO(`d2`GVV։'mf;wnBBBzzJ $JgϞ2eʙ3gDF 8??_Zhڼ\XXxرǏXڷ#8}T 3mmmm`;6 o. }immGpK0\.:BP555)88h4NG#Q< Dt0< QHAAAS@QH̀x: x: 0OG#Q< Hh0<t0<x: (`x$.QH̀x: x: 0OG#Q< IX}Dn8G8 G(`Dhb QTQT̀x4 (`x*N(`x+WNDSqG(`=`b QT\Gh4*JRi4*щv̀x4o(`јVz^W|Uףx4o(M6%&&.[,$$$$$dٲe o\p/ Gj#Z6//OT ΂ѼGbccEA ljjR@FFQL&nߕ+W|}}-#AAA׮]JoxX7}˗/{R0^zᥥᖑcVWWwo#M=aa<"T!G))))--.yCt:N**]^paqqʕ+ `|ʕ+_~e\\ܦMD_n]EEŵk;xE1koorrr>YX{N>}ڵǏO6Mt5{lQ{ꩧƏ_|ҥK}ٸqz)!a8y溺wy;zjpB'dk2MW3gȜ9s֮]+*WgyϒQF cyL,U, SRRDŗ_~)*@ppsGΝ;,$=ܳewyg=^پ&L&AK,??_ZhڼӭI&Lغu͛uݑk%''[>\SSs=jkksrr"""/_.$@nn _>Odڰa/d׾Y{`W_}Ul?Ϸr˞={ٳ[nyׅ)((4h֭[/^x-[| W2dHMMHuuСCE屐k8 :›oYȮG?X2 C^xz. @H/׋1bĈZI&޹s0wdl$,ĔXFGG#+.\6mիEg5nܸ:!>s̈#l>w+=VߓbbbDځ7|WUhh?qGƍ?3qBty睢Xk2,Ng=RSSE呏SkIIIQ\\| uǿ-Bصkw-d3f㏭G+cBںqF_r-'N/ofQyllذa…S(2Mv/p#GfffZ>=j((:cǎݾ} w_nnnmmmKK7o<|?Xt%JJJ[ZZΞ=9hР'N |]wټ(쁜)S `G {7tӺuDy꫖3g,Z'l_MΝ>}zpppppman $Laa̙3;l0FsQ!IX3f0?2Ç7o^EE0&… s ׯߝw)ݻWl]v%&&8pǏ߹s0;v숎׬Y֓{wB'dkJ<sЫ0P@  0P@  0P@  0P@  0T*EGz (`8R\\iӦ???D C@  0P@ N[CIENDB`gsl-2.6/doc/images/rand-landau.png0000644016036000116100000004135613373111455014010 00000000000000PNG  IHDRKbKGD IDATxg\gs4RDEQAH@X%Q\h,I4b6QDFbĶ&cA4 ,""E>q8}z13QT*W G0P@  0P@  0P@  0P@  0P@  0P}JRKRjղѣǢEݻ'ѠR@zJRTܘ:''}9+QT*mTR@oӧ% :wDG[T߿֭[nΜ9WrRYTTdɒ͛תUe˖7n,7n߿IN[>ᕶfΜf͚r3gGGGccc33zȑ#7(ݛ][yyy}U{sss'O\~}GEEUt *ÇLLLLLL=Zv ?0 .]k.%%ԩSIII-*Ѵi򂂂233ov޽%?JHHׯ_BB7Zl9q* 6̙3o+,, NLL1cƆ  E+|йs縸 7X'NئM7n$$$/ J\xqӧOsNbb~ʕT¨TWA-Z(ezQOOϒ;vŋ/x@V[/ZgddT6uήz Ś5k^t3BQ-Z߿*w±JgС6m* 6 >f<(0P}p^^ޢEZjeddTn͚5K+!!333-,,JʪOK|UOO>566.w;N4޽{UYBHLL|͞7]mll޽[GIII/.h@ͻp?R򊊊Jڼy7*Z[[iVr_5;wʍP(ٓкu &* դIJ~xэx6lXvUjjj?+yQMtRӦMKY0g/۷~>>%_]d,Ç]믿zxxR0@f0 ǩVsN/ܸq ֯_֭v̙ӧO?w\nnnBB>|ኊBBBfϞ[omٲunӽ{~޽{k֬޽{ɏ;VnĔ޻ 6lڴdKB%c͞=?/͛WTAڬԣGƌS^=ss &(^<>}׫WoҤIO>jU*Ն  5khѢK6hР[n .,7ͪwO:giiYvms%?:~c͚5x œ'O{= cc}FDDe%w<ءC#####:e]@  0P@  0P@  0P@  0hn߽{/99E<{Q4h`ffu!9sP ZO<ݻGRRRRRwnnn7ѣGFFơCRRR6lذp­[WTT3TozO?Tdر;v>}7={ʕ+Je?#""/SV^n>|xܸqe7.007P(*_ &ruu-m۶UǏH ]ІO>500(]ٳ:uW;wu&qF^J#]RPP`hhXov=88|>&kזYhj6hUDDUTwwzjoo]Ї 3AC;;;]ѦM_f/2ݵkW%v"e\*++ܼzCSXQz7 F  0P@  0P@  0P@  0P@  0P@  0P@  oС{%''7iҤ>>>&&&lCT={nzǎ999...'Onٲƍ7nSh_ޯ_+W+,))iԩ/P3! $]# z!::z[l7n\%P(lmm;Gy{{_vM z` X$$$scƌo9rd„ {ݻth8vAˊ%}{4f̘]vWl4,+ XL>> FFF:c Kis۶m> $""7B;|+W,((@5Q p;;;ڵKtDCܸqEt `˗:(`hmۊN5vڬYYtt 0 Zb33΢5L0  4}_I޽~A2 Xճ`ŋPpׯN:)nܸ,:Vϗ,Y@PlWR +`o-h#G̟??<7޳g Fbɒ% .ЀV ڵ H}+,h=z!++Kt]2v؛7ofACqB5ҥӶmD0Xdɒ%K20ċը]v;vDP  Z+V(`MK^6m$:bo-774At͛7ugff&: ńܴ͂iߦM233}gjj| *wޤIzyєGc'Nwq{(`,Z~HMM@^emdddggf͚~UxǏ'mvAiĉ;v|EM|IAA D]УF }Q*5JX| XR߳gOBB cSlFR'%%΢/^Kt@+q*J覤$SSSWRf xy1"==¬wyGH#\IuY`E?^^vvvm۶駟Jڵ2S1y丸 A xʕǏo}}}OdɒG.YDdw355555KNN׮]6mR4ԋ@`ҥg...1`ww˗/ٳwoӧ[n-i'O#)))));77EoذaHHvlfĈ{y7U*fffחa+Z`A?,XuӧWx(#A튊nݺ%s(jժ1cժUKtU 􌊊:yS( >5t ŋEP޻we?4pBeED-Z{nIPz&, rۻ=*M.\zGDGGiFt ӠAO?tܹ9sfddɓ'E xϞ=:t9{$Z].ٵk B$$$X[[ .]駟r^@[<==أG-[l޼[n HҤI.\_geeeee-]ŋ'N,Gj9rHzU222N:P(6lXr^ѣG??9Kܹ3s̒dk׮o>T}\\P_uNNβeD_׮]133\5MS XcǎӧOӭ@f^WX!:0t 5evqMA}T7nqn߾-u2[n9996l8o޼>Ht@###vxܹǏ;ws\ՖؠA:uSRR=*:w^k_~,7u?~\lp XjGټycDBP8q⣏>*ID>wȑ#-5jٳg}e4J߾}WZ%:_^^/Ha/bbb FYnڵkE x+p\ IDAT޽~~~Dc 1c'|":G^kӧ~֭}]kk޽;&&f֭zAKJR%''sRPPжm5k 0@t@<GUNcuEK*))k׮ɢ~>],9 q>T5V>}ڶm|rA 7@k7nٲo2!75Yƍ.\{qB@j0h 7yd~At@1ۨL’EBBBzD ݼy[n׮]kڴ,`\ :kצ}5\VMEIQg}wAECV044ܶmӳDgt YPs~ n!+O>ᅨ KZdƍSL50䓖T*6l(:^Atg $ZjÆ JNNn0dhѮ]>`ҤI^ K>׋h1fUIXRhҤŋ5k&:^^^,>yiӦ@mZhz1cpz(`ȡJRt; 6o|ĉ@ACC| XW޽{w20@0//ٳg1@t@Pf͚emm`AmBCrُ? H:LTn߾0$զM@6 )S$&&h cφ 7!9 XL>0$G-[DGGw  ^122ڷo_.]ܼD4[VVVӧO9 ^qppضmۈ#0$`Tݲe:u4xOȄ$"""ڶm+:RܸqK~!(vAU)͛7 6,//Ot@ZL_Snnn xs?>%%%00C8fACDEEjՊEԬYsΝ{8T(`jԨuVwwwooLqIPP?NBקT*׭[ץK>}ddd ;HP Rv#FtݻjQ:_dd$ u;wn:u:w|qm@PPƍСC;vPvAC͘) :~,zPPp?C w%: 삆]~gϞS@7yyy:ujߟ?8ka jvu777)BBB80qgϞT\233VZ@=}tر999򋹹8eƍ/fbbrmv9!!At:(`!5jYfƌ]v=u8+NaaaS@Lw}wիcKKKq}8%4]XX@666Njժ'̂F200oo>nܸ3fph  ,h8ooﰰwv)&&Ft\vCt 2?x)Szf͚bщטmT&a͛geeըtǏW(;vhѢ8hL‚F }-N:5d//׳) !Ą\tSt ԨQc֬Y/^ ڵ+G!? jھ}{)W֢EccAPP˗/ -T*Mvx'NN}l 0 ܻw}ѣ}ի7n,:4._ܱcG)58p`TTT-\]]׭[WTT$:tuʕ:Nђ%KΝ;w۟?^t", -`VZ͛7o̘1NrrDA0^KqqիW 4jԨ 9,Z(77Wt" ͛ 4*oU .z͛7q `}mٲ388Xt" ʕ+ ={)S&:re?Jȑ# ;ʼnmE Ede``0u[nvuҤILF5Pׯ;::`bb2o޼7o6j}ԩIIICAPwIt @$ss*66¢]v&M}P0ݺu~_[7n5nܸhѡ(`TJիxxgggooÇCAsQ:u4mTt@Ν;>>>ݺu xj:wM6͛3f[nwq2KE(`j֬o_ti֭'N/RRRDFQMΝڵv֭ϟ?*:Qwkժ 6qttܸq۷F٩Sݻw1(`TGR>fff|I\\ܼyvټy a=D:j֬9dȐ~WN|||PT*4R...;wl׮ (((8t֭[_N4Yt((R6MS r=jѢEfff͚5Egt͝;wo߾cǎ&M?~C5]xe%})4o|w/O:egg;;vPt4W7լY{}vݗ.]ڴiӏ?ʕ+AmZvAW]vׯҥ IHH駟~QF=7J/p XVp%RRR\\\x Y}gϞ}1bĈ...C2 XVp%vqĉ={+W߿Ç>|xvQ+1rȁoz>ydСÆ ޽;$Յ"VVVQQQ5@y}__ADt.Fˊ~s͜9.99ÿŋ;w<`hBt.Dˊ~>f͚_} $''ĉǏ?v옹yIwPt4Aˊ~77͛7wYtFR]vGիW߾}fKQ+mۦ1j>~ۻW^zjذh\m۶s̙3g.]doo_RƝ;wO XV󂂂>/@VϞ= ={ٳgCBB5jԹsΝ;{yynZfP7i$''O>DtGEE?ŋ.]JIIi߾耒eESPP`mm}M@Sdee4q ss2رAˊ.ȑ#+W<{ 4JuViGGG;88k׮Cڵsuu]Dˊ.gر;w6m CAAAddիW^۲eK2Dg* XVpYM4y~aaaׯ_~zDDD /Dˊ.k[n=q tDqqq||2۶mo:;;k&2,+ ,???__ &@gEFF޸q#***"""::ٹUVmڴqrr\666wSJJLLqFLLLllltt͛7kժպuk'''''Q*ReEڵkׁERRRbcco޼YuU(Rޓ'O9r P^NNNlllLLLLLL|||\\\\\i˖-ZhagggggנAjBˊ.1`DYJݻxcJnѢE&Mr*M XVp^KfffqBB۷K9##Yfvvv͚5+]fxߥeE+֭[YZZꗟ|ݤ;wZ[[~W5/ w}7rHUV˖-[lYngJ899Ν;`Slٝp"SNܹSt 0 "55u7o622(((9rI(: =mT9}5iҤ_~ETEF`[zիWϟ?O(`RVXyEG߽{/99Yt"M?a„}?Ft;PO<ݻGRRRRRwnn\ݻݻwYHH BB^^^ ,X`Aǎn*:&ʚ;wO?ė@](Ç7qʣܹtVZsa \]].i۶mtt<ѣGϟ?x`rrСCϝ;תU+ѹ:=`CCçO.yY:uBMpvvvNNΓ'O>}P(ssssss}H1n6nѣ'N}jHPO>|?QT*U6m7nHp/Y$33333sɒ%O>U@ދR<)JI)!χɓ'NڿUT~ᆱu~ᇞgΜyqvvӧ۷owJT^۷o۶SN믹wD pd.իW6n||W駟3<<^%õf͚1cƔ]2f̘u֩}R>?)%$z-#Û188WQWTTԢE˗/wuMLL,$11nݺERu}ǎel۶mӦMjg_O rpXXǏe7))RQ>}jhh(R<\z:qD%'Nݻ*%M'1y22֮];c >=zsrrrrrrΞ=;rȏ>HUdtdxI>{l^^^rr~۰að0)2eŋK)Q뭷 %ģGZjuYIG200((((@ҭFރR?)d{!PV-KK˲2---ϝ;Qʉh֬ٳgԾC} :u֭Ν;.پ}zߤϿ$d_n}Uj:ԭ[SRX[[/ZHQRSSw,%(ઓI5&[ٳzG)[lk^bK)P)*DOJU5<)2Ur5jLcccRVFFFz=z$ʛ7o~ԩKN:egg'XOիQ.]ݫށ]Iɠǀ=/%$$4o޼ _U;۷OOO Y5_(rvv/$""M6.?)UxT@gggro]^=)V~ۗ]Ҿ}K1V=b߾}]tQjkt*… NNNj_mzzz~/_޻wo\6v*d׮]5zR$zz(6lرc.9rH;JgϞmٲEW%lll^Zv˗5k&pem޼yҤI!'C6H޽ߟRPPpK֯_ի2 -ѧOCܻwoM49vrwwվJHp=~nҥ_*%{P'E$zܹscx뭷$ZJڰaB"IDATUr iӦ7nb^v !!ߟ2ezJO 'O67hҤllM-WIENDB`gsl-2.6/doc/images/rand-laplace.png0000644016036000116100000005370313373111455014144 00000000000000PNG  IHDRKbKGD IDATxw@w?D2! jѢ2Wժ~m8VT,E+DY 2d˓bܑ_soB}r2 #0P@ @0P@ @0P@ @0P@ @0P@ @0pCRŘ]iРA&MڵkWII°7(XFFLJD}N:UW{^:˖- `0}ZXXܸqGwsΑ#Gzظ/q}~m˻Ç߻woڴi^'jC=һo}{NEE_p +((5551SԆoFUUUNNŅNh RXXtR A]vǏmmme6779ŠGmmԩS/ NKR 6s[tqqSUU]vmCC \^ 7䝻֭[ٗ-XK/?;.v??= Wkkk߼y_o۶ŋ;VZZZZZz1uujBMM]v755͛7˗/UUUkjjuttbbbz>++KWW: ZZZ>~<:j x9nC***W^/_sjW޾}ׯ=z4rȐܹsOB9rHW祀͛ש5X%)O?hxxرc9~G#FPN`}iiiy%֒%K\px Lر(W ?0kk붶6++˗/ogݗ ]tmmm[.ظk׮QF0aIHHb0jhht^_]]]*++UJJJxByxڶFQTTPaaVW;TVV|_ CFFӧOJYYǏ #==Ԕ`3|Q]]x g?de=}C2G˖-;|Cf͚i[.?ȸ|w7}0pwӧx񢮮`466Hcc# 4&9))NG* Qx:iyIKK=zٲewj xYy)A555?4h j]m `0<<<;`0|}}:`0<`0;~zu: d=}nϕ>߅}qo%,&(`@7\~7ijjd=am!  w^r%u~w˗w5NG\WUUuzwGEEES\"u)hmllڪ[QRRnbbKp¹ry%xÆ o>s̆ :mۣ#`d\^D}̂^jllf}yG;}9eG1cŋ9144)4رceθ^zuDDk޵tKKK700gsٗ{ؗYZZ(ELL +O<~266ԤP(_|񅮮1c2uN+WXJaOEFF͟?ʕiiirYG9좢,,,zwR YdGii:|ck%K8qĉ_4&X߼yϚqŊn'aUVV>{ljjj7o| &\|tFwikkzzzO<ݶmիYrWll2sJ^KN&NIcg*z%֒/Rϳp9.O8+ׯYǗ,Yz+<>KL/tNee%k[.?ȸ|w7}4.O  GǏ=<ח/wږܹccc######ccc9FꤢBJJqbZ֒Z zո'=F6mʪUJao|ѢE;v`_~Xhk[?Ⱥo%,k4|$R[ +V$&&&%%&B/Kή^WV=/f =%z/uW^}Dg}2J}W6$ (` (` (` (` @ruu5) h~J  (` (`xźuLRҿKt~7=薘Ľ޾}~z??&/07nUiiiLLLaa]N$BOysUUUyyy/O)h諦ݻw=ZVVJep]S YfӦM/_ܿ\SSL݉ɯJ}1(Ѝ72??ў>BFiii֗.\`+d .\\\6mTVVÇÇHE@@B1665jTVVV#`f6u7X\B)1Y\#(`܊ۮHZuuuNNN \6M[=rOOO[[ۍ7r\1 nֽ{ٗx{{HZt:̌}iVVM &))KGO87nUiiiLLLaaaWgyabb¯l↤<{젠 %AAA|p^pg̘}3g A@gG(`Q@PG/4AZaEV@gcƌP(ZZZDQQQa9J1|#`ڊ  k4220`  ,--M @婨(++w&. @hn?3 x/`[;:: @/3/H h4ZAb<,~Aj<,~A4SSS*/(`֣0X} 4ΧO*** @LST)> P⫵իW= g eee{&B @|3&B @|tɫWZZZ @|W XZZZGG';;[ @L1 ŋ| VPb͛7Æ ŶVVV)))| VPb*%%ʪwۢ Rmmm V[EEEnnnnnnżlUVVV_ X^^/<, i999YZZZZZ:;;744pߊ`,]t 1g`YZZz#ٳg~eeeee~ܹsܷ:zŋ*(( ,&+++L {ٗx{{r$--ٳ'Op4Qŋ^f0@_tzfeeu~cc {E_?S( v~E7$-પ*%C j}__߅  >(HNNJJJ$- ۷oTN< FJJuDZINNK$1DVVVtN,˗%$$z' O :X[[zlllӍ8Dz]g&kk뤤 HZg b_qe8Jrrr@3YXXdffs zjժ}UUUUUU +Wd[^nfff߇C$-`褤$-----䨨(999s{};赁D蒶;wze|JNNZWS{9k| @/950xy-F333{ucc#(`¯XLRRRiii@|H[[[FF9<,AL---~f . @$%%3 Pb޾}[SSaD @$%%C:033KMM" ._zejj?aD @\KKK}c&&&}Xц vvv.>>^#00HLL;v Ff~ wQQ U(`q!#` bkk D @,{eȑz  wKPp #(` L6664Yp1(` קhAV&P(qqq(A===yyy @988z/Ϟ=^D @ z/łh@!Sp'P"UGGGe`ޡD\\\ܸqㄳ/ p:++A8P"ٳgB;3fLRRpvЯDY}}}NN8nܸXBDssA m 0( ,&pGG0w DY\\f`1+++s @d1D~ 0Gx3@P"+++KEEeذaBqPB'OL8Q?~ӧO_ >}:aظݻw5@?YϞ=4iKRǍ`P)//`3>7qD0w(`B&Nc/Dӓ'Odnnۊ  @45IBBٳgD ?0*..=z4&L\DPLLɓT*&O# @=~XLo޼#1H  =z4ydb3 8oF @0/2i$\ @Ԑ0.p5dļ \YYIt2BG9::BiҤWjjj\DfϞľ$((Օs3z!xӉN͔)Sϕ{խc|ڴiw}}KKKII⋿{Ell,)aggMt \#ty}ٳK"##׬Yk.'$C~z---[444="ڗBL2%))իW 5k)zFVVoF8~!##cܹD~ŋϟ':@p',쯿3g)z5<< D검}||oHxiĈCMJJ":,ȮVx𡍍MHH`7&M":H/͞=;<<D검_z5vYfM4/_>uԄ ̙cggX Dt^5k_Et "usm<888&&&55B :yѢEC VN$, Κ5kٲeD饎MM̈́mmmp#F@pknn6lثWԈ{>>>VVVׯ':7 3f̘~ݾ 5,,ᩀsss555%%%555[DFXX+)jϟ?&:1/?}ӧOO>sppB0{@N0bS3f̘5kֆ ?~F\2KII&:;w.&&իD "P@f;wlnn>pA߿$: gDNꍆ222 LFz)A}Wׯ_ڵknnn]****--;v,AsAlud]__zjCC%Khjj{իΝNJ!)h v9 N5kVAAA8#0Jv+0ԩSyn߾mjjJt @'?~|ԩSgͻu) w7޽;}t999𙛛͛7N l(`~֭["9ήN4 ;0@P]];sLa5&&F{RA00@䤠 ̝/ZHusse`7(`֭[ ,^:::ؿq;aTTT}Vp񣩩Ǎ']brrrv"0@'D uΝ3fT*Ķ/Bqwwe`(` Yh@w!]ƦF@PV^^:}tɂ 0  Ԯ_>{l s.4&a8@ڵk݉N/ ѣ|РA)))TPURRMR)))~~~…!!!Fb?18yիm۶;wzs%%˗/ZH @R4ӧOxo}#Geq}=Sr F  `˖-222wﰥVVV7n \ ^ty۶mk׮%sR(55߹s C=p ߷o_ll,GuӧOGEEŋ.]*߾ 5###??  ȯ DrwwT,a(` 9sc |mٲe.] U(`ҹtҲeˈNcfffUUUJ^^ӧTPBKKKcs1ץK5܊Zɓ'jjjJJJvvvwfNbNyyyݾ}_I ҲٹK&M*//{niii@@s/ohVVVˀݒvڡC2222q`M R:r䈇Ǐs\y/i4n_NڧD޽{5ߴi5 rrr7nL<_Gf_qCQT֗zzz\WY``ի2ԝ;w_~;;wW5 ItSSSFDD&'$$Ç{*_F#At>#=%%%YKZ[[四oXYYp &z%bǎ'N :yfرEEEDg[Q?}4OD9>vy~1:::n":?+++ٗ|QEE&o߾>};y܋W,,,LWWWOvӧOHZ4}IzzQW{ȑ#΂OO^v-)"??ܹ^?n%%%J@8ٳؗr\Ç3f8p@yBMOO?>ABGGGJJj͚5}DBBbŊgΜW*‘tQmmʕ+NpFc~UoѢE;&aJKK۷#{c*>jhh8q-[z=Hiiɛ7o ;jNRSS/^i"Uuu3N}}˗^PWW7g2zlhhh@@@xxxИ:u*n "z)00Ç>oFcc㾴/B?~?ïHB)::`L<#]~]h@uoDkAh͛җ ⦩IKKٳgDg F@p((()((j!p??~ PB/0=ݻwcƌWRRD*v j/]$w⑇G[BSSsʔ)x?w8G ?y&A{zzz=#`~G[utt,_<..N@ڵk/цoP0!@͛=?ϛ7o,--&M:qℛ[kkk6ܼy @pAݾ}yxdΝWLLH =ڤٳ'NP* NAڮ>݋ׯGDDdR(/B0`͛8 <BC=p 5e//KI}}O444?jnn @*xPAprss" ~פB  m}`WWW7rȸ8===h5`Qb W{{{ 80֭[Bv3gTUU V#FN<+8-T(`|;;ng2sƹs窩~~~---ǎN6+8 k׮}ccc͛#T%##Z^^rʎ+^rT8 yyyaaa6mZbbW_}u#3wvaÖ-[Cs4ҥK~'.$&&^pa̙B &2*** SSSNt),T(`௜'~縸1۶mөS",T(`EYZZDUUU=:>>~ȑDgс*0QFFƌ3^~-++Ktѷ{/D XPGgvqqo":rss5559AS[[k``edd$` 6$~)...++kժUD)3f̨!-[p@(`wsbccG4:tɩG׭[(`=v޽|rp-*z3gN4ӣ̿{;0@tttl۶m޽n޾vڻw>yDIIx"`Ϟ=ׯx,HfqIXw/^{ӧ3?zȈ8@v8 H+++##/}Yf9::=, P=ӧM6]|9--':ɓ'#"">}Jtk(`QTTLOOONNX~=q7TUUWXQWWGt_w4mڴiϟ?gk+WRgϞ%:Ess#Gо?~~kǏ ݶm!y.]qƲ2dɒkii!60g?7|þÇn:uQW^tR_Z{deegeeDy MQQQQQͭ/^Xnt;;;{n˗_tIEEl_?cmm'_]Gsrr,,,,,,tvvnhhj}//C 3$GN:uaaaÆ c.vtt$6^ϟ\2((T H:ѣ)))W\a-ݸq# 2] ܓ'O455޽;&&&22RBB` 86mJII DfA߻wۛ}whh(Qy@L8S?gΜ?Ѿjܹ , : 0N733c_bjj9@e˖NGHڿCCÞ={Cњ DI Ӊ!CTVVVSSӂ 6otвe|||***D IgYXXr֭+++ j'O9s&..NNNNXO B]]Ν;~w!gIX4}Izz:>ԩScǎ:ujrr2}={nݺ7k׮upp9 //믿 9ٳ; /((Օ< J,,,RRRvNNN׍7 HĉMMM۷o.WA\kmmʕ+׮]KPN:u:NAC}~ͫW&: aӦMk֬!: INA+((DGG'%%iiiiii%''GEEq9> s/͛_}Ŝʽ{vVn)pECkkkee%Tnutt,YdW^p@P={`H^ cii/h#`>sΘ1cz_ii о4~ǏϞ=fggOyz_{왟_SS/2uT7_^ceeeŃѣgϞ}䉪*TTTܿS@hPW{{7L2={O>th~ÇQQQ DgB  XܺukƍѣF": obb?\7o_Aw՝?~cccinn~SAܼysÆ 766h  p55sKJJ6olgg#@Lჟ^.44پ>+AAAjjjnnn\B]]]oٲeiii|  M6644ihhzo&<< ="!!q%99# 0`…k׮r?Tym&aVPPPzzߗP(7nذaCXX-Ximm]dImm۷eeeYBmΝ۹snjCtW\0̂}߿h_# N4ݻw|ﯮ@B(` +W|vttlڴϞ=Mz/T꯿1~W^kXSSӜ===__|~ dݻV577{zz>~׏:ٺuO?4yD 8z/h4III;;;tNp =ꫯ.\Ȉ#WTT̟?/x񢴴4G`}||N:a 0 KPhlllhh2d鮮-ڻw/>F͙3gժU?#^l"}1`IDAT,T(`_-_ȑ#Pkkk_pAFFFp;~ssٳ%$$`4[n} ׮]{=/ƣG&LPRR"1CiiiرHp;Adgg1~@ӧ ܾ};!!aر@'AAA-^\\\={KKKLpеkz{{C^x>cƌ_UJJJ+Vرc@Oc@PeBɓ'wo-\P===ڂ~ ׀t,Z?CI?x:::Z{?kk ݻw266&բ̆ +]0`;.]tM63ܹ/\ŋ_|ҥKsrrk ޽{NNNcƌy.OkjjڶmovIgiʔ)cƌN似"""rrrڄ_.vrk=][[;c OIHHXlu@@>ׯoܸqժU;v쐔$:t L~;w lEEEgΜ!Dž ?H))){ :TTT}6lXXX֭[ϟaA-;*:|p___MM˗߿0 ]ﴴ<<<>}|rQ?x񢪪*щziř&&&ׯ_'*ҶmRRRqS-a¹Vp ?gNccÇO8~[bgϞmذaǎF p[[[KK,A8c0׮]ۺuNgΝ3gΞ={ՉNٚ5kfΜ9eq;kܹsUUU]FtǏW^v "IBBoy򥢢/Dtپ}qBBB N$ PGpk׮)S̚5Ҿ|rΝqqq{0,Xx֭[SSS===63-99Zw% *q(~PAvv}__ 68޽۾}Gh;99QT NAC|1,,l˖-W gfee-^Ȉy4nܸQF]pPݨȘ;wƢEBBBNDv ݻwƍsvvvpp :TRSS3__u,bcc|||ɃEEE111mmm+V : PP(t:}dtx#G^|zjpo߾oo! %$$?^SS,<)h`__ &t&o@cc۴i+vvvaaao޼100XzuFFѡzիfff#GHHH :axcǎHOO?sLHHȤI6l0yd3>|8sL``ȑ#W^`~`|2))Ą8P[Ń :t ?_455]v-00۷+VXbÉЏݻw̙3^^^k֬100 :߬_BX[[x,T/۷ox"%%EZZ]^\2v5kָ 9@?RPPpϏ=zٲeWTT$:T_%&&&$$tBJdfffmm&] N 1bѡDVKKKxxK=zdɒYfS8{_n```hh(CdP鮯OIIt:000/#V^^޵kBBB-Zxb C;w̙3}ԩDV///:meeue,T||lbbbbbbblllff6dL6YYYaaan*))Y` @7o为Ο?I$kښ]TT4{mhh`n Xxy_~+!!q #*:k,77'/߾};44499e̙Dׯ_/Z(;;[EEE__qǎo*]XGE|Èx3g ӧ߲3gΜ1cƄ s ӦM|--#FMRRr_~uuuuEE(Xw cbb"##dddL2cƌS*(( z`hO2yر"yϟ?߳gOQQQaaĪU8@A J=~ؾ򢣣?~Lԛ@={cee5a''';;;јD MMM_~%,dUWW'%%%$$'''KII9::::::885 D^MMM||ӧOG5vX[[[%*)O>%''gddhoZXX;vܸq666D477h?[ZZ3ROOOL,T"\4ŋ榦vvvSqqqt:=99d̘1FFF222DgPFׯ_|N+**2XZZqSRRh4oÇ5JII|~W---o߾}ͦHCCؘF)eeejkk{5Nɑg]S___[[B i 77Çu]]]??ݻwAaaaGG#>|#F 6Q(**>|HPNz1! FEEŇJ"f644hkk^̗ޗ_~>@PSS_\\\TTTTT|(---))ymyyaXfCIII@P=z4%%ʕ+%7n݀? 555555555UUU?̢Ǐ|/bl;a5, (R D2Q]EyUyaQ7EE E#$"ZYaל&..s,=ʣ>;sgώ驩VOu\Ux<. {%KX,ɔjX\٬h4L&IUUd67;6==pƍ?~x@~;22۷@&&&L9d2%%%$''jXc!vk(F\ &%%_p8T[֮]7S={h6zUTU5 Otu:3`0YuT%̑799\by =` (`@ (`@ (`gщp\YYYd{yyyʕ+u:]FF޽+:O---eee)))&iӦMxuEElg({{{KKKUUUUϢ͐p7CvMEhC2==]XX Oԍ7^v{bbbppѣGOK4MQOׯf;s̻w$JgZϟ??44444t1ѹ~p7$ ,U*̀t:/_Tenojj} ~7JMMu\[E噏$kslDssMh~8Xgb)gŊޗ& 9n6lx\t>K&6Ǐc4F={fݢK ܜKMg*@ (`@ (`@ (`@ (`@ (`(++;uT薓'O۷OT i d188{޽\EQ޼yk׮4рx  R[[{ȑ#Gо@40Çsrr4M{E `6]PPzNgVV8@|v񼼼o^zUt >q/zzzJJJښD'+`37n#ժ(JWWWQQѫWDG +`3***G}El K0P@  0P?2!O{[IENDB`gsl-2.6/doc/images/rand-levy.png0000644016036000116100000005215113373111455013516 00000000000000PNG  IHDRKbKGD IDATxw W{?2dDF2ȪhP*Qtw -ܶ22B!{+df~~|__.2/yQ>ysއNzn!@  @0` @  @0` @  @YAHHHZZz„ aR{ͥ X t:NNJJ:|pEEޭ[:U^GI}O<9<<\SS;u(\m8xA^|eӚMMMZZZ|||<饸899QWWwÆ o8+**nݪڻw}N<+4f7oUSSfiiVG%$$DDD,,,_jy/y{U566~(##sկ_VVV>{qCccĐ!C~lǎ-jk %%%͛[f\gܸqׯ_ή?,,,/ijjbywAAAAA---͸^N߸qCEEŋUUU۷o_|y+22>>>EEEEEE>>>Y; QQQaa'>{/^h.\oFڵ#7n޽{̪0KEEe۶meee=zڳgOZgjWVVoݻԩS[ᡪ* //o>W@@QG߽3F\\<55uРA{ 1W^% tmH @  @0` @  @0` @OvԿ2][(Ǥј  @0` @  @RllU=dee؈dggC iѢERRRCee~fffffYuu5 > Xy~ك[LLw ]ݑQffŋeddtttYp###aaa Ǐho1ospph!((y{b`.266VVV~eyysXH{{ٳ>//e͚5iBBN%ډ##?a ؟CZ} &wӧO2eݺuooܸ&((Ȥӧs A'O,YW_~=k֬o'MԜ,G޽{YvZ#`raaaJuGPPBHHmllaVV zn^RPP坲9 ^m{kэLASS3..x < EW^mUf7{%h`iir̙3#8CYYYGvvvvppyѣGVwvގ9sxyy})S֭[N^^ƍiii]롤ŋƍkuAA*%}x眅"I8q'OZ.y䉩i;{nذat:?Z$''SU<^xG{rǏ mgKY|Ϟ=->Zw~-K6=ԓn^RPP555.\`0@yy0%:#((XQQ!$$6660++KFF {͝>}Y;u͙ EX?=s%%%mqƹsviUvu222_~m6::QTT =YXX4MSS3..x 8>^zM2ɓ'B`>|xccStׯ_+W:::Ԑnt=>>Z\zuΝo=zO/UUU9;;ggg߻wOLLH{0/4@?}tҗFm߾=;;ݻLj GiWVVgfffff뛙UWWڵk?~\YYǭ[rȢ"&jkkϟ?n: :tȑTl?M5snaÆ1/秫Nauֹa4-[Ç:t1U -N:5((>77~;r;nҤIt:=<<ڲ\MXTT4444**JQQQQQ1:::$$DDDՕo奡ѻwQF=xΝ;,ͽzrԩԖ[zӧ- pQ+ppE1bWTTT4hӐX  ׯjjj̨zjIIIR`>ǎ˗T?))iҤI->>aaa[[ۚnhddDӣ:&Ap~ɓ' u|[{{{N p8 \ȑ#YYYgϞiyCCC@@Ǎ׵߿iyjj1crssV0tō7ϟrI]]݅ N:՝w.]455rEEŰ.W`Ç߿;yIaav@@ǏǏOMMURR266޲eKEEEK ,(4/acӣ9ߖ}EEEvڲejaÆ S#"04K! !Cikk~'O^b w @-y򥰰0h7n kNN7nXp!ϙ3'$$T }}}K11߾}T nZYYC~m۶`  mҥ͛7S{sg>}zѹ`[`r;wXl'}5k'LI6*vvvvRWWWPP m޼yeeeׯ# }֮]KZMM͠A>}$%%E.}!ݳ&F n!JXXRDٳHw\% `٤?ӧO5nF/0k)((MƟzmbbr}ҍ0JJJIKKk^+IIIeee]ٳ޽rI@@I&ĉ-g۸s[2̘1#,,yIPPЅ v@,Xtݻw̙CV>l{y9BpL {\^zijjj=666wiDYY>''TWdaƉV`"D[nիI7Ҋo߾)++抈\1cj 0ݻwmllHwѺ9288&L@Bpwh4lߜ9s~q`n_4{Ցn] ݻwj !@p̆^MNN+[ UTTL<944n߾mmmʮ:00Oo޼AB@ 6L2 mrss  &MZfͬYXR7 :͛ܲm۶@ ͺK,9sL޽ٸzժUW^eFg!S <8//?UyfQQ={nC0/C~z@@g,FDD[.66t#AAA4`llA~s-**iaii=sZ 1cF:gϞf⬣vfu+))ikk{{{7/y#ǏG%..NNÔX~G\\ܹsY8 YYYk.Zxʕ,Z񣌌 ^~9`==oߚ><<<޽#= AAAY˗//gb>o߾?,'ZfٳgrhhadeeY3X[[w4Rrrkטu(߽{ghhq[;| IDAT6}/_03^L4#+߾}Ɔ-1۷o~5{q۷1m|}}Ϟ=kiiXٳ+V,X`߾}+,,444EU_VRRbAoL2gKK%Ktdm۶0)<h&MJNNfFCIZZӧOŋ 4Ν;\yϞ=µLm p [zI7-YYYbbb{hf)nqUTTTTT$%%9sfܸq3f022¥X,  1bD;/-{FIII뛙 0U}. 1bD.A̙3Ҹf>XOOOҍf)0@^^ׯ;\}01V/^xݺu6[nuvvS RRRzy2dә t(SSSdeedeeҘرcGJII)((066fRWܾ}SmܸqƍLj ~>|;vjDDDyyyDDqBB J[lqqqVnݲٳ'"e޼ywihhV6mJLL|1`_mO>}͚5-|vq4@KDD$--MZZ‚ee媪*fDPzzѣsssF9r$77ԩSɋZ]ޑGUnݺ5{lL_6gΜw655nu~7oi?G?ܼys޼y`UUՁFDDnu~'O|~v7o޸1,111111|Ⅽd߾}륥?t#L4w[nu~=ݑ w(utt\jF;s̵k޿߻wV;8q-[zj''.瀁)Ҵ1cp0;p( -&&ۻy… ֮]ߕlrر ֩];(PQQѿmG4mȑǏ8q"F̈́u=KZ]-UTT ŋ˖-ڶcǎ%64o޼^qAt:ۻږM8!!AGGmmĎl#---߿߿ٵo;wn@@@ccc><]0 I\2`_nXRRsNwwwi1cv6y󦭭--'%%% v$l]SXX8{gώ7#ݻ5xJZZ/_ otZhMMMkkRF-*((okӧus (TXX3mڴm~“'OR000 kiiy;o޼Ƀ cǎmkَkhh%!(qɟRA :8΂ |||Yd޽{졤dg+pcwN%K/99?8E455_~LaoSxqd!ˢ>EQ]]-''J8::[;E8빠pgxվ}4-((h<4mѢEׯ_f7><66(CVȚ>} ϟOš>}ޝ:WRRԤ1)f)0T\\ݧOҽyfaanxxō7f̘eX`,XtBOOOTT˗deeᩚ-͟?ۛtV0s'Nnjkk xКijj~CKqA9200t#CtKFFmEEEKhkkwqttTLL% c4t2%N8qŊ/e䢣YPSSݻw\:Ǐ&MJIIfo߾׏޸իڽ{w~~K_ xAg611d ^^^/ŕ---{R߿WSS{a( .`GGjҥK˖-W֖~YKw֭~~~/8k^|'>>>ҽ?{֭[/ԣ?C0R``Kjhhl޼t#lBQQOiCXlȐ!>}" [lِ!CvA!8 ]faaܹs/:;;3JIIn`ijjt)VXq9]P zzz T<<;.222;;t:=!!j}M6j_~}E(#DDD/_LU &SUpo+p4ӧOǏONNjcǎ}ʕ+TIIIfffܲeKeeٳg)\WAu۷St:ҥKuuueeSUpΝCtH]]NU'OА|% g[dmH7 R``G&&&^vt#Çiii{ېD}}ӧ7l@n0|puuuҍtM^^^:t.ey֦M?!+D`6tuuݸq#5yԩSBBB(I-,,) _`ֽy&""bӦM|iCC95yƍ]\\9vX̆ZN3fʕ>)aԩ|ZC y𡎎U5kjj}||ƌCUMP ^zа` k~Ǐ&$$SXSXX7ngq`G@~A4U .޺u+5TMM-66V^^t:}ٲe&p"R`\ZZѣSSSEEEIo^SSsIҍA(|rYYٽ{nk1fLHH! p0K!Z999{fk׮>z(F Y  {aҍp|mm턄)))ҽ@('IIIҽpիW9rt#=,MԖ OJJ `iӦS[6++ߟ鴠rrrvvv'N˗/CCC)/  @hO>>Ԗ}ٳ1 C{WZ@aYJMMK(X|y޽ݩ- Pٳ{EQ[",,f/;r䈟_rr2eP8N " g̙vlzz5}`)666x WWW' p A;wn~MVVv׮]+V'l`YYY666bbbbbb666jժ~)%Jk׮=s }{cc H7\YYijjoffV]]-de[n>}:w# :6=ݼd…k׮mCJq4551cfPGGxq}=ҍs~J R5jTCCe/_~9/'ڹsgAAիWQ<>>ei'$$\H\+W7o???e7l`jjjaaAmY` ~~˗/o۶Ktʔ)߿,p%6 RqqK PRRBP6ml```hh e7nܸh"jܿ#G,_²4Yc޽|!PdgϞ7//oʕ>>>۲eKϞ=)zՒ%KN>MmY>lzt||t󒂂==7EX,//ÇNNN֤SN?~<)999#GwިQ(,aaagn遁W K\,--rqq9r$emɓ'Nt1L?V0'QRR:qUGq1jG铉ɭ[ƍGU͔1cƄc>sLOOwŊbbb5# 6g޼yTTUU믿ϟ_[[KUMt8k9NAAAUU2Uwvn~v+22RJJ͛7onf,K$M+<… Ǐ8޽{`[ FѾ|s\zǏ)BBBn(++f5//PpG\W^}葚^#555mܸ1$$Çݬ' QP qׯX">>޽{$p6WWWww ;0 @2 o߾#}6nnnn~}ҽAHKK366ѹ{.qT+oҽXk+0}BBB.\gϞ+VPff3 O:S\C^~ xtѣG-Zt /0˗/&LI ``_VVV999]ӧ߿͛7&&&Ե>}ܼys޼y)vZq=0D;;;___UxՈ#tttº/mܸ1((hÆ 7onhhZA~֭Զ (//oڴiG555MMMG={S9Oym144q|҅ BBB ,  ӧk֬YxqMOO8qgϢg̘Ayo$..?̟?ї/_B}޿ɓoߦ=`ܷ CK.ܹs۶m6l//tvDEEEfX ̉233}v5 ?ĉ .$tnChSCCۨQ&L+/}=|uԩ];+ \  -**ѣG^ڱc)S9r C***ZlՆ Iw~~M6EGG~z="=ٳ_WWwqMM;}&%%pEEŠ ww 6L6-))SI!cǎyzzjiiupMM˗'Ncj{`aaÇ)SL0aڵԀb\\\.]ґ>|?{lPP* :`'%%aÆ|~_AJoo'NnٲҒtS$egg_vm֬Y멀^IDATׯ>|8xnrJEEŧO^vŋ3f@˻ 2d>>>Ek Mnݺeff6yd?޹sg̘1`O߹sgzzۯ]6x]veffwׯ_755CC_fͅ K<{lMpϟ?;wGKKk666}ht:\PPWTTtY LƝ;w޼y3 @GG'''ڵkuuux)@=xի3fppp011ijjZn]xxx``TIIIٲe˱c>|`cc`llS(..~z~~m||]}Ǐ'.[ȈtSR'O~ִi&O} ???kzC̼=z0?1)((4 .^莢ly毿~*%%x8pS!YS⢢_HII 4HRRRAAAVVvddSڵk4KǏG\Fdgg455 8PJJJRRRZZ񅤤DDT߿/..nد_2ɋtҌe/pׯ_ptt? ?~ɓ'ӦM:uj˹iDEEcб񦝟XXRRHbiiiiiiƛ6#%$$ ?`o߾IJJ0o߾$ ƿXUUk.{{{ҽ)))?NJNkhhh-/KJJ}&(((..f>>" ^e ZUUU7EEE&%l$GoCCCTTԩS_zE!7n *..&K(((0> =zTBB~ʕ+Iw|HHHԩSO>M) :q№{>77oo% .400Xvm V'` ;s挖_***lx@G0I8HLL433۳gZnۧLҼ$88ѣ!!!]+wgff|n`UU@>}vZ^^ޠAxZ։'Zbbرc.,,,((8b%`?)..y&($L7eee1.8qȑ#ږ4q?_~C )4 2@j EW}P " vaPBQ:B"4x*9?Pf~lq|koCC]WWw_khhhhhi*J=EDD8N#N322rݿRT^} : _dٔ _đnݏL&<+ jZRyX5啕766(Ae_ Q6F6?fS6F6 ͛6 PI e)L#e)L#|OOAS6F6?fS6F6(O:cpC @ 0(`P@ @?^p8Q^^tǏKZ^ZZu͛7߿Y:ѪoVUUĨs*JJJKJJRpК9/D&''w.ē"2""tq:Ry֢pSvm*{M BPUV__Qt_9LVwcccMMMIII׮]q!&EN%RyP)EjlT˼/_xN7Ͷ}`ZVHGp8܏&$$HY"A|m5m](Xw688cSy#o߾`Z3ׯ_;VWWHt~d2I !*̱ ZԹ+o/xShM|x]Sh߸q#''G: VZXX('TSgm5- E_$''ѣGNӧO555[l:g0//ylltܿ?99ٳgҹt]PT~-55AFҹ<)2\.*1צ7Elp@⸸M6%'' HZ"UuvqKLL,))Si\F6H?.**2 ,ksLM"P-U 0(`P@ @ 0(`P@ @ 0(`JKK/]~ŋ'Nt]@O<4'??o۶mрpŊZv<={6##C/_>}T:(`rssgffl6[ZZt ;;{bbݻwwܑ'Mkk`qqqyyyoookkt" <jzz:++h4j_PP+ 7X,id:uTUUl* ,@;`P@ @ Bgi*`IENDB`gsl-2.6/doc/images/rand-levyskew.png0000644016036000116100000004650113373111455014412 00000000000000PNG  IHDRKbKGD IDATx{@Ly?IFR\-Jֶ("-&Kb֥eڵصKڬV],MdH - DRotϙ/Μnws>s˥x#@@  @ 0(`P@  @ 0(`P@  @ {rrr~ǫkii͝;7&&H0zzz'O޹s/ڭ# 1h}cǎ޽{WAAaڴip\.[WWTWW؄ bAl%䈽S F['`n+33so߶q}a@0;w+++4VVVlmmjwSVVСC߽{nyUU^/11qȐ!ǎ,XVVѣRQQ1|fG~Qw?7F7nƍo/oY]]yf333N>իx{y_~^{VZ5x`UUUWWlMqy[p["##TUUUUU)rrr---w666߿Q9ғ'@\Ny&&&qqq\.`>}ʧN8qbhhiݴr]v'O>p@OEFF>Ν;]?~۷y:t萚Zxx8oI\\ĉSSv̛7oƍϟ?ojj1cFgCі/_h4OO8p@OOӧ]og7ݿ_KKܹseeegϞLNNwO<}#At^t\2k,.bllȻ(**ѣG^~=hР?;;{666[laXϟ?0XD-[; vQ///r:~WWWޒŋ:uOB}}ڭߦ]?Fۿgh;w.]T=)s/7>|x~[&LO;(`uQ?аנ {{{n 5oݺ}v5cƌb`? jjjzhjjVTTp\6meerǍWXXr+**z$֪[ŋ=yٳVhn<}}.R#uJMMk(`uQJJJׯ7oTWWsܷo\tr--r.ݻÇ?x'I?O>i^y0// ꫽{rܟϏ8p`ݺu= #GlN~~ܹsnjlٲ+Wv8m?Egh7)((th---=)744пj---@(z^m[رcرr޻wr=SYYɓ#G{,66¢Y__˗\.ŋ---l6{u$ۭАyq;;+Vt8ݎb4ᴻw#Bp'uɻ`n SWWQWW?{,M>444ljj2eJ_ݻwK=zd``.XddСC޽ۓ`#Fغu+\0gg~$> :::999]r_~oeeeC݋DMOy{]w}ǻoz#G͛דHB@}葾ӧ_~]SSs֭NmZZZF5x#FQ.+v|rUU՛7obbb~ݻw ,,'v%''wޒӧOɝqDlW Ç 6XQQz6> JJJ:::~~~Y1 mmmee#GnٲׯwYr̙3$?|av]lvvv 0`]DDDgOl z  ^KK+//Аt7dTUUՁL&@6kۛziY  c  @ 0(`P@  @ 0(`[ CCCCCC`ufRRiW{t\SSD ts]]]+DGGEwA[XXdee/a=mYYYg>8_b{x1ctvŋ'Mԧ|}CILL p8߿tWf5s̈/_:ujʕ?SۭΗ.]*))inn~Y@@]xAVWWMII122222JMMQUUp[X,sss;;pWW׶[mjii蘛@D$,!s 0(`I;ѣG~wCAO@ڤ]vРAWrB`0z?/^??_IIIDjkkyK HQQQ&L_:i%vALqƲe:˛}III| ӦMۿ7}Ő\nCCC^^ٳg)O???q=D(**}vBy4A߭JJJoozz  EAOOf񖔔<<<={F #` ~Egv=_~ojjjKKH3XXXdee/aƌ߅O+P@!...OVQP7n_o* nnn, rww333ʦÓ :;w|YCCΝG[ݻzzz7nܨ޽{ԩS{Nt޾}kbb_YYYYY{nSSӚhaaaUUUo߾믿LMMϜ9C0g>D`(`z왗q.\ #t1بΝ;vYvv6i3pyܹsΝsM]h֭300WWW裏*ĴRItO$0L\~ÇI驮H 0 @N#`h+P@  @ 0(`P@  @ 0(`PHj2 QTTٚIII&&&JJJӦM gTId899􂂂:\WWʾ666555=ڼyݻw!\.  JKK -YdoOS[[[ӻI |GFF2L%L&3""wWTTA.ζ_bee߼yp5kֈ,@$roRmm"oIssZcccgw{ׯ_ dvArLԬ_RQQuuu===CBB~nWHsYYYYKlynkk[VVj~~~܎&1IdX,%,ݽwOLL3frDObbb@@p8mx̙eee/_%C8vΝ;L\[SRR6m$//y===" #l۶СCo_fgghkkfş@a0'0N<aaaׯ sttC6ɂ]|ƍûܺu+**V$ BP@evvvW^իܹcff&lHthmm]dW_}%hh4wwҹs>x@MMMs(!!!wׯ+W^]QQqm 삦0PSEE_eeeilltttd2֭b6Ʌ0PӚ5k:cbb>h(` AM8=QX,T%%?DÉ8+;wJh4&9rȀ<t9a T3uԼ>~…:::tppx;rqvѺ|ɓܾ4rʔ)b.Th899􂂂:\WWʓ'O.//rJqqÇ~vpM?]xqѢED6}:4Ԡޒ%K7|?Ƶl6{yyyυDxzzoLvAGFF2L%L&3""Õ˿Wyȑ]t1h?}Gζ_beeӓ^~Ҳ!C(**{yy -(]t` `nn믿 (Zϴ+++ceem8=,,:%%nəBN uuus!c۶m{'@Q{t޼y#""_mݺG{4fPY7nܰ#~u^kkk;;SN (:HOOf񖔔wv/_Ξ={߾}]?xiiiMMMarJkkg#ك-ZYDH&aYXXdee/a]\իW}i4$TkkkfϞM:FM0… H*_b;\%00ɩ'~I& !%xhkklٲgE ;-`Āpy+uqqf͚C9;;_tٳgv駟D3[TTEmfΜٯ_?\'w(Z걱)))FFFFFF111nTUUUۭ۶m TQQqttMHHbiիnnnS͛C:D|"aQRRbaaQVV&//O:{nΝspp @$dnsMgggJ/FSPP10d믿ON:E/_  \nLL̴iHVZs-eff.ZQF<@:0L믿f̘A:Ettt,X3 nݺE<_~ѣGI(`kjjzL:HWtsH(`رc D:H7c@...nԩStYAA᯿"@2.66!nƍAAASH|F`S]]^IIIgB&cch+++Y_CQmhJJJk׮=|0  @iwܑhGp ._H]CPW||<@;w@]8)0hnn1`>b m_d2>}J:E(*11?$ bŊ_~tBPTBB¤IHuֱXoߒ@E(`iN>M:ӧrrrFFFՆ >J:堀H m&NE:堀(!!ᣏ>"B8K\$}(`*JJJ8q"ᑗI:(://ښtPTT/pfJvHRSSǍD:|#G,))2d,T0ܿ_j?\h.  @9IIISٗ_~yرA @9Wffft: APK~~! ·aLAPTn3cƌ8A( @-&L B$0APvax IDAT˃i4LNNH  @!͏=!DT9B:y(` 255USS#D֯_ZQQA:aZ CCCCCC`uf||… uttpqHrr=ᅮ@DpMMN/(((((uuu|~s`JMM%B6nxȑfAHr3,(((---$$dɒ%7rrrme$I`ii2n8ADӓtn3_"GL& Ɍp{ڗF9UWWXZZ"_}I I" 8;;ݕڬrrrzrׯHtkkkF٬YI F" hii/֮۶mydp~mܸq߾}#; vtt~~~ruNYǏ'B|LfRRN2K" XSSxݘ/_Μ9sSNV}n.ّN!> XfMPP dHd[XXdee/a杭+WW;;;>@oy󦬬lԨQ_|q…AvsscXKX,{+:99%@o'o^YpcH @"Z]]mmmfvSNeee-:yE k0B```EE޽{I'޿zlllJJQjjjLLLgތ OOvĜkiii25gĈO&@0F #Fcmxt1鴀_xc``:eʔ⨨ɓ';wŋ }FM:a6m $@L:]=`t׿gϞ׋2!kH \;v{. 544޸q  5 v־4555u… ;t:n:<& 0׌3>3A(͛7#GLII166&FÉ8XZZF<\j / [p<==E @3t ٰaÅ I *$$͛Ǐ755e0eaaH:,]t߾}Vvmgddx{{>|8++رccǎC> 1`#GuttHgYGMrr)S>۷ol΁!}} $>}7p@Y@v<L^hiӦ<~Xdwt֬Y&@$0F ,_} ɓ>)8JOOkfff8 R^|y]]]w[|#.CkkkAȑ# ҧ?nݺ 7o޴?D @=}TSSSKKtkD:uZ?0aٳ'O[]]]]]=zqΜ9; aKyy9 ͱиW.Nwvv^hrR&aP|w۷o'D2^Z[[ߟt9G  B1k֬իW"lllrrrtuuIgقY&33'aÆ-Y$ tQ1LEEE&/dRiᤃH>$$> 5/~Gfffw}ݻwGfgg!TJOOWP^nݏ?H:ptkeׯ_xׯ2E0ݞ={pyAԘEGG 6$߽{O?mp… P!y;v p;\>`a(^[vmffI x/^l… C4\}}IH۲e }}|ǀQ$Vl6ʊt 2|'N{8eff2}w;wVVVK؛*0삆hmm4hPAA&,oժU{%.@!(`苼ӧ?{tiPVVfiiy}SSSY@j  (**bk4)crYjnddd$¢_7E ɉN].]{޽V1C6n[n 0M JKK -Ydowp_pw `4􅻻͛G:tݻIg)$s###L&&݃.h_I E 8;;n:++^?!Crss7***I6۹sgEE hs8---%ڽŸ{XXXuuuJJɓ333@0YYYVVV(t-ڶm L%%Z577566v}Ǟz5??;wvx54gϞ:tt) TcƻĽ6nWy7A233qXDgϞk׶#-` ,%l6[XoC)xyy 8㤃E ͍b/aXBy/N4I(sMMMyyyH`??bAGILL p8?))ۛBϧ8;;_tٳgv駟DS999&&&ʤHQFXb˖-tbdddddlwm۶ZZZ8::&$$t1$.$۷oOLLq ݠ,h*Ùw6nhhhi&A_llʕ+>|F: H< }ھL:Lprr㏷oN:@W0F;%D&TTTXZZ8q", 0lJJJh_޿UHg @p 1466 c(`qh;~xpppZZ @ ,߻wʕ+#(  0)L&t׮] ,h۷o IgE%%%666PfAH06mii%eȐ!f2uuu @08{{{#( rE~:  r 0 4b\t z@ ޽8p`YYYپ}{rrkz$Unnaо}ڽ{L|:BCC8p}Y@֡D L5Æ ;q℧gEE, P 77O?db>,L 7oٳt] H"yyy}}}A=EEK.ڎ?~,@p`*2dZlYQQ, P"qד2 Bt:t ʦM>A@栀D(==aG>~xlYSQBq8cccR_aaĉO:5c YZp*JɓieeÇx"!d>D,&Mڷoߜ9sHg̙SWWG: H?0%-,,/^B: H9'&aAOp8%%%Y@0s111 &$, 1cƠ}%QY*SRRvI: H3 @$p vڵ>HGGgڵtBN!tuuoܸkkk/\tB Ǐ'$::zÆ ׯ_' [MMM***@_%&&Λ7ҥK IMLLо? HJJ" @2220K8;;9sO>y, =P‡)ӟ| ,Z CCCCCC`urzzڵk $''' 0Z*uݻwIgi \SSD tsn]t{dVKKÇQRē AAAiii!!!%K,B̆YеG1twzxx9sŅt9̂H&ɿdFDD/-- n˖- '$D +;;ښ. 7nܘ5kVUUʕ+I$#`ſD[[T~(`amm};vDxut.6 33{EGGXt0Yƻ}pR&''PCCt]]ݸ WW׷oߒD" "++ 677'A***/_6332eJqq18 1$X,N*OZZ- n ,0aBZZ8 $}||8OJJ歀#@Jjj@Ʒ~{СYf]ptY걱)))FFFFFF111? s@tq,7wܛ7o~?Ckk+8@i8p&,LFF|! @Xyy~2h qOp&, @tttn޼9j(;;G0(((߿ܹs xyyݺuk+Vm PQWWgeeE:PUjjjKK˄ p, %%%ArTUUϜ9x q*P‘۷oϝ;t  &L (<))iƍ&WZCFqѣG˖-3gΞ={TTTHǁ{VVVVUU5j(A@2L2%33jܸq(`!h;SB 4ٳ{ؼysCCD n(`!`yeee7.!!t+0ydKK P'(`> ,Ç;wgΜr D{O$0Lwiiihjj2ڵk۶mSVV:u*8R (## D̚5+--?9sfJJ D 0@ݽ{ёt ]ə?[FFPS(`KHH裏HYjժ'O-Z(''t( \{P@JJJ_|Ǐmmm-ZM:t K?VQQ6l iӦ;;;ϟ?dž)  KwIUUoϟ:uj۱zΝ;SL!S***ׯ䉛ԩSoܸA:*0| ><66vȑtݻw.\ TRRڲeG~>%CF_xA:\nTTT```IIɆ /_F:Drɓ'N 99977g޽{wĈ;v(++#KFzAM8ŋ+--3fǏI9(`޸sF ̎;ɓC:::2w%Cp8S`8 O>qit&,jjj7nOIggg)IUUu͚5w``1|p??ׯ_%PC6mZdd7 G㓞N:tTakmm2dHzzСCIg'O;vpWRR"Jdqtaa!`0EEE^Y="Ҍfkii}Anݺӧ6mߍo^RRB:h899􂂂:\WW땹&?7o͛7o߾]QQaaaxb̗;M JKK -Ydo/V삖q>>>'7oޜ9sرc֭[t P"$s###L&&!11#`e>tPtt͛I<-lkkk%VVV999^yȐ!^^^B 2">>j&''7u˗/'%%h'---I 0_]YYٻªSRR&O) ]\\H#F/ 1bI=T[[f55>Lт#""sob`aabƏO:Eeeeϟ_v_P.GfxKJJJlll2F+--555]6L’YvvvŒ j .\.--]bŲeˆ F:T/$, ,%l6ܼ+0~ފ1c[ʟ}YRRRxxxۈ=** GQ͍b/aX}_F]xqҤIB 2իg&@_~h޼yFFF?C'V!\JzeeeeeݻvVONNNaaaMMMNKKu6>i R"@eggjkk566N=}Stbdddddڋmjii蘛@Ӏ4/6l_cҹ|"al񱴴ܰa ٳg'N8uѣWXAj,h*Cˠ֡C޻wĄtitSN%&&zxx,[lĉC BP2(11ql6ti+u)xb&I?yekHr%A:300غu?s &8;;;wt4`N`.kll|5 YdHcccdddۮ9s|gSN BP&))iŊ] D… Np8/^xض]\tiS.===__ߌYfY[[ٳt>`N`.kbb4ښ>vŋ/X@[[[D.h A˔ua3555ݸq#44뎎/vwwMLY IDATjՈ#lB:tʕ+ߟ5kpuu0`PL!(`hhh!WR)iiinnn ,>}r_L!(`qʕő)-- tqqO]]]{(` Aˎy͙3gŊ@/]r… gϞ?:N())177/,,TSS#˗/_NNN4iΝ;xnسgO^^މ'Ha~zxx7Əfff(` A.;zgN0t7o^zڵk***nnngvttTRR_ L!(`Ya|@pk׮]z577y֬Yf2d L)(`Y0o<UVbU^^~7oΜ9L(`sYwݻw͛(` AK70 t ),ݪF_@\@L:Q`N`KZSSQF08/NNNh_ =z۷ǎK: PF"`N`K/_Z[[gee0hm޼y͚5h_ 􉏏g2]%dFظzÇ}@0FRf.]"Ht xPII:U^^dɒ]WWt9(`Q---K,a2,Lt/󣢢ß);v$$$ܹs A]p!>>~РAB inn^~}jjj||<&^Y(`~F\\:8 dXaa!`0EEE899EDD} kjjtzAAAAANwvv# $??ܹ۶mc̺'N888l۶MSSSSSs۶m\ rCVVD#d20̈Ry@Ԟ>}zСI&9;;6ٺukI?-))))..DT'O씔Yf}'... f}"|%%ZEEEޒf55= X<߼yZWW͛ׯ_h4333KKK[[[GGGKKK@z3+455)))u{;v"z삦f* E`LEC0.O²_fIBX,%,ݝT,Lª^f F;zSTUU{OBT4 `.SWWMII122222JMMuE2jFT4 `]0y???Q?dȋ3[t)9 D:wӦMfee>*ſt O_W<y'PK 1p9BQ4-33399Y]]9 tׯI:MMFA A''[Θ1䯿ڳgOLL TP _W>(((HWW7##t(.]z?/~/ӧ{t=zt||< BߠbSS&%%%Ry:D'C|]QH.1|ShG9s&+W8::("WZZj``sNY?%=*QFbD棞?'udWAII8Sq; fjjv9U;l0qvŋַnsSnvtuuKJJ2TQj몇GϮnǀLu8#6.ӧO}eM_S3fkk[VV&TNzubE*J_fI_W=D>|vuKoRp_]xqҤISt5~"1cƐNA+++sqq trr"X,N*I"DIG}ŠF:W(˝1cƕ+WJKK^xqICCk׮ŵ9<]o۷&&&qԐ/Txx(;}T磞)Ybbb͛`hht\ҡ:F1ˍ?~3`0Hr;q0y={6w\uuuuus;\G՞.RQuEw{G=% kp 0(`P@  @ 0(`P@  @ 0(`PЩ nٲ͛=< = *4O}zRU0 @ 0hFSK%IENDB`gsl-2.6/doc/images/rand-logarithmic.png0000644016036000116100000003273413373111455015046 00000000000000PNG  IHDRKbKGD IDATx{\uM#F3J7b,N٦h6=^hyo=jI07o\ &AQ93|?3fL~~?p8 :._#` P@` P@` P@` P@` P@hT]Y㡌K.#F5kѣG;B}!2` Fp8~ٳkkk aÆ z_phz|[oݺukBB|{#^ĉec0&Of:tӧƎ{A޽{b駟n6?,X|ԨJ5lA=~]4xرK,qݲhѢᄏϙ3?+t>y1<^z%-7o뜷:p|[vq׶x~xƌKVX aaa-K\TqZ}^yכf͚jTՖ~O_j@03+9f5{![<|Yf]}aaac 3>|[ùkVSS張yӉ'ܷL޻wca-:u*<<>Æ 4iѣG8-ݻFUm `Tt 4N =qD.][Μ9ӵk棹;w uМIᩧڷoߜ9sꪈӧO7188cO:|Nz|I?ݻ]9|3{6mt-د_~iڵ_}VVVFFƃhǎkk=֭O?zÇR{jh.3yyy[>sjj]o]f+WICCCYq=k^\\`gyͧUOX,111 O?UWW裏FEE~%%%{.Zh_~Y?ܖxO `裏Ju!0cn߾ɓ?G}駟V]X:x͛_?~РAӦM8qF#h P@` P@` P@`GX,&d2Y,2o{= e\\WWb6m6f3ͩwv?h;<={ZʹeĉÆ >}zmjj8pڵk:FO 8//jnZmo~~~ll, Lh&&&n:gΜ6>/5 =1BW%%%-C )//׸׏?xW߿?::bh|A1b-%%%z7瞋L_|@heggnNOO׸ٳg_uNhh4O2{cƌ)--˳Z[Vknnn[ۡ`c|GzС zD-޻wo[`.AnZ=` /W^y套^rnyW82jnt!!!N vn?{%\rgCuܹA<0aB_?c_Op雙 j̼?lG`+`~h4644:444Lg϶AbccKJJbcc[*** R^^qꫯ޿;+`ǎkk=j IHH(..v}V7߼{>}; ~l-~5j׶Ҝnjeggk<ٳg_uNH|޷~hѢ`0_~ɒ%;v츠G4iRbbٳNj0.]s7|ӹ vƍ񭮒0z߮͛7G G,,,ܵkW\\\\\ݻ """4pB<$,~f@@!Pٯ(@ 0 (@ 0 (@ 0 (@ 0 ( 79bXL&dX,eee;755-Z(!!!44tРA֭YKII16fzo?%%%|ɓ'ywyǗpCu ̟?Ϟ=Vrn8qaæO'|2o޼piiibbݻΟ}Y]]݈####G駟LIhh-111555w2e?l:4~;vIGg蠩? ^zO>QY ]GEEXVWWX;Ĥn;?V%33T@[ b-%%%vn߳dff:}:55uʔ)o C~~s=aÆ#G0ٯsv튋۽{wAA3}[ ݸq_uU]v[onݺv/>RVf0@JXOεA~SNϟW]!((p F5* Aȿ 0p8pPPPSS* @ kPP+` ,#hH":;4 `F#Df z١A1`F#X:FDtvh@/":;4ȹ#h,0#hЋ 0EDg9t$Cc@GtrV@G":;4 `F#D]4EDg9d :"c IDg9t$Cc@/":;49tDK 0EDg9d :"f z١AT 'ADtvhs 4N 4HDg9t$Cf :١A1`V|b2L&b)++guv49+`F#]]]]JJll6l6kK>+ `F#ݲe˒gΜ5saÆ-_\u] uDtvwyyyVujUUB|!$\ZZe{ոK^{=a„}upnGGGnzz jkkwڕ4bĈQ "_Ç^veO=Tff/233O2us 4HDgwb[]]bMޱcGeff:>w4$]ZZZvv6}7xcԥf :M4hvngeeܹ3##ùT655uƍgϞ=|ٳ?Ι3GEu)JFYXXk׮ݻwDDDxy̙W4hPxx۷c;0#hQgxշoߜoMIIIIIIQ `F#0#hБ rұ$Cf z١AN3 0#h,0#hБ r4HDg9_Gt$C#d z!c IDg9t$Cc@/":;49tDK 0EDg9d :"f z١AT 'ADtvhs 4N 4HDg9t$CKQ2 R@Gt Y`䬀ADtvhs#hБ Nb z!c IDg9t$Cc@G":;4: BK r4HDgQWb z!f :=:rb1L&b^dԅf :եfffsjjj}}C=+H@/":e˖%''Ϝ93*****j̙Æ [|ϟHߐs 4HhYV-V577W._}ղe˖,Y0#hЋ411umպrȎΧD0+`ЋnGGGn3z፨H)ވ `FVNªYfMaa_|QUUe0zi6SRRxof :zIz[ne7o1b{קOG_!Q+`F+oӦMGv?}-[<lhh:D0#hЋ>nܸݻwH_Wcƌٽ{q:0LZ]x]mm C1`F֗Vo׻x mtzgܶm[7n\`Aǔ_@woVf9ر'ܲeKG:B#hOnXxb9u`طo߿q/ӦoCJKK~G.\xw_}GWf z衪ϝ;7--Ck+Qr?ӝ; $0#hЋ4mq@{f  IFT3x())iڵS~&j⵳w]ww1bĈ_}߾}~ҥK~w&''w,WHT3x= /_bşիWx׎?n0zi6M6_)i tʇz{O>䓾Df z7V@mZ} ӧj=tPGWf0_tMܾ}ɓ'o>`nAT3~a~̙ӦMkvs> 0#hKK۷w}-67n۶mS~A 4ޥK. `F;w߽~׭[gX:$_Gc .}Ȑ!^xW_}}\sf 0ٳj*疉'6lmjFk׮eee&Iu!^z&jY)9QYYzҬViնf z[jޭn&gϞ:gOZ]H-DFFڵ+.....nw~Ó6o35wQA20`۷oNN[]O9rȑ#}RZA~5w@;܉ 4GPs;QA201@%Ýf zNǐA^`ѤA^5w@/;I `FAf EKIDATf zNZ3jp'R@/;I%#h ,#hT; `V Af zN1`FX4F5w@/; %#h,0#hЋw4EPs;i"Ýc@hV@/;I `FA0+`ЅwҎ3 \3]jp'0Y.5w P jp@"Ec JPs;i"Ýc@/; < t!79bXL&dX,eeeܶm۸qzѵkM6.%%l6l6f6SSS=s7xcxxxRRRvvk;KQ2 ༼-N駟|\sG`Mxx8#h~Mǐ C߾}srrzӦE{ ur]4i_G(#h7;h70Gscp%,.ǀJX,#hoAw4w`o`.`X{;h7;h70Gsc0`X{ F{Cw4wѸ7\ƥ(R,#hoAw4w`o`.ǀcH]4{l0Ν;h'X4Xakh5p_IX`~.+` \_1` `Ak` E#5]4X`Xk` E#5]4X#h~.ǀ5`Xk 5h_ƥ(5p)J~.(5X4FAkr#G,d2LLc/֭[ ` 0&եfffsjjƼٳ租~"}c0Yu-[,99y̙ͿΜ9o]|=_ZZ|cXkBWWyyyVujUU*5^ZZe{UU*Fnۣ]ԨG.E0&4}#33+` 0&GEEXVWWX_L'> 5p%,~MhsOHH(..vRRRU` \ _Ҳ]dggGk =}ǃ>֩S&կ?#4'MTTT4{ln۳vܙ%VcAh4v### w{o;"-~w_8u*W2 }v㗧J9$9#/ځ.ch h~K.!\(h4w:BQWW ~_` h~4w8`@sc~h h~4wѸ_ ,+`]4/4w`]4Vځ_ ]4/ځ.`Yu1`^__/ :sLPPB_ԩSSS*~֫W166Vu!ZAsƅT]EqzE~._G Q #Ec 4w`\(4w8 E.ǀq8 hq8 4w`\(FЀJXq)J\ݻr 4L au%+`\s9ĸ?կ ]4{ݰa*hw۶m;qBqh98 ?y7.0Sh#P]8Fk׮eeeA vӧO.^\\<`Յt\")((HuE1L jOn6{lzy/ `0L9rbL&dXTW.E hڴi/V]`0Fեfffsjjj}}t$,@?:uzg̘a ""b֭_$`Ř?={VZ2qaÆM>}hs K.!!! ;vX,5k֤Z:.agZ]X\U0nuy睊WF"Rz#66$66ֹbȐ!{@pΝϜ9yX:֭[ GçL /Ku-?DnvSSSr˩Sgk׮~u躥1$$;BYŐ9A(WU^C1~Q^C1~QG0NHH(..vRRRZ%;;;==]U=*xҤIEEEg϶v=++kΝ~@Qdž)bUAX=Mǀ O  ũ-x#z(b.bUAX= xC1$(33Su [nQ]oDcVxC1PLI)N(@ 0 (@ 0 (@#GX,d2,KYYb[nFQaa۶mƍѣG׮]7mڤoׯ_HHH>}F+ǩbj,455-Z(!!!44tРA֭SUb4CBBTs%K{nݺvj6,YryU|G7pCXXXtt>XYYgntz/8555555O:_~oQ^ #GرԩSybbeTx}9sǵ^?AU=͚nիW}jʔ)8sݻnj7ǫz'x?y'NlݺuСO+VTUUUUU_ӧ}VF֓] ͛7a-&LXpzw{kqqqu릶z,8³_y啟"##>ÑJW\^d+qWlOv8ugZ]X\U1w\Ѐ ࠠ |W˖-[dy뭷x UxPaaa`0ڵ+--u˝wޙ$dXg[w^Ue˖A`0N8||zԩjhhhZ+WTU^z{„ SUg}VWW7bĈQF}駪iaO>~۷oݶm}7m4%<VNtOV4[CBBT$꽮꫷mۦ ׿zsTUc+po۶l={/TҥK#111۷oWR/ٳ khjj;vcǎu=KÇw\XBIs#';8;o UիWg֬YJ شi]_Λp8.]z+y`#rb\=sQ[ß+"''ܢ+b w;?~+W }%ZϞ=+**\KU=NBzѣG?cՅTXXx+y[Y***"""C- O<6 gϞ}՞~+سg?/WUO K.4i* =٧_'O/++թKTsȐ!k֬Q[mݶiӦƣGXK/U3oVJJʆ :ս{={()nhqdQW[hѢ>n7/^;/hllo>U8cǎM0!**K._|58_>99[nݺu֭[kLJ\s5 ,8/]щɮc.~U8 0 (@ 0 (@ 0 (@ 0 (@ F_` h)**իo tV]߭_oV] h`;-ڶm[\\ZD`ܹv? 0b4SRRһwo7|}T,V~h-O:u͚57tꢀ giii֭7nƍU N 7G3ѣO=rA 0 (@  Қ7 oNIENDB`gsl-2.6/doc/images/rand-logistic.png0000644016036000116100000005045213373111455014356 00000000000000PNG  IHDRKbKGD IDATxy TQ!T-Z\dͤRREکj![$nhQ*K[M!kY*RpnIy>qf朧ysju @  @ 0(`P@  @ 0(`P@  @ 6J ʎ=ݻw|Bo_ uX,*++{Ν;utt.\@$ ݶi,t$ @ׇ-nr%/_7nݻw9= l=`  kh\\ĤVXQVVbGGGeeeQQQqqq]z {ZhsZ{РA^^^ S^^nkk+++d²˗KIIM8111&q?\@@v[p ڤ_G???ǏgΜxi)))222;pyŌ3333|:~maIVV7o***>|8}VOJJRRRjg%K|1sz{{z{{fdd47LJ sZZZIIݻw;@ 0@5SӧO?tP%033z޼yݶmۏӥK,^ٹ=EDDgOc0nnnruu]pa3ZRͿ c˖- 6lX"jڨ۷ovvv%YYY _ʾy?vСC-[ݻla\jjj{򗖖3۷o4Ѱ[/==]NNT-)7ZPP !!(sGKdee\G^PPЧO?p%KZ0ӧO{nGvFff|;իG[O~人{`0~ƏJHHd`?YYK{YTnnnGKckk_nZJJky[ˆ #((̣>|[iiw^TTѷo߶$v9w@/`?&xɕ+WLfϟoh``VU?&<ma7oO pYYٴGUZZdccf{|$"FE{ҥ!C 2i/^;VDDG666 "22\RRs߸qcQQQC;vY,۷oϟ/---((8hРs5_HHHZZaV FII ?ʂ}quuixmj=G aZn޼KA:8 @ӣ}ޞt(zUmm HJ!hP@  @ 0(`P@ mnnޭ[nݺ왏?VTT;vlpp0QZ\RRbddd2LqYYYOѹ~zIIIBB۷nJqf{ن% ,:t]K^[XXȱB=PKKK,--CBBZrAA;r {д/JJJ ~eaarJh/*--lXR]]ݥKʟD@@qƅc'EKUUUTUU ?~ wuu6Ps/m̚E=`YYxYYن%yyy:::-yyddE۶u-@15M5^—s {д'OxԩS[r {д-[Ý;wر~'4r5a„ߟ:uݝDpiwΝ;Ϟ=SPPPPP}XOvrrSSS2dHXXXppĉ) rm z|7 @  UVu޽(`h *q׬YӵkWEEEGGNJ ҉ <8777222++Օt"ZO+,,ȨAU?~*G%A@{UTT #++MYfݺu***bbb"""m㓏J3;qb@C.\xI޽}MG[{  /;wS?'[.///??޽508pPWW0`@RRw{-0黯zk%5@  @ 0(`h( iiiqqq==˗/N0%ѣnjsee˖}ښt.'80U||Yzz:T8 ޿f͚]***:::VTT{i>>ټy(B R(`a{7}6Ç>ӧ$ :o}VR(`^_644vIgaN6MYYy߾}&_+..9s]о cǎO&v7bXfffz:x ,`ddt----YZ { w"{>>>EEEv=`:ߟ={ӧO{M:K>|pEAZ{S_~]pch۾ 3;;㤃v=`.sΕ!Gu}YZs[PPP|||ll, biiy}\ ]&`EnnNhh!CHgiejjj``L: @`"J[L2d 999}&,AX=??͛7:}qww_hQuu5,$aW g2211144ܴi,CДB͞=[YYyǎQVV0"hL)0ܵk֭[O~h.] pU\\bŊcǎqu25kTTTuʕ|KKKA **aA''{ޥG?x₂PA8 @_Oٳ) رMjkkIg,0MܹtMw/JJJjk5448 #ӯ_nkkK:}IJJZYY`%4*--lXR]]ݥK_1[0P -gUUU =39uqqh s4zjANJJjҥ ޞt7%%'O׏t5 R(``#Fdddt҅t޴yÇL)0ŸI:ˀ^z%''G: 0P^߿JKKѣ,NTTt׮]OAS  PWWKe8-''GGG'##C\\t(`Jۗt7| 6L)0Ѯ]^~'M{v\ׯ'_hiiFPﯥ;Ri{A,?0XcbǏԩSDD [ Գǘs?0xzz:88 ԛ3gNrr/Hh #bbbRSS-,,HGBBB֭ۻw/ 6MeH~Ç_n |XQQɓ'JJJwuBC;}vذao޼ڴiSYYnS i=zضm |Ǐjjj)))RRRCS  Ğ={-[֧O܄ L)0֭[9B:0RRRF[Y[)6+++STTVQQ! c&LXr% 04w8}ȑ#ѾaÆ}Ց=0۰Xۓ3r=z\ztʕ+]t9r$ ^^^S| 6^^^ gffĐ(`xYvv̙3Iuiڵ}Qg_v- L mː(ܓT^^)PBCkueΝO}ASS3--G7!Vwyy~~>a2FFFs՟c0JAAʫWHgXYY)**7!0ǻw-[&//`hh6zhyyykkwq"177GҟCI`0QTT211i ׯ-4cZ~ɻw8tiӦ._t-,,bbb~־ cĉ111-F6l̔@kX,/f"zzzSN%n@G{[3Sg͚U?¹sr&ܓ\g̙u+**jii={a͛7 e=}433sOr)C:~ⅵܾ}8wQusfffFFFk֬!Z_~WVV&[ IDAT9`Oijj /Yth 11˗L0ՊAXRRR <<!8 spp$%''dEpff˗/ڗ`;ٳg@s_~=}43a„cǎ| zM04=%%ӤǛfdd 4h{hiiihhdɒ_\VV0={vРAڤlذg r֭=͛C L0aXܓ1 &ill}xbASDEEW^{nA_z5rHeeo߾EGGĈݻw]VDDtիWdee{&&&&Mmpׯ_d6bp{!CӻwN: pCuu7 @#$yFVV¼<%%RNd" ^Z\\|Ν}ASS3%%EJJt 6E*? # //?s̃|lffv;wܜ3hdٳ' @7>|t}޳.--8py?|ǏRb8 c%%%Y:f9r$8 HZxPPo޽ϟ?ǭrMLLyzz ,@&  FeeRxx&,@ &̙3w{8ɓ'uuuѾyΝ/C4zϞ=6m"=ztϞ=/^H:20@ F:SQ9(`ڵ? H8q+WH%%%GM:憝`0X;wnݺt oڴioBGHHиqHIބ-[dfˋ&x n޼YTT4uTA.:v舝`0l߾}:g…Ϟ=#x >h A^mF:Lz͟-Zh"Av*++%]]]Yj ϟO:БÎ;H]&`/\pŤPӦM+**bX_~޽{zzO߿xn pڵVWWW[[˫𫨨PVV B: P # ܿɒ%_ԩ,Q^^~7oTTTyǧUVV&$$wСk׮ @+**[MMMmmOHHHm4QQsqbP_9զmܸo߾;wլPYYYYY9lذ'^tߵk͛ػZ8U%%%ZZZl\9s޽hѢe˖ߟkv>vػrӧX9`JyՎ;Ϝ9&&&*++ w I;66vڴi]3 R(`TTT4`*))f֬YAX1cƌoVV}=zkpss۳gϷoؘ x }}}l҆ײX1cL0Cxn޼ٯ_?O>a 455`{6a(` [lYbE^Z‹/jjjnݺu MOիWpppttt^^jfھ}ѣGsrrxNv6yLBB¸qRRRuʎ;>~XSSӆ s~~ٞ AX77nw>}~ϟ?~< ׯy̤ILLLlmmIܾ}[]]t`URRbddd2Lq3C$.\(##*CWw^rrIV[[爋;;;;99QxM WOOo7o:th3v]\\W'|bmذa_;{{\ʂ9{իWZreJJ۷) ܋jiixeHH<:vhnn'dff\rРA:uLЌ :88lٲdlQAA۷;994M 811Q[[--$RyUUUmٲ]@@' 2DRR299yϞ='.ҡCssϟo۶3%%gϜ5kPPPtPiiiK>tRYY rxgtt˗_VWWKIIQ Atterr0,^|7  55w8tGӧOwpp ڋFAKHH4^˗=zw+...MaV[ZXX}J?~l#//`9z\\\%jjj݊ ) P.\غu+(((شiI޷dɒQFݻw`())-Z?$ 苦RSSsؿĉ'O>mq/`0233g766VPPhxw6Pܫ\]]ɓ>}&Z]]ʕ+?0A(`uִAٳӧ'''wڕth 0P\*''d4>X@ҥKeddvUWWW^^p* ]B1113g,**b06lEݸ8q"---::ZYYS?@^`iƏ/&&v'O`!YY 6_~wQSS;<90p/2L%%k۷ODDt4&ۧjjj^r#66t. ';s_[[+''W={nݺA6@3nݺemm$**J: aQ ]޽{ѣ  kiiO< @gyyySUU%Z O=y^vիW7n,@y͚5<ãT@ h*##cΜ93glf2[[Cuܙlmf͚=ѣ?8p]]ـb8&?s̺u윕g L6-!!ABBgωvtt}ٲBQДBG]]'100?~P _|>{!,/!W^uЖ'/^WY㰫'Nî\a͚576;!!!mg`%##ɓDiiy8~ɓsnTWWVy(`h+W֬Yېȑ#gϞ͹MГ ֮][mb׮]ǎ;t萶vXXD:p|--ŋJHHpnC=&LSSi޼yQQQĘ1c|xҤI/0PYӧOΝ#fee)++;::~0GDDСC]\\:ut^FFU``87TnTAA!>>LUUu˖-p |{ʕ+nnnTnB__jժUTn+ݻ̌Mgee7nΜ9o&pR|[;v~Ӌ-;s  O<:ujtt ,瀁 222D+>>~bذaSN-**"؃OwǷ{Dܼysŏ=۷/,tgkkue:̛/!!yB{6qqqg&`0233---Ѿ-۷m۶`0RUU"+˗/g̘ajj:|pqeeefff6m5j,APPܹs'O %z̙K.)++9rt".cMC &Lptt!QWW7k֬nݺ:ut.)Sܸq&ӵ>}:z(O(hJd3Jaaa)qGݼy>Hppu=zD Ys!Tɓ'?~LH<55uڴiQQQbbb@[0 ͹u͛_.%%E: ۴iӠA,XPWWG:OcAuʕCّS/_?O: ;zhqq1m^yO>C;(`^b\]]h;Tffɓ>l``@: /vɓSRRHgio4|8%>ÃN:~Ν;֒R,655"M6m׮]ƍ ===]RRB:u0X|yddϟ?߹sgqZ!&&ƍ(QQQrccccc={t֖t"dgvrrr\w :t(**JVVt(Z^HGh5(/~:v;wHKKM㲝*#w_lٲeƌFFF<0UFFƞ={Ha30yeeeZZZ6664ƹ%O8ɍ;l̘1yyyK^zjժ$qLO>}¼%%%I'j[={޽{h_:puu;wwHgi;EEE??cNmDTz򥔔ѓb݋9'Z:x͛7HgiZ*LX(h]|ׯºwN:|p̄>}J:TUU͛7/;;ƍh_zZl޽{ǍǫE{9`/387SSӚP̶@gs9~)S]F: DGG+**ZYY=~tAs[~bbb=$%%E:`ϟ&~aҤI!!!VVV'N  jii@l'''ٓW&$$L4iՎ@+Λ7E@@tcX555lYaQ ~֭[ ,طoܹsIgVϟ:uqa}=|ΝSP꯿ZpŋѾ\JFF&22|ܸq<9~驥5k֬j҉PSSckk#Gm'""r9}}aÆ%$$C+V?O>K.!ZВK.9r$ODQaaٳI M: E>~гgϖ9`JͧM{;Ssss͛7sݝO9 瀉)(( SN7n۶m{EC>{ۓ'OS?QVVFPMKKKsuuUUU]d ,$XZZzzz޽{wΜ9֭[ZZZL&3::tb***|||z5wЪ*Λh[IDATm ZWZZڥK99Yf͛7oذa4sÇ8p@TTtח,Yboo'\~˗ .t޽{8L>?zI'''ŋɱ}ݻF:I! իڿۓ'OH2whkklٲ҉x UVVrJ;;={ 0jԨ8-"(``0wjiixt]?~|fff0+((^hӧ1,>>ݻwZZZn"G544LMMI 񱱱Yx1&)j?0z͔)S.]]N\`ĉ^޽ YwJJJaÆ9<+W>>>~~~z"[,Y,++cja3PŋSLY`U?~cF]tٵkǏ_z|AyYFFƜ9s&OmdddkkÇmmmLҩS'ҡm ҥK -ZjPV]]|ȑ%KX[[oC5 L)p\\ӧ455mllOˊ~ٳK,1cP} 8333(((00۷o/VTT$ *++CBBǏO:uΜ9cǎر#\  b ӧOf͚3gH=|```NN΂ ͇ BL)Rӧ˗/;w.66vf͚2e 6JJJ tRqqٳg͚5tP"Mp &̞=ԴsΔo߾7 P]ZSS3uԉ'wzڵgϞN4Ԕ;)šb߹sΝ;jjj&M4i\@aaa7nܐ366622=ztn890v%&&>xݻcǎ5223f$[6jkkcccܹsǏkii3fȑÇgVPj]SSHiiÇ3o߾l ***>|yXUU1c1SO)Ն;===&&&&&&66666VAAA_____X^^C9GUUU=wÇ?~ܳgϡC߽L)7o$&&~PUUUSSSGGdjjj^ܮ&--˗qqqEEE PSSSSSSVVVWW@SJXXx̘1******ݻ7fy%%%))) iii )))(` hsЁ+^vvynݺufnnC:@sxKJJLfVVVVV466.++# xX}bccϞ=۰dCk qtsBCC---/ !x/JJJ"xXPii`Ò.]TVVm8 88RnC8vdeeeeemm0 m6 xI||< |ԩm6 چhlmCڵ;w={s6/GA[V6F` dk+e‰r;CCCF` dk+dkfm0  0(`P@  @ 0(&t&)++'ǏǎL:Կ,,,._L:<|ժUݻwevvynݺufnnC:G1:n6F4*?RWW7~D2d+++|1hР?t.b0cƌ~iiӧO}}}I֭[h_Y\\}۷+++/] 3F4L ]B\p!QӻwN:bmذ۸8%%%yDJ//7^234ypXn6gIp;& ˗s}i׮]5;;d~tIHHTVV4422rrr?~|Ò7n޽S&og~7FAnZϞ=ϟL:[ZZ:uk׮ׯ_O\t&khhNASڍhii%%%åh3FM:q8͍NU^^o>/^q?v!o)ZQe˿6".\rMpb.vAqHYr!7 Sr3\,6ղbwg|9V^9/gnnKf0yiuuuH'Ju_WW/$"SŒb<QdޥSvo*{OBVUxzzzS躮oll'ukh4RYY9;;+/HKy"SIO*1]Sio5k2c@$),,fl&*5g6n~*>|>_#}ُ4$_)//E+ːL=KQpX|lFJ)BPuuuD>ɸf3U»ٮm6[#}L5 '''Wl󃨰2$7өsOwl^X[[kkkNi࠾^:imooj΢~כ| H)~Sgo{ڷAf_jb ]RRsO؈FX,///m\ͫ)T>==Ըa2sRd^TޛoU)8//h4K"Uu?88CPyWχ\A6Hv`0 ݞNÕSyoSdBS|_g@ @ 0(`P@ @ 0(`P@ fdddff&T tX,EӴ`0XVV& 5)..x>|҉ ֝ɤiY (**N޸\Djf6GGG].l* 'q@'`P@ @ >׍bIENDB`gsl-2.6/doc/images/rand-lognormal.png0000644016036000116100000005027013373111455014531 00000000000000PNG  IHDRKbKGD IDATxy\%E%ҩR(!B6Rf3]u+"W{]!$e}o_;M=>꣝׼?3tEjI P@  @ 0(`P@  @ 0(`P@  N'R'++5lذ-[dgg]/n ,P bXUUU;v(//xbVBenAXY, N5Zy9.Q=zdnnz-0谰A1 1hР7o|4>>~ CCCᆱjydq۶m{5119p@;Lӫ/_rUUU-RSSY,Vuu%KUTT/_мe˖)**[?~}}}wݜu+(((++5ƍOh>iJUUŋ544 [RRR]T[ḭva:<FTTZhhhaaaAAApp/؏t^^^kh-ڰaCZZZEEţGsܹF͝;̙3-sΙ3ɓiii ڹs9sN8QTT^o߾8q<##cڴi?o߾5449&Mc]]]QQQXXѣ[[Ok?Nf̘w޼{jii}Km60Cp=<<źg4mٲ_>}`0Z.߿?O>֖WWWnݺlSiiï-[̚5Kp{˿ϡ8Rzzz-0L}}}[>Ç*%%UQQ!''huu5hQB^4otz]]WmjjjyWZ;QSSry[[o&--s222V^}޽{4cĉ'eZOk?NsvR}}=ǵ555?Lva.:UUUeϤ-,, USSf?uСz{{Z?=r!5sm{xyyy{{ܹsʔ)܃\P\\?hjj^tqvvʪ۰a!ss+W444p^^^gO&߿VZZѳg=~?ӢE_e[<-Zr劽kZիW#GWSS[hQaalj9n=kzy{{̝;=&##4>|S]]]NN,))a?nll,))"4b cƌIHHh̀ccciii]]-[un϶x ݻk׮}5 Xp<<<x`TBviii~(%%eʔ).\ؾ}Ghv/i^]^^ÇL-[:$))ں++o߶ӧONOO?x𠜜\PP8bX@(19yHcmmf׮];z͛7ix'ˀ>|+({U222uV[[fq9::Klr޽'O?@KbVCݾ}}6}i4ڳg&NCǷ򚚚_TAAN1GY\u=ϽZ.9sw H>5KG:o&,,޾yl]]]˧IHH4668Zݻw&&& F^^C6ZZZ ZZZKmll|tyy\j9JHJII4iRPPPhJJJ-Gŋ666 F|ssF fff455[.ٳgڐ;v]v=\\\Z,''ฺɓ-m &|UPPPc\\r?WHhhhIOOյtrrjy :gر+W*͛G%//?a99ϟ޽= ֭['Zj׮]AAA?~h Z[[رcɒ%4СCϟ??rH/ݴiʌ3h4ڙ3g_x 3?'!-999˗/WWWwppXrO:uرM6?^UUuO%@q|ꕛ˽{Í^RTT2wNdddxxx(*****zxx|"555.5j`0cǎMLLYm ÿN,NwP,`Xv͛rʖ'rݼyѣk֬Yt Q54 ʦO^VVv==6aÆ5@='Nؐ"RP.((`_Pg)ſ}ŋǏk.% ÇPhc&$$8>A *wwI&mڴskPVV^z/^x~}=-%%uԩ_ɓ'Ϝ9s˖-5k\,4BCC_~Ó߿tt>|"PCVVիCCCyNMM|qƌ_ݯV\\B",|}}.]ڿޮ[naaaռ]9S?͚5{O>ʅ"Гd 9;w,[,11]dyaٟ>}vGb$ߩ.C_+Vؿ?ڗFIIIijjN4 ǢEDD888/i',[LQQ`ݺu555T aaaf0#At'N000pssV$%%fϞmnsNKKKC)))SL-,,p=z~I6.//ÇL&s˖-ӧONOO?x𠜜\PP8b1-gTWW˗meٲel@:k֬]v5?zqƱ;Iqqq>}ꎾSmݺ??!CP@HQ[N<-ʍpmm픔%-..ٳ'~'޲eK߾}'[HJJv:LGߩTUU?|r544 yuyf*ڃ ;J@f'<<`5򜜜l2k,* ࢣ曰0{{慲_͜hllqz'YjջwMLL FMM|m:N%--]^^r6IuuJmm-5n!Ο?onnNqh4mm[n >G$I&l_ݞ\x1::W^쿦|dwfvvQ󒬬dL\{]r%M^pa֬Y)))Dܱcڵk_=r5jp\]]rzɖy \\\[.9}t˟k]>-aDDD655pqSSӒ={8>mmSN}޽{͓ͯ\d///oo\;wN2+6_ejjjw?wG=1bu V͘1# t ֲeƏ@ qzMQQQ^^޽{y{{̝;6\qymllQ ;vlbbbG=HO';̂"cc>AsNIM KO0xh4)) .\~ԩS@N81o<)03:tׯ;88@)ȋ/ B:_ӦM,",pΞ=%hG5k 8CMMM<۷/\4669&"8-."""}i4ٳg>Y X?N*mmYf pR{Oo֭߿w%"³gtuu}i4ƍA XܺukܸqSMBB"88844֭[+y Hh   Pdѭ hѢٳg`N@ 7oIHӿȦMjjjOA0݋ǓN1˗/Ig2 /C޽{zz7nZ*..NIIteH"ٳgؾ4m„ G^p! ,ݻ7j():oɧO&@h?3zh):ONN̙3k׮ @80.**244铴4eݻw_|9""BRRt9`QvaÆ {hUVܹt!&/""bS{&@С{СCI={8pǧtsPyϢtt޼yG!pXd=yQڗF<|0,,t&ɓ'ΤS8yŋ IgP(`"""DpKNNNsZsPvW^?`s4hвe͛G: @'hzeE}i4LppO?N: A=p@)|ƍfjll$@Iz⅃b eeeA s@9={FEEQ-rssmmm]&}I8,E}i4̙S]]M: @#ǟM6v 01S4- ~ LXi4ѣGΝ[ZZJ: yX,!At ADMjj/F۹s˗/ϟ?O:a(`2lmmI @AA!44tŊYYYBΎt 2lmm/_>o<q&ClGl6lۿ? `bRSS5551p[ZZ*L)銊ܾ4uuu& ..NlO4|]]ݭ[@ 1?ґ#G_xA:P[[[N!zSUUE: 0 ~OիӧO 2{lq!AIXBn߾} AZ||N'D())/ZthaaA:qrrH jVVVS_d8qt*)Э ߿O: a4Ԥȏݻw_zÇ,LOOO%%%%%%OOO^GrvHZZڗUVIKKܹt1b-d2_E퐤$NBBԩS{쉋#;6hР7nܸ!00tz]~Ht9s&n"L@ 8,,ǧk׮+(>}֬YC:h'%%}5U۷\^ңGiiimmmoow9`'{Ԕt pw^~t勚Z%ŭ=ĉ/^,//򥽽a^~bRRRK:pPTT ^x1n"I@/Cn^R__߭[׮]}6mٲC-E؆ ޾}{UA@LeH_ws1y63';/;;"[.IHH033ksX%##s_~a'>>VVV֭#g}ݻwƌt "8C3fpttI<0X,VZZ bccO:E:@'`0I ϟ_n]JJ ,W//v~G@ASǟ駟H00w B48qڵk`:(`*` 49s$PTბ"kРA?Igh/|vSSSn݊yN rww777Ig/cbjjjh_O>w\xx8,>N!CBBϟC: @P|ҥKHgh PTZ~/B:@P|Dppphh7HgwSLCCܹs ,HOO'U(`C>}H/===Ig së|“Ax{{3GB  9# IDAT+&ȑ#O< !0 ֭ŋW^Y/L&bݞeee0}wޤS3g9r٘_(`Aw۷_(`#BIKK;wȑ# ^M:gX  ]_t=<< HgːR~~W@ 4觟~6mZMM ,(`~b2SZpҥ ,?ÇNtQ@ ʕ+NNNΤP088o$ p5jڵk=<߾}K: 00L 0aBAA, FPK:˴i|||&MTePA.7o600ePp遁?~'fA &a yyW8hڴi_0Fڗ/_^lY||<, P|QWWWTTM:t؀>|a夃hB XHII]pٳg{!DEVV UaaaH/0׮][xӧOIg ܅Cڞ;wn @!b\\\v=qD\ sWZZ*!!D:𒷷w^^[dd28 0= E?0bZY@Q400`0 D:999={$b .ķ@Z .9so޼waÆ,X #`&))yY&t@[ ///o``{cr|Bxx5k222:~~~TVV6|pOOύ7F~Zh477oA<%%;w߿tV΂>uT/VPPh Xhjj޺ukСSN%.C=ӧϭ[F:rHq@ȴ}ԩS Z˗3f'ի@++K.y{{?t2mUHHHw3VWW'(2dȐӧO{xxǓ¤]^z`mm={_ ]󖖖6nܸ4FX}%x,lll^x1|#FXZZ>zH۷pY|w2!gK.7oѣ?L:  8q߉';f̘͛7SO$1~of_|!Zׯ_O0yȑ#_|` #`ضmۈ#Ǝ[ZZJ: .~Mj]foo!{{{FvڧO޹sGQQt<³0h4aii^UUE: V xܹmqTUU͝;בXccOzA:G>ܻwoq@ZΝw^kO{sL(II@hǏ޽ 0Z?~a>ݻC9;;4SZ!ӧ***HƹO>9sÇ^F޽Eǝ>vѰ0GԴx└[nu֍tM,h:9wGaR-rssqHBBѣƍñh߿㣣#--㓞d瀁 :~33QF>Yv'&&2ɓ'eeeO<122rttLJJ pAwk\\\ H>=v/_}ݾ};<<و'Oߟ@lݺ5$$ݻzzz7$'a1t-- +++Nn--ݻ<}ݻ޽{@Wm2BVVryyy^nuuupXrݻwK:Ps'OpW ϟ?ɟH*??_KKKBˡ.\xYjm۷hѢR///@ Na0cƌ|#8@m6"bw˗/5k։'ƏO: 7`? F`'OL~~>:!""-;;{ӦMaϠLLL={vիWC NKKÇͫ'3(` ݽt0ϠW ƕ+W윝M: 7>}PHJJ:t1!!t=̂b%%%iiiA@^ZWWw/^tvv&x #`gSN2ܹs/a(`WWﻻ/9>y |eaauΝӧWWW< W!NGS陙999;ǧxBYYYIIwޭݾ[YY=IHH}򥲲2##dr,ϟ?{xxhjjѣ{zzzЏFž={N:gΜ{߾}  KpX@iii[WWAJm))cǎj-ji>}Sk|رc={U.rtt| ,--&OL:!hƍG w$1WRRŋgϞ-[LCCt߷o_VVҊ&kϞ=[`A߾}zE:EpZ@aokHHH~~SSSD|ѣG61{lCCCccccccggg ⱱ¿֭[-Z/ 9h;vTVVn߾ߑ֣G444$$p>++Ç߿Yv-ǧ۷o.\())_oC)ݽj*+W;hKKK"DDZhjj:r䈟ŋ7l ''0F]C]%**tѱ`1cƔ0LoBBBbɒ%_~{x 03bĈM6;艋sww8q3 #}f's˗4hΝ={yNpR/^iN`X, KP}}}JJʛ7o1ctnUUUU׏?rJ PjLNN c֬YSUUeeeefffii^߿_bܿ+!Q}}}YY œ'O<==ϟ?O:t޴i_~q>}$''L##[nرcѢESN̤2'v~͵ɡ paXn/,,\z̙3uF: VZzfBq2__߱cǒAEEuee_5nܸ{r|ӧOwQVVFqH*;OlG,fffո:DWWAAAxK&qƞ={S8yu[rett @: %gggϞ]|yҥ{ޱc]41%%`p\IYYE9h7[[@[[[ " B e?q֭[onddΞ=;,,lvvv b  Bw

    UVW'Y{;& WPW L 0CKulf޶ͬӯNMe}߾ ?/͚VWe@_8b߾HIt2?9e2 V]U`3z8r~-ֵ2&ᇫ11wjm boa:q?gu&6'ǜ;^Y)K۷-ʈ7f!̙G Ժc2)&J@ONx[Rc2܉VNsW1 1Դs)U311Aיq%nj`j]խ[ܫ>dzfVTG"ud q3To|\gqqu`bG4c[t#nN5E? Y\ u4ENTSK V0x Q6YzSH ScyS͘jqc5k,ǸSKSʕ-Oŋ)ݻߪQmjJ}~ziSuV{ֺ| eu; 9b+#_ZƍW׋Ѷm8݃;vMY譧q̞4yǰ}׫Tti]>L?I;7@U/ueFs,Nlߟ:~K튳%=@{<1S83*aV*M3VVsRWE|}nm+X?!`q0!2/'حDc[]]1N:fČ;YY]eG4*1ӓ/Խ*YˏDc[$NeeM*(1,>Nj'UYb OvfJc[]s 3X~Q|P_Яn*6K鼐4/<]L(ɱV0aKw˼1hXprA X'!|5N6?z$a.Iا‰Y(֭L!TxqxxxV. X2(((F ?o_͟䟿hF4:vc{]]Z.OT*Ց11WX(łO;+čשKJ2&%}2\#:)Ԣsɫj5hsp,F TgΈ:uR;?Ԩ>;LT*7`^ L\T,+Pқ J'mj׀ji9@QSҕ5~y}+;ny-)Y%ޏ}Ne|$3 Pf ̝L߉ 7q8[gm8fmOh8\xz=P8}z~gҔL1;80s ,_\9ɖ'YYb֬~(RHH0Z訞=BB QQ͛CsrqQ^tWzS.4ώT*j&!3.^ipG*w'YYR5lh}IHN6/7#ءbEYѤ$cRgSSW( fnn갰 >7:ferFD-ԩߡ!1qzt1u'Xf0 < 8Rkr*aLe { f^t?8UrIKe>04\a16U^RvtNESo2cea58YfG ~NLd&%Ṕp3=g}=CZL=$vLq{q BN Qo?rxFͩ*cbiB2~b\iu12SlXID\A<Ø *ꈪ9VlJ?Ly.*&;27+ 8S0%M2/YG z`LQXq[$^O*Ƿ' >QSjay:1oy}cZ?XiYfC1l=GnFLL<T&Sl9F͂ `+е ̖)oe.к*ol^y`tIUnrHӁ:XuծtBܹa}}{σ3Mн{T4x)4}Az)+fMwWWsuvv֦̈>4}TAsۖ YY}z 99o]ZcZj6EGTǻl٢?ShT*Nѹ&cGVԨe D$2e´ݭ[ϰ.$0i qVQ_a0q~&6Y,6:ym|VdZW`co}@7BZVݏ;1G鼋+yZW,fLIsfI!ė #,\s=g:xfxqnhLM`C]czujg}I_@| W>?ݳnݶ՚8x8؂gLcjmLai (ԇ^G;M|T,>`v12ު:{4?&RXxw+L3_2.H=MXWΪZ;;g󹯲2 ?`9~3S갨-uB=<'\[]=/ QpjXԕȌ ^ˑx2 []'qsb$Ft~9¬M:8*Xyu!8s&NV PFa/Iɓoq*͚6>z;:#6xɛ7]͑ͤfNh4갰N5j0pN-GE"N'ZtpGQchӍAլYMu#,Gik .d7\Qrrrt|zffQME#hO-S`If&s.z>pclX \dwaU\¡# JQk[QcłE4At8u~7~or} {k.eSߎV|*~Cm` $ Fd?rPPLPk`c6>]U\\ѕQąFջƽhjӴ4bk.`n^aOmutϸHLKm|CY3K%K^- z%'&SƱho"^Gڷ~/Wׯg5lV[,,W?6iF^Фɵ5| _:fW?vpԯ$\XCݻ=٩>|ټ9Ըe ~~?jOX63SwHO5-RD9q"oMKKYVu֬q &}[Xu_yg v/ԡ˶ l,q.z5Y?nLi<7MY߇EKOL9ć4B[s&4R^RjFl͔X( M/|HQI~jDOrt.HG`SyUQE7%d1׍c^T&,1̉!SLDC낟9s?].*g-ǨCCLFp嫋;ը+>ӫG-h!ʻ(/܇boFV/|Z ` j"늼#u(.$s(GkUٹbj.)pՑ,jƲ1-N'qv<ےL)"ή.'Q6ۢRMYSV] nS̚9Y[C#ʋdFT@[URJo`#VbԀ}$v}=8J;sd$ϮtzV`.hYaW'n2v%zzI+`O^EWoQ" o7T#r9ϫzY"e}{/ys,ЪU!Qvll*Ů_,FߦͧOSmnLٳﹺZ$Ɨn[?>ff&[&&6 ? -Z~`Qrϰ FLPꗣM5&vglD߹ԯD iv CfR'QMxT ~ǘtn/bФ.!Νest:&Yww.{Z]ۚ5vrst4-_zr"NJg; l^H2x"`UEX޺hܲZ&\mNlmTTƉ-۴)AʁQi16VuH= ܿuTݻy~ec#Z,-Ͱ`HqQC``Aeeɠ|dBfD&EwlIf+a/6Ҽk0c 'e i4(Cj61d/wwr`7lH D|d%,eC4&aq}t])92^[C#WN5Jb9ƦW8s KjN 7X)4dL-&O*ZNͼFD&ыV2Ng3(hmrskOUpv%Cxx2e#ZdQ9zib .XcW:5ixEs$l^,*ɮP7)b ?gWosyjO[HSє=( Fwxma#24tUX2OdV1>CMeW7-7Ҷק2$vu>ݗr3IaW;g:=*cWw2$ήH8:qp+-ܽ;',L,o/B֮MNMջ}ɮ[ߧhU 8x0xBn]0c}9sCBjqkk۷]\,+UrruDrrnBBNN YrF&edEDrYvA1deZhif&KM5 BBU ̎S[X||̊bmZMVB<1RD;tjIJ%k4JJ%႟'nIju$&G~xaynѺ*FUY] WxǢ3$fP&*bG_K\F_ZE"{-M){ByBJ.hIY_:$($-$]Y6|NP*Hp8J(,69malKA&cA,,2[˖TIѱ4 3^탓2 .IM)!.4ľ\7 :6W]]2# !F;c@F9t烞XϙƖ]M3qSQǎ^xq;bK ֕WQks-op\A7t,F\f#,sTgz"^yei*ޒ$^i8pd$㛙V֜";85 kq )iLl19Ox7㱵N;A0z=`:2~I6jQDg ԩ6+>k$Y[+/vuqKzaӦJ|ڴ%K_YY),W؞kezm'OiddVII5eǎk92o22nn4+T0uEzٲ笭DhBRh^--Y^^%K&3gf,\٢syCY(]Z޽v>qT'=C;"5y~( Jw^shPM2o IJC-fbIcƟ1eYro1ɧyO < 26V_@o3KI;amJrʰb-A!A*J2[2?4HNf+m/0>P U͑*GjY ܾ#py%oƪj-#ҋ^Y.'S.n"8ᐖrn+cN3dzgk]Y\f҇g?2>9(Ig@T-B8Tc_NTJ6Ԧ4}/yT56*65O>ݏ>7"eR\MHҘs-7(h9:M-ps*ۦKĂm8ٳdZKeP/hݐk?|m229]D X0atiJeΜ~RKVxK&Nפ"ѩSI=Z޽j]~,|f߷2&2GL4J-UShNFF6'O:z``|>$ac٭⁞:gΥ~fO1HH`b}D;w*Lc,)Sl*Uʻ)h%Kõk-UJQZy֘1n_NȟiSxppj^۷7#_xv&ܹs<?k A_BB*V`+W/VN;9Vk8sfuWp~]{߸fay/OI1()ܽPjm3B6bdO( }yNg‘THb #{D]73f:WdH{z{0}'RXE}2 `2՘)ޖa p19ZoSG ZƗicҵ/S>lGӪ$+BIuk?Of]vRٙBg}f'% CKКX\xƦk=X֍ 1 1G(E(aT0Bl"~ \92Sٰᳰ0vWyzQs8UrBBK}=PRw}ϝXea?ٿmġCݺݮZMu5;yRm^m!X.KZq~ÇMK4Ɯ&L M9ү];FgFΘBB|Mš5s'0%,XLȬszIpo/K-ܲ%T)ř3"S =zWmOHIYN1 y?fpJ1Nin=eXu4q_ɇT"[F15*)'y7XՄ魱39Gg]I<-β4;5Sͅ&]`muNyQ6]HB"S_ &cjsգKP'M+4آ5YrcSm&NkrkecI6pKKu|ȝ4ɻoF:]a[[?߅`={ٿ?jJcHygϾ7vlU$&weuQX>OLL̘vNN"mv+1QA*UDʕ<~m[y %J$dd9Vw$?y"TS(x@wB1hЊ eoﱳ!0ÆcX xS;Ypg./c4VwxǴ#^.lL:\"G˦,B}Y45)]k`NV,f̯˨Ac[#YMeҧ$H2!@[g-N0(dL+B]3%] WUd;0AYHt5֑bkQpa,MnCz <ӓ$P ^ˉ3`-rSZNKF'p4lD{zsz%Dآ.3,1Yu#fCmzJglKYcL {64h(q鬼7ܙz&qi,8k+)VM_3q/+RҴx}QGGMӃ}[l|vΖQc}"W6_2e޽>\sg5 t)sRIDMЫWhŊ6Wm^LL7i(`6-X`֬0ꫂM4JEtBBZڵ3Q*_]Zo@.@HIQ7on,},((^e0ի) R)7n,RJPY0ϮJ)d<rNqqeeaeÇtw1ɨSʦXJ*x'kӍ>9s3 _Ӣݳ\NC?xr< юJE:ң:M}8$W&f j3wޡR/>댣QI:EiYl#e RJ\PJIBW9C _[(hU&P@W(*(@33 u;iIqlzg%+թΗU%9Nzۛ@!eUT|b9[0X$s| IDATY0ΜL1g*XIU_ 3,dXzG*s\NbP8ZD-#])y#-RA͖,h`G!ǚPOzWmPgZ ,hwwapePud~@Yrtb>2!;k@2s![͢,@!_gzFu*ovF'#6\6nC.v0zE6gJqcVtCdݗӧǏ;:*׬)b!|ybȐ+?m"^J+йs>-{h} m[VRJ%ONh$U*5;[7لpʔcng<ԩ}( g0Y9" /Εh"OJ2,!ܾXVe$.__mj*g*[0{<(Ok7TT;7>-efm37Q*(/cdڮ.孪#5 bBS2(f.^f,tu>kՌB*U)dmIJJgifdE8N/GI 6yƇTe\YsƄl^:SΉq\ݍbu>CYZPgL>H\23 ^&7n+S2gt;&ɴDz~\~/ °oX?WrCz|db"СM M._rr:u'Zw(޵q+WCB2T_mlGSٲ?O?u^6ƜAAjqvۯ`1+QoWr GGU /n}V3JQgfQO,ФI1#GŒ[lZJ% JUΪCDdG;(8r$::ʧOm|vrz̚b6V+'USJ{2wxNnīJ%HV! l?W>/lY?T΄-xlu>W}Fr}L/0F,`W۷qŋMvgĈr5o̙w}^n}߾f-,x>kVH~ŷo!j?HUDD/+}}_}t*ycI҄ "# ׯ;ԯи-VP/"ߊqJyEDgL0/'o2LeNBЗ3 r){|0=|7U"[:31f> @d:+!@"Oڇ߱*[ Tv'c}%OEt,~˒хeRl^Xz!y>*Mʔ0'{7TywRL&b#*9F*dGs+JN CD긘 PʌƖ(@>\*c&oKZ3(bEP +#.L-E T si&'@tef|*ߣR2Sbi3lж"ӦWDG%$+O 4ch 3r9[xPvd$E ʨ>,nB줸 iNХlTajLLO7\ШK81nŊġC6l M-kx8<-g3dO@5HJygrʃDӯDE>5+W $XZ``\zG+VtzX:P[:׬ilu ,]YxxIA''˷i#͚2%>00vmeDVy2gaO w.b;2ŹruEؾ^F#vT, 7F{CZ0^&K^Z=D:UKUWnϣ7p=eX&'cDŽ*LiL4E{~m0<%%'3d4t|ZG!5NYH3cS";AC%}|W\4v~zTOl`_&YT2 |cƖ4p1SY|8 PRome >4 ^&^)N3i̻laS少aiJRÜ[DabU#-o,8,6 Я*g)1ϳ2(F oY,;†sZ΀ }›heZ_&~#)^ޟ?cWN[ ;rlӬٲ0d]J?9cFFƪ+WDRSuupP^]bE֭qhذ`@@%?C-;ٿ M~ KXUOZشqˡC8hQg_~[]ɒ/Xm׮Qfye-{W/]rhPd3F!۶M33;ǻ4'l?ºX3i0l.+:Ѻv7{-׋_SR'GKJܙМfŴs$e!@",iEeiq\3 Ҩhp;N//%YQlY^rCJuǖ[S[:#KlX75;+Q0Cs;T)~wx dTPQߒrJ7@l \VDjMWʙRu,~ϊ8gKtv09zZ818$ī BTOYJg`ܡ;lnQΡ̾t*ҽ"jءճ-_nr?ڥ6؛̍:6]}>A99Ҫ]_bi6'$JeX2Bo(f(S2%ش }IƔ*! +n---XhZy<=|}6U",^xqbϞ?,cPZmXij}{qI}}СCѝ;>c+WLRyH_/{w'L0vPʕÇ[tgTCukk66D^q }buOV9c'z}$Z s֬:uT"۸(GzD*ԡTIZ5c<00ne蹘8FF5 ~˔u;b,-IŖePsz>@gm<# n,Br,9+oQQqoU{Ȑ eyϐ ,o,'Y͸܈'*6nlM`ڿ<7{eۛ642i/Ae`]s;xӓíj 4.J!WjtNක&G=fT0 %eT&a Z-:"u湆*W)PƚV%nDǏrdyq=:FقLoIMc36Ʈ22ޘЋ_Ik?uЩm܌9s2;v8zTyV %J^XiSI:u:;Ifͮ_U 3j˶T׽JZDӯDv^ծ]6V=9~Nx{Ⴍ܌*!}.WLAbX7]FOPug0x%#)n1{ Õ=+ HNq)XOmݚsG++s^qg4jTplqȬ޽,-ֱ7>uݏ?>vp8z%__9X/4m !!C֛7ׯ|y'OziSС.]jgrԨGֽ7ʕdZ(:";M/_Μ?eLEwÆe˲8~I#rr([V!^3F|Y2)V7q`AjUb<*Wv&$p1*6MǸͤeRɓEmRAc]f%#-¤5Yu" KZ*2ӡ4*agz_f^mŘcʌ8CzӾ/ۥ'pڳOwIlgZ #5"2uS)Fz!f gbL ɔ+-SFַ|@o]rzܽ[t`\W/^pM %E[âE7mgyzؽ;ݻ_8xҥ'M?/63w_;JZܹ6&WEӑ.QbO[K NWJݺNǏ54:u&OG$5 Mw X:am99B҉..3;tyb'Ov7l(߱C!Ҩ-"i՜+%YN:Ar,?Jd\~%jcMrcU )~)T, Wk\y`&Gin,Xwcql@@`M{|)]#GG#wzhG/9@HW8]̲p+&i˰˶};oHx?Hw^\qA'8LAvvc 'EOL5ɰc+NGɁ49d %ű-!f#K?Oe` sҪ$gŢbOY~dX1j͂;x$\ Ҡ ;hr-dE4!ﰲO#uES۰xۛYK\ǔ,.< 1ԑ4;VPW*Eo5*#mhS"ىsƧ^25ذ!v͚s*H5kW~ػV23m۞y !4- kժWSxo~3_9 0/gͪ:o^>u^u+q߾Z=zg<{m<?m<" 矋(ӼsgN~e(=s2g ]vCyc&!$$OF߃=wϱ'XLl>OHfI.?3d2:bn/ʚ[hr=A <|GMOtiJZ=+LmOL~V,OhQpmӫ&]!hew:ݲIue">wvY‰u~b".K]آwHD']iio,r迎x-?p+Ki ѩ= f30w]|;TsJTe-tzx3Ҋi >¹0!N,{C29Kt~<ƍgyqTiϸ?2֌̄8' -f5ٸ]~hػ$͎1t/\ )#'hv\ٳi˖[e0e=[eKyNrڗ=j.<+>>^zo߾d_6**j.]6mj*7|hF?\[``.o7._o_?՝=h;@Ò=YUz9::*6nLы[~󍥗2,LobI/g D ܊~9Wt5qwg1*3VΤ]SGRR8q1SQY}LebG,U`*V,2k?RhMa`=l Zm֛5S062:{~ [BQ3 -8AlM k&wvZVZE7_i]><+tqFZ/]6iM q>!Ot+R֣B<v 3:NYDŸ;{G5Gp +ҷ4 T*I͈;I_{5dW1 &Wggkcj04{K6vfi|UJp ѪvS(_$~̙bWϫo:8ǍwdߍbYBqū0kQx0PZdOXܞ+;d.hpU˶?ӬLy#V5^ikPe(x;ILZKŽ{lu@2+2OK:ҾC냖c)jb!Q.42!aCPזe>8KGGŬ7cKZ Ys ?J[28Qҁe$CY~W%6Z.|(d^n(Z~>MdФ-k2F5IMY?.P^eÙ?SgKw5Z\ 2;&3 5X ]د9۰k0:cgTf1a?1󿶆;W0)Jໜ0;\9܎uU0yo6YQ=aWruMupiP؜e>(Ůڞˮ[ Z%k5? C.Ki_ɴ}IGlOyf۱Ó#egWLzI@a7;+J+_ 6G 6וdW:K$I9(&h7qfúڮ ]~ˢ.&+Ax]?2t߽NA0PA ;1QG F1;QAA ] 89s9ׇ Z{׾uvRsS ޜW>v%q6r:Ÿb< *:wq]v-Sͮqrdrey-lقgOQ@@//ɓbcqe~~ْ~%egi(gWﻠ$33Ebj*wgåKxyy~U{%X*?d@[)a 2V6/^d3ơ[7۷E"kΈZȷb:Ԭ];CMMk@u]32伄{j4j$ =z$- 9v49}Q6!~Ƃ34;2aPa;ZĦp=T|'0;oVѹB`!s|Ȓ4Lh i&l+!S9gy0`eBFvYl^ )ӏd~eJQƛ7Osʤ+J.Y2,&Nb#6ՔG<-s$.@:2xU̞4:b[RH!*:\EB#U*!É8y.0:訸E6/s/#-5#U$;܆Gmb)knzB;6InʪR6ߤ:JD{({k&黒po^Ec*rq;oZɥuTU䫴 K2[+j;t*ee ڊ:8=piiL.mJx\텭[k^m$ش)];éS-(g{|hdH[++}vVF.s']J$_ (..:pKŊlll/_tq]~^)-O&%|YJ+T8/uVMa¯92OEѲهSN P܋[)ߘ޽~x!*W_gJnR}nݲ]+<`Fۯ%k,, U0彈yIQƚ%_R)k2{-3KiƢ|!5sgwhţ6,JJPZKi A3D{g^L;a ]i'-pww*.=o¶moߖFF֭Z[[ &z~PkW-77!Ԓ^ji ϟwPA)> ʒn:RaC njckk`Fz=}Mfdd={vժUׯ_oР]XXDFM |,/~= ذ!aگy{w۷ӆ S-ҵkU[[BH$R$߁CҊMRI w[R,7733-+r ƌX.]CCQQr6kݽ[!a7Nc>6WK/u>Cz'Gz)B!~ЀKHf+F~}B,GWю1,.GKĻ ˑ@03d@j`űy=CjmRwg۳=.ADeGwT $Hu|xmߩk+WGe%G߲%l*oR֎&z9z81˖RROd9JOujQU m4R u-C eyZțbL4OJ42` M1-,i(P,VUN L!awIU 0PrbfA is293Yt3-F:JD,n4yԨN/:*=Ȯ2{L@u#34KaqDr;#}c'<,N[*UQ:)2z 0窏2v4+K`e%;tH!6(L;ݹ\v\Y%TĮ˗brv\^=s++?i&wR;|3//|r۶mJ|Gʕ'O3{k׮;^/9Pbgg`p;-M_ȑ8/G]Tv8;Z٥66bi|JT|Q(JrcǾn, @~5i׮Wy`1yvwy$$DֲX*]͖-P2~;Ui+dB 6TC:O82cW{*.`mJL-Տ= h:O)G ,ŕ(B=bUVe;^[8i{wG=Bn]*1ԁ5:U2HE!#\1qVZ4Ȗ5&(`5;Sjq֧- iaDGXMTL҇[&<$F,oL7JpYmsCO)35:at?-&M!1zj$oRْAmz} 8Ha1:ZXGn>3*{O<%1VCK*e ?$)gi&$D&vpZ%twW{t]J_ׯ{ljs#7={F5I֙3hҵk {9JFZNT(gIMM/((?nm{9%%aÆQxN-  }|꺻[~Ҋ}--ubbz* lz̙tKcνݸm‚}ܻt)ic+W>xШV-9t--M\F00FzrIZFF74?ϝ+YJګi [ًٹ u+5)3{4)xta$'Uw/> wxcyLB>!+XvBhɀlVg}k^$ҿ)K`Z$aӎ-q|M0RՖ}.ih6=iZr>|=! 1^`Ta!,u>ڣJ߮}U$%ŤxYL=!bh㠋HPW iR]!Uqԣ6ťY9K-ހnXR#4LB3c+JB ۟zds'rDZ. /숧 #>,iŁ4Ud 'tkV}+,f BH &Y?/#\)0ZGI]†p2- '%WHǎn߮0Xַoc [[OY2mC6meQQ͛ ɽuu33K&'*/R[`VNGO{Cgܹ޸qc͚5 d,c㠞=-j2pógNtWի^^U߁7Ϟq#둙vd…֭K1v6$eʴUҺw7>uJn]C%[K2t$-Mִ`9SB8rjv_BG|He2.ޢm3FoW?T[za_cʧJ lq44q``5.*(euӻ2¬+'- _} #NJr#zgZwF+ep 3q\KSgNCuRu\7޻"ݭ"߃wEleOlXfqEdddg`e6632J^,/.%%߿ߩeKWu>20HLleb"gnNIW)X %+KZfzVϼ{w3Γ'2WWTJ`f6 G~mAǶ\>O()efX#se0_3x\ "Q-s ɓP ٿMT o/vuxy ==~SS͚eT9cAII֭V}m:߻ݻ?8dp0((}԰Jt}}[+K YV&=v R`EzVm۶;wZ[[wa޼yj2eǜ`ǎ7mdHo??ZݢE޶{:q_||{[Pp_ҥOƍm 5_OYd ###ڵ dIIe/]ʜ93FC/}[Z Zի Dԭx6qobZ?|(:l*6GOT& 1k /f2<>+e Σ`8ըe#JE!Te0U ~p?j) *W2KO@ThyI5L\g-%i6Ll,ҖS&v,_vt:C`fŠ\<~$.\QQdfҴ86V6zpNe/3sf޽EZi]:a5k39sF?kvGOOi~z-S<|СtzZ?Kٟ?R?~WMN.˓Ѳ;ʺ(zVIr*tXJ/< ,jâħcmJj,LKNO{g!mhxPYM;Q"m9:]jErY<{ hf*0 }lh]LxH5C!kc8s]&aA0eh]ִZq?XPX~O(]F\s jxz._.ٳG&葦bNYV&P IDATsqɈYc4sBqiӒ7lHWR}q\%.TY??x-,sX1xM3M;#0S{))= ж!QU\Ïa\@^YN>y,w~DV闱.74k}0 ;& =TyIԴdxSfUV+U[D(`lf5g8 e>RQD*Ku5զ)1Zb'\2w8H#M+9 id7-]pOryMR хfRߘyXjϖ>t,\6d$2ܬܜFJ{^f!'#o`gf4SǕHY` Ԑ-P\&S\ܣDĘLU؛,?dtnȎ1ث2^r /R*+G3K9l<ʈ4ofn9|.zO#>{V6zXCM77emS98h)mOKjmٳg..gĒ&Mfg]+VT2ѣ;v43Fbk6  w@y _D#X={V.ꏋY[Dϟ_{<ν5*aC7{}Ť>;տGYAmV,k:OKΝ/$޽Ѫsܸ{߭^]T3flݚ8iR5kf={Vԯ_BZ8>\~}_~)l\_BŰaKd /Wvk ~Ql^nVB"ᗽr!:ڬHo)2r8S?D[ =["~I4y<{GV2jV/{뭤YgjVm'A@XyA/@&ؠQl4J̾B@ 8*~员/m3Ow\?HCM/Gj A:٥ Ώ,ggH p: !)䊐P>i@u=*`JTʌjdb $vtTf6KoP~YR2£.){82 Y8ٌÊӔѭ ?cPybEQ 4twSbPσO(-car6qqبR)Vbѕ_FCYb++yQ}Wcc%u 7mFgH޲%c([Οnݺq*_9:8ݽRŋM.C?_{WA-S]w{͛[<|IyJ05r@9qTћNa]:5/s])ޝ_h*8yZ߻Q#uv-"ŋeeIӥ'Ozz*ܑu WOnFǎ*ֽ?ۊveJ ?u,sALjOU)`9s>cUx ?#9lؘ3{I_+/$]XhtT_ʺմy do>û,қMQBFb OY䊍h^Y^GfcKgQ$wUfԥچ#eKNQ:k%hkAP&jϻ"Z.p0Z29OwSȊF+=OR9E#kTd];/^ 2hSi Q,e?3N!ҷ1L~);v8 _#1>%*]m&g揘N_f&޽ȀvY0*t 7s8x MM-ghU¸qm۔md2 5huG"ӧ55?Jݻ׸U+;bƍ Q^_ƍS֊q~~ڙ\ZZT${Ell?yܹAGޘP[ojs/3'MYqbwqqE{6quZ~UIU .\ ;QxxM3EK""**\<) ݿL!#zu8w#5<4>B&vC"%ct2&j/9_L[<1^`e~-PL2, ZRW;)pHPI(Lhj6j<#Jǣ#CTV^9IXˬz7^.k6=Z%ijS @i'$2" (CK@z6:S&g̜H̴;=jPUZT-~}0hjA=V7Yĩ(CKvub_*fM<5:ńL&Q,|WT1$Ѫ6Lp5Wcn{/h/LIf x`pPט3cttHdd+6UavU |^=eFnnJ05:_-+VMRhQ_^Fz{(,i]q ֟H+;N]Ѿك'Nӈ̻|YiӧiW`iYC[텀:u,Ҋ2ԭk2>קO-[U+@`j*ܷOdС5kj.Y䵼<<$..*J[N2nfh3^}uz=X-뗯W7^`MIf9jc&ާT١ggD;9z`?qJؕf;ewigVn^t5چ 벻/:N@ .9Bمųa؛WƝs_Nf+@KƆo׎h`|AC@Mܭidžn>.6ew}:ؑŎțO O54G3"B#۶MUM{|! p#_ddY4K`9|FlNz;Qg@:MÀjR٧_ VG(@\utZOq'ёN$*"gO`agx3qke*bFZ̪,kDL<k"Ϫ^4BH(@SȥN펻G|#2[!q83r>C}Og\5y@$9zONH}_N˝z]2n=+ K4,A9j@R, -fI~ _ hTwY̿kE$^̻Y0(L\wC(]>u`˙H+ r%^$ Ŵb]3ntbu ï'CmF;Ugb3|e R1U܎w%9+B7F&i3i<Kv"wpPM< 9=+{791v+֓BV #G*#Cg޿lܮVH|6LG\*"Xmژ6h`xVVdMAg=V۲cБZUtS>Wcnk^sd^o4T0<;5JMT~߱G}j|ne̹ IGӨ3]Ƴ;RY@m~zaIv@#Q{#_ߌ{Hi0ԁ\`{27?zdi1Y&SS4+ù =zS jK@g‡2|"h}T/lf#߫ H'Z7HQr.#03sܱTޏ$o3io.x7]a،7kZw͂{MPO\uWxǁhn} 4뷪v5WUZ&7 \~ϩXl xSAͷX0I fj,'XrA ,&7 - VcJge+72z5gzZ+kY7`P՚j6l->;"3wTf(F@KQDm%9wв⬴XNg,.NvF^ÇXX#"*(?}zY*ѾccK\wWX/*WVEצHlaH$MMaa-w7I.>sI8^kUh*:AA ::Ç;ׯo u<V+_YBoQuФU>5tt4W]>j}VǏ+֭M 628wN!k`H-wR4XPptɕ+LB[ H=AyO6<'ΪuW07edX2W1|7c9w]-DΝ#aU땰+Ik?v%1}dli*9Lצ]&UHHY-Zϝ,w\L&ׯB׮ʦ7S4==dW[k02rv-k~PݳwBf?*-,"^wj>'cG ,ly;jz;ACKǺ,øR8UYw'NDtfԨ'Ϟe7l\ŋM-gM ll]ktsfw΋hܩѪCs4?̹ Ckyr#L4}~3c 7]aQTXt[Ⱦ0O t{7+(NH%zA/K헮ѡs+v"{h^ñT rŭ&fua: &Cm6R$Rh5Wì+ױm ]1r/sѬmǀZj YfM{Ń4eAC SߌT1Jg /$6LD&P$9ϲ$2֡_5W(ab>6')0ejS:WS6^&cc&_XDL=_GXLF:j(^ȣ[c~Fo5Dl=½Z^X) 7Xhk̅!֟[Rn2qfѣ VaSNU۷K7NػV,f'' ~TpY%*>̌N*O>mZ{^<56ܸfF x HHI\pvJi.hPkfrMgcbdnnbAڂ={ʱ3:|qt -wN2qʏ)-J%bŘ+5һuÿ| h(~N}avT3=t̤fhĬ`5JdPFuUq2[n1 -H*Mf2ݏ˯fVP] &tWs?=E#Xٝ:=sv6xJ^ۂw;)i ]j\TYfs}ë|BGbc?ߴgr:u 40ЌsWƦN޸6+gxQF[[TB%n Jp 䉬S'qzM7cEPȲyLηx+YGaaaJLA?lARI_--"Z"VMCT-eϏf^AqvX֤6}{@clL5J*_BqQhSax6UN5jhoh' Je\zˤsF $^lB)]>H*Jv06_T'*7)gF}36J Aq'1 Ռ2$rWpWV_Gk"97GVylpl*5\ʘn-5 ]Jבq}iP!_A*\u,GoT^LmeNj!5K>WPTD+Wd66ӧnnj7Ju P> I$ _(ٰveÇG<ϧUn[˄ ~/q ^ v >Uq!q`бnv,d:}xK@cF );#~? <`0<@]QTgg^p05(,9Rc.igw+KJxݻ=4{WCӜHΒR2iiNO a;Gx<ɤ BnfMѣ9{tߴIK`2+Ν%Ʒ5ǏffEP)STQ[#7~cg>t(eÆ{{dIʅ _[!-qϥTn65U4,]*M^G^ƞ=MWϓ  \f>"J( idqҦu2r6M*FjkI\Z|Dfd=@]9vÊyzWGj(;CG(IL}3:xP/ҽlľB(CS[#_-B?5hJ3 y[|>Fr`o 7 <(s]큍 nh†8C C !G謨p9X3Ac-0a8YkU]sW5P8uqM$&66< b^>2[ۊ<^Loo9Im-${w֊SRݛyŋ;?/7){`a^*wovG6вsOww@++y™)HJ233kgl0`˗HϠήVGC2>|('kWWצ=3Tx{mjjS':}āL$Y,ڶmRbbg냂+ 6R<`2ȧb#L-M9 Jc]\؇kqt tBwIj/>ҙX [!UN1hԻ4N=hRm^[5IV0\:+j]:6?pަ9` Jkq<[Ok8ݖ<1J[1UUUDqS}0+8cE0?{mr}q0oI q3јuE0Rŭ9d)0f`a vNkas0i7=8 F9zxQl_멲c<+a=?%{s K~]U Lq5gpTDŽ7+p "W=2//_' cW+s_ܒF:vUU$&04>_30A@RRC~~ i++ѣrs33P I@\!3[Yun}'dN X,Y~~mR9S%uW^FIL~zeB0OccC,ZTUX"sڪ֖~&CL V6lh_sfF/͠55G+(x3Wa0XW̊zze/r<z ܃jm\,.=1C75(ީ*G.81\ D?wķ4aWӫN۸ކ}NNη;Ia9a`hA:F߅%\n9 S`QRc#逕}"Xf <2}۾ayrw;0BB^ `t TbLZS5Xb]<!i!7UE%vEp}HK!Яw'mo^4{{zh(SrzϏcG͈[TTHmVV%ÆIzyuu)p3gZY\o15UX ̬0@UZSG;,R^s(DEFF5L!9Wq ewf;C]@ELMU*}}@L1;,!ch4(IJ26LKգh]͍Ĉk I--m** ҙL8߸} =ƌCX H4xӔ 2- Ȕ2jlScܧY>d+Q=l6l+>4ŢH=^zNFʑ_)@]N{;0D#"˳?/$OQqaJJcc׮-΁TUǎDG7mXgJY3?|<ɟ5(= ,]7Xea>g ۪/-< s%L!J1hTm @l㽼%[mHb2$^44t #RA.Xb~.ggn9k%S`#^L 7&C#<^Qks B$<0UlJ~0v}K'_ {q'+U`;XkSow& 89Am;=,36@z;#<|}:T`/: ٳbbt%VT3fh߽k% StPfWwC(%Y'LВyRgE/KY(=;%Lb⢤)RY}0AtJI.ؿ@KO1)ɉ[ԡYvBz<MO`J])#k=5~Q8t橴>erudFѩ?&LtQŻ4l: gOTh4,[ѣ+R6_Wh1s ][b PeI0PABvb/JZo3no VAM 3Ϡ~ ݩxWcp I~IxW 9QRA |^?LэrS 9QHt% \UcYg+v2h.{|~<>n0 ce>xX8Mp/a .^=BصXWec"$-1n7RS ;;޽<VV@F;56Ԥq;wfS~nݪHJj,(_O/KCv6[TIj.$:b:IZXtX:%0;<6 h4ړ'5'~16s_@@Mb߾RqqO87>-mnio>06R]߾y(JxiQŗc` #^w`VSs]BYZ$p8|C'ލ[X,cH|}fQQaKJ {w6X*)ۭ=f$&?__r~ z&W &6;V2JLfI0iL*hvtT˕TPۀWRk1YU3M8tA/ \-wWHQ|dEaض!Zݤ8j(HIAT.* i*ЖCEhBSjЖ㧣]Ո!%u/R0+)" St&aՕRGWa|)Gtfª!LV3NK)wæv@Q%fDD",zb@8[r1ĀF.q[=&b%P' b'^<4:kWpnq<ՕgheevqpõRRt޽<Ԫ*ޝ;]'O&quvN;~s'9%Kwm@n>m\^KL{櫨D>%kXՕ+YZU8uk;)4k >Y!U fVG.=06\CIZD\R*f~]$m\3Ҫ*iYGG c1u*7&PUŹsLk_z8p y[lϬљ_jRԌwcsJ4nDjd#G*.'J#? et&\4+3Ë$ia΁s<[~:X?vB0o ׬,(epdz4h+@}A)+DH*PC9&1tŒ ! :KC s !C98alV ƚ±/0;Mh(E &dU.~Xy0gJh<+a6,브o!re%8-%PHH ݸAXɐ#,[έTWg=+3~<>nnXZJv;KK9zz/*+ f=zubbcn8|8y#TU/33uN:?`Oع#$7mj=ts˼uh 77''O 6nLezզWGߠ0_4hۯ܌/\H:UA߼X<˗C?1JW.Kmuk$$SR4iǍ6={8bUF,_KN&b~͞옲D+%|SL&.0h>y(Dzj 8qQxbh82D!8u;%zǦ7kj= wR4Rfk z>!E/BA| \XGBVCSz ,c%)B%b}ʃF '&+K+ L0Pǁ` ͛ *oW@M&켈7auE\ %jM"nƻd XvJ%DD#(}QYM1W~C}=72qسNٶ_c۷ eK:ahH=ݿ9?mʉB;^|P%?Tr_ צ`A"#ޝaIzz^\WWyVb).{]]]ܹz"18z% :z"~qoȷ30LK >rӧe66ϟ13fTΛ'*y`;ktDGwl%Ee<.{j@ ݤnOs} ]U$Om|fQ}gn ?c (k Vx9L !- EĹX}d-8ГaZ,"h/?+zt6 %gr>$E8Z4bj ߪӭ`#+*Ȩ MXt cH84C(`AI c{XuOV$h4l9$ ` 6ClG)W^ rb,HJ;ƶ\NLLeGvBM- Ă9DUE "- IDATq"<``J 68qbEm-uΝxL)?oM^::8}&X!lt:TrHN?.;Va999ϵ+tGT jS8dtEE{xpt%i}f na"P`BU+0z]W31KMm|-bv {:?E11nhL&AAy{¡魲,yk+FM\\o@yAG< 2)w$`8ǣ03h\Inh6\o=:z OAyZ]i4}KeVUs*sHӯ:;ȋaBw5s0e̮^`YXzK !ډ]5rrM ޝ]cz@F>n;]ݏD?{HBO]2KF8 1Mv@SxcNVvoLJ@lő_?׳}Y]OA^b#,?r%@aV{rF'_9k{ Eڼқj_S|*SREmי u=ǾuDe5n}tmݥԅƌTRRC]]iSS55V?b<5eef[Q![$͸i+ 1QpA5 u|hRnu$bcqL ;LbzgII֭Tٳ6U[SC̟/~,y+fhvvr'sOh4hjڒ+CC f̠ZWmi~~8SY‘0;<,cOQQC|6455c8郴Oٳ_޺}h61G_/pT5!pÙ Hc܌:M+, y3sgWI$vs˴VzDHYUT))$X^?yrE^"f-[F޿'N_H߿!2K콡?h%Xħ1ދ[v'AwuCF}HI||@TT! ,P[T=q..l:Y=WQ߂hX35E*٦iJ U 8haT8 ȯ4XXjD_Dq-nsdWD"tL0(R;rʰ:ql iBۏODZp -{NJ㈾$c6< 6a#:_) ;?X,tKYS4!&_уB8:]]]RL,2ں\W9jk国O9(UUr+!CT9l%Wc#S'*NbXCCJݻl9߷[km h*z:ؼd)ܛ7GY[{ ̻*}N+@fvŬȒ-]UI x>t:NI̲_b6D)5_[Us-“1druOF[ vm7*DU]-de4. w ǰƼ[xLo,A=0P <_єA;# ei_IUt2l#:+# *&&:#?r2䄓;Ǯ3r/""X4a8;Ub"[,FC߾d#_dWg̨!LLbWܭ[غU zjEEsɿܐ&9 @llssJ ),>4̛[Z5z 8%NGR MEjxM֯IBC=_»B7qc|~{y%̜{Pre[۷;;46"KJb;:ӫz{k_o+ Db>~|dcXi6ކgWb1|0(aj8{FnWHVBġE,xh]=ʣMną(|I~ǟB@Oudc҃d" |>~ T>.3k[ʴ+( R=ºK4P_TIq7L0+qFN:%͇Eaa9 w(-A`.mzzAuLݞ=uQD<Y+]u:|Ah+HzŢA+8AFկ\ r8 7bpWMN'G|*q">d%tv`T![K1 Mpyɢ{tL2ǡ h\~W`Qp^@b!.a(n z'po>SeW<>?T!'QH®*j1ρC?mm&aW/~aX;|"^p nCJ LUY9v^?&ǵرᷱ+.aøϞ%$jeƙ3_gW<lYZB3g>>vuz5[Ul_sR=y]-5nկÇF6^vw^B]]]Z#3m4iӦR_D8;+.B1d.T{Ռ]Wo,!C?}u.i.X<ffL._PzF'vTrLA) {{dϞ%/sqQ҅9J4eWYc91{=gi|O3}u6ʝt bZ1<S,[I? wJea-mA9u953zBIK8~<؍j,,A+頰 vay2-.xb8L1Fn%"26 9G8 (VPRWuX0XAL䵈qàJ> |b@C0BJn@Y $qw')HȕTE\ێadIFh{)aP?l?ÁŝhjŹcM55rwUVBEsҲDՄ`3+iPVo,iS{'+g˖"SS /Nѣrꊊ>ڭU7EÆu6گLNΝ;\X[[;bĈ}fgggggwȑTUdf60ľCBGzod$`_Lhc_<=6Fާ3~O!ɸqrn=s& o`W׮eضM*s "99%%I~^UM-+IO]+Ttt! 0ujy@@cNHJiS>sR{gnA[cDu*]7M^!.NKL>[۬\ÇZT6IM72z%"Be:ۍ<(9%K&[ _̋G,\n5gSd5iS߿zȑ#o߾~as0`3ڿ kkޝB^]%.NN`s))N޲¤%%g$R8.TS%,gnƈe5͘;Hb"ʨ!χʎ/-'G?p%½{#F6$'DZ}Xc[쪀sY~B\?+m #^cpv p8\!#j/n>DCNE8y Eca \ u%$`nONNٳy'Ncc z@3)9{dWfU{))~^v˫gNn.y˗ t]@ *-mȈLҎx`m-GEEId4sΝF|v^E揃vrw[,Lk޽ۯq:Qi 8: $@=y(Cmx`s@)E!# Ui(>J|6o"&j0j+ŝH͇&6a8flAWUHj;jr-+a$)q{˅6;Q^__CtB]V_O,\H_޳onj"n lLJ8;K%-#mHJ;+N}d֭7ںÇT+nJ.ɏhwKDVCCٳgDUU5!!AUkaaa>} HU;GTTc[[Y uuu-t(G+6=yR Ʃɉ$'W)0075UPIG?2s| Gg!!y($Ra1z6tL7dcXL] V]GL::aD\^H]] =H͇m$aWE誎{ջd,݌ZM]8s`!c<KSbbހ}D׮4zfȑ#ήRRU4V-Uf=ás:JIIp?:z?]si:ivJ8Lm&jRXm~*ûl7b0lUf@r `p ;cDHQpܨi܌D0ՅR #5`BEc̰m;w;d`hlZßzu{n]qd/Z3v쨀C` 1~i)޿',,hX1f @8}…Dk.;XdIn\D.f6u+q!bASQ򡡖22Tf5D*juv}fn#m E0>yaXuuu""ߏ5Ñjll$]WjMܹBbj*fwx`b"w>\#ܭFٳܢ_\`i/7%S1"7*rXr֤I*4-9ӱu B ""8uJA2"iʔS1ش4-v/+&]1j dcփH IDATE]UtJS]v[on:z" a0CF*k_KNzx۶BNΟ5Y|r#GZYz+* +g ' ,Ɏ/A<  -,< oܺ.$%ɿ!C$7l((``N=JOrv n?PP%钢G MjzSTmŧD^} q2 *2kiݿsx/al6A/s8zj=!+k4T؄^q6VҘ1xbd ;CJ Omp%^osĤkt[MH ! ٘i8ٽhh v쨱pIIu^߳S4⋋lѢɧOÇ̚E!rTT$ƍګjҢ066`BBQU,qq?A,uu ɓ9^JJ811Uaar&#u٭[D.FuzRʯvaJ-_\nZ_@׮ҹQQ_߽&M҈,tKc#7Ǐ?brEuu$cvlˊ m_(t]ZgfX3D\0'k%Ryh4#ۙ^)UbHHbF^׮y~~Dj0O#:v@/]i_/ jJŲ-sFPBIwZ]5H{h"L옍G۠"gw5<pi1C_ b8 m߃&. kR5$Сfԙ_ ;0BAjA+ =MHIet%yF\8\B檢K]`5 ѷ7"(;dQѼĨQ^'NLfx#]Ӓ"0Gw|>'i:^DZ.,XZJN֎C9?))1TSPpcۡ+ZVߠ-0qīW[Tz]zϟo,qmmFllDiܰ0AS;;CCVT3gvZ ںhRүjL8Aߘ%=ZwoxƲ ::ҡRw ]v}RC JJ.h/EgOzn)XrY'c/Eg7qj*=5 J(NNs4FdOo%&6sVQMo/W00 h mm֭Fp0st uӓٰT1!"п p.pׯ3(|CAU6ĝZi so0{1m09yȤ뭉Nx +Wq2 &*vC.v=D ƫϐ"pm) )FcV4q,[bBc"UX~xxBM\v0ч%;< d<  ո}~(xofݳIHIޞLK˶d<II\; ϟy&&"7nȝ9#;Wm->},-mGƢk۶QmIArffRR礥Uo B888ݻbϞ=/_\d Nfwy1YFh 鰲0 2)Oɓ"rIUE3 KwH#  ؅qD5AVEBA@ fk~諰},3ϙo3|0ކ9"3l FgEwA\2&/RViE2B[^Vj0ӵg^\GJ g! ? DeJC8;Ң(0 6ަ_TLP$bsp8& ? 2X>_s&va ش` 1y*@!lϣ誰#("a 5X#6v@o]M ذ'NdGE_aJN'U )lYeϞ7n4Nz^ʪ#VbvvYTӦ ^^_?0AԔ_M3gv34476w+?@THJJEEEiiiiii{.44T\\W[w$\vt]G붭mUǎ.Ynjf%,Lٽ[wpR[wNX`6}+>|(X{[:sE$߄Q ٶ MYݵTJ#>7 7NK끪hBXIIdYJ>_/ 0o^ŀ͗XRzZ<2@ D$-\|f]n`қF|E74W@m(k a4nb>~$ϝrdRC Pǎ%:L&.a. +a&ȶ $ o PF'+`AZQ=i##' 7IC' I0'b 'BQXt  :F.tP;#,8ćl(H`%fY\pK+ 180y x Vp ڼobrQRh׉EɳX 8'($M%)!5^IܹvI~$v(ܽHVꕞo#;a$I46+]׫#&SX8I\\V^qq%qq&&|3XkNǎkKf+$TFvUϝ&,陳ukiJ/r$'W^]*($,ng֭4?QvvFmQ6ݢl)y'!CnGDDG_J9o[_̳g͙;H^TĴ}*:ڼwonIe,!K_W@Ja3%0WzܕZn +Z" єGb(f垽GKŔW546cιsde%LRN3gRϧs'%8p -jmf;6⓱FŞuX ~!Nn<eX<Wy}EH '1d,vφu2lFx|_CT9en° Tmʂ[T2#.q9c (U_ I1B2;+ᐗP^ ^Ibb9n`(8LuPce0J=V/1O7P^OOѣF22XbcCȁg8Pg J74n*szxΝݺ :ڿ`:i%^VbFK%p@Ҷm9"@^!+{VWWӧ`& XL&t),+$&*~{`2.]؉?ũV- yC&Lhɏ˖̟K\(l,U٤W᣺O uYr'/'81dR>Wf:,##1/QjڵeOt_zy޵)j @ 羕BmzcgKGi);!ɾ}y(3gRd9,5ve y7U0(iBNN\c" Vk9hf X0c D 0/>@n9Ȉ$E*0QeS(8X 1H#0;L:*A{g`,cxݲ*, WW7؍lCXl¾m8B|D@2q;=EC\Wc `PS9~~($1dNe5VAXz/:eTWW -pzCСCS 5SM^QT*hïXYHtt{V' `7tss7oKD#r||_~߿gU/^0۶lܘY7n:fVf-w)7o舟?oA+*N *. پ=+sZo]ksr6'ܹ^9eJdIIcP`UU7|ç܆w{;>@58vE+K+TFB>vQBl,y>y[]()AE9~7Bow0bѹصϩwwM9 p) $l,$cU־Eu]>}Aq5ޤ#tҋ`%Q| 2h`BS&PB/ @w޾~#>[|]aKw'3l@\e8c-y_ZKFOC8Np.$e,ۼ?\ټ]WQQĉįV55͛~9R+bk׊kjLwf652EjťOXTİsHrr**ڝ>aji!y~˥Çjw3= m9L[}{:АhtԱc+V|8Q޽\ik?Oi>?e^KWWΜa܇+Fl— ;J{+i"o=tV|h? ʪʚ_+ZCPPӳ"G-b$*XlxޭuCag@`R_P@V)Xu,d!+:6CY5ܮt!'eC,s#42qc74y3&,Bf.Tp4̹@[v03G o7p8re eKN zPUY#6gONCfVWsnUڵK`mUũ))]1Z;ٳ|M,93tѢߝ%X ]_1lȈA}Y1BB__XIӬ"VISS]VG]]lH>}dkI=@OO͛|LFy+s̎(2˙ȫ $=ih(S7j)(2y˓2Z]֓jm[TfD5"Y/:BI~1[]I3g-[(LJ\o<= s3dd)8/CX OvYw'(7vH#)C ѨX;M4NFDp |@a`gyV1 ;&a U,3c\IbWXͮn~%`j7bWd1d |pcr47';֍zױJ˫ʪt*oﺪ*RTTZV⧳ D6lp^$WT]HK13st%nly3I_R, 'xh4IF?ftAYYH<,߿([[WJϝKopchKgeUv\Ut`~*PR{/Qϯ|9PU\QZش0X瘇&KƮn[8iarAkT"Qh޼@fϩ n{ww7zzqȈ5z4+(S%zeGQ.G}ȈLW6D7UVaz,OZ8 I~`*`1\Ws6,"9 'Cr(v9>^ހf:_qfC ]pf־"%aͺ{#- __#~ɢ "R9}zKed$#5eǏr"(㉫W+LznD)˗ss6nTLLkٵVV:֭[iII?n~%W{{o2YM% X\WNN]<{2?u:NIN.,lhWPĀ*wfHm!!uhx~u$5:"ef6DGW&~V~+h%.St4,>~~:ի66e&?|a#0}:eSŋ)(-cgr:fHJEz#[waJ7#lN!9~}Ө+Bb- (OFo7\߈@ )Ξ{&Rw$q &‘{j +уx0,ޏTY2̩R7 *GcoZ,YN{zLTWcFŜgH Q_͚K335zy0~~2nnƿj)ws+`-[lI;`۶Ԅ QfHg @BB(HND8 ֯Khzj*Q}EG|.4YkdE7 ed--,llpݵ$;\įZiqbuM R>~,XI[D~ )vZ^ڲǐ)4#(Gquʿ V%6CC#bZO9Q…Şjߣq57WhBښhk3w`e, }=<đ}PR%Ľ}Z0AE~Æ3UWw"$$|4#V\fa!pӧ2LE_'wrFΜvIgeͫe{ %INn\$7?*(#"#"{X,rҤugl* kWTiicL-*ک>E|ٯ+uY,_agVy33۷*5˚5|8p b*Y{{3+y<_P{c'3JON<%DƵ5QTgaCƝ; w6ܺ &FqM>no/3AAzx9)+UWw:$q4._CHJ4QVπr2ĉz nĉR*qC}N/v]d3uC],ނ+wyBK4* n*YCDKb"(*N 0=S (o~Ol@+(: 8׳!#FG3<=JJ8B!Cg:UDBh}Eq1> tsS޽o]&X7Ʃn^0U̝Zm٘1GB. 9Z3AttҥKeddZ Ξ6mԴirrxgw'ܼ)OU SRX7nx^60ԐII5[GKHF#*/_l S˫/yڂ!ק!ߊ- &F}+W .8y2!%'ץW%d-tNn4PJo[͇hPyJ!ߩRX`7x+T*OyV^woڭ[ ˖U~}hlh;nVVD@m^QV;w8LOONCe~ r .F%gb:xAEfM_]hM\Ŋ?[J5q<>cqkXBTsF ma?Q) F !_򎣲>az %`bTo v& 4{7px\YͮJ`;NB5]EGVdwFC$$994vUR¹pԴ̬ĉ2 V4-M)8Xnlѿ]EEVü|Y3纝;36yj֫WKEF,7"XNNNJJJ-_>|iVVVVV#x6,, 9sEF65=[LfBBSKK[N>{dzzmccK A`bcSS`^`<7h &ީ fi٥HBMMeĢڭnII4/-L[&}dNtUUWd|!ǵHqׄ BhUy\&slT31:qBK+WdƎ++SΞswVQ)Z*(LҒx){wwrzdp-7aX*Vh!UעfCރ&a-% c|9x#ao/SCbǧX1zxkϡv|y B & O4%pxsCxxːbX⥧[Zq :.xM>rR]Oa%56LRG8~CU#i#I7W]Zǔى()Y#-.$ÇKVkh  53*v025J_篈,ӓۗuu,]]ikkMm cex߿| AW5kkIeº:2#CCI KE% o$/n]u~QJJ¹[:!ܸ1`6mKKzՕti`*ɸ0ԂRμ~_ݻ&$hڵJ^2=&'ם9chm+x+EAk`RWf6Q?}Z yy,YYȑ£FEEYHΦPNvNI1C+9fK>zcFLm{uC+cIq3횚LWQq_l 1Ƕ?0b_z-p3Xa /i` "I@WC/m 4.zhA#@30XHFBi<:b FbJH 8'F<~%9X]>*0y12ra'v‚;u5N@?cőscb bjz-,d_Uiil*NNbSGEv6s޼ng˸* ڻB{OBIISXi[$nbSr? T7wm̼=E` >u>!!!JVsa3;AUZgnMwW>lCK#-T0e4.? eUpOQ1n,aG+I$o ?],6#j5Ib(s}$kPUBAQ^'X@O}taBǠQu6M}x ^s 9ō;;-bqW>quE}Y[YI޿@Sb߫)$.]*}" ZY>aBgc?l;AA^^  =jfb"p݌yBWukc 0r[GNc{-qqq?W 铟C +Y;۷["M+74(|߿bss/xz]jo]U\hb >ZQ҇%C!";{jzq,u.hESZCsΰ8˗/_Nn`ԨgO>x0hx~D$ E;vtusn] w^W\lS]gubOW| mz5o3((>fݺXUE1'GO$Nq="94.S% $Nxy$$a%|QƎAMf8e@צ[l=Wv68rմ;>fMs@dR.^&" Bc!-"J`Ho$lx|,e6BVCzN 烽>0ց*6́)m$^|z²7su f-@@05~. YؑС9cUS20y> zzz#mlDƎLn:1,}G {(*ݻ37NHdzG Ç QzlXg-[^˟ S`&Akkkh2L F^AsYDbˏ UT8qq&&6ptI㤦Ȩ}%!A-,$*}cvqywB/i z'<ƅn]%GPtmY1~K-:f"IGzL6BVVtÖaN@N֭wx&QQQԔ6a=WT͍}$_?g c0c(!-3qӸv3#i i98 \sL/뾱ĠA} "$ u,$P}tPtUCuA;쾈A` [[@M6I_PطJ_t-PV1OuܾM:;*+IP `લRZZۻ63MG˖PS9yݪWi8:-,)) K` w^^inn;vv# =pԐŋ;2)%X ~"_kkaARR.AAN11y0>>ͮ^TgOQ?_wvV[/EDDbn.wZv|||eeeӗn]++/  F;ij -],,ӫNs`'Or…J]R֯Ok[/ڔ]/QMOui__pq},r(n[^^>*Uğ=sVcmM71}\ROxÇk<ԱϢs1ӓMl-{XVr2 UQO!+^:C׷ F4ȓ~| I1^uTkb:dȈ`r%7ai&,`;.nĦ.>whzUĨ h*ևU !5 fZCU!#1QO+WVu5Ӧw:C2!&ƍ՚+VTӺu<(]a;WX,rθnݒ\] tʂ/gW<cgTr|^$">-[xTCCB!v~fرc¿?"XI$s'r@ȑoWRGCBnjٰWر+>/;QW_\=O68RWrffup1c;6>tՆWlM;bĽU"" :۷eWDNNzVV<} ur1iuf=L5[斒7oj_}Ē X\(+5ܺXTĎd$LMEml?qMפuZ02ĺJDnb:d;LE 4 wCFN3(.Iuep6"22HV=p y󖢦Cp2 őӧSRH 8A=_,_Ն6&'8Awu1sEM޼Ym[59ja3[w5 ;Tbb+$&ٛtֈPN7ccئ[⌌0f#1Bhi)le%l`@}Gq~D54i88(!^So&@X2o^W++[r6(btr3RjMJUy(,!!ԁkaB]V,ځȚ5ffR{f$¸~G\A> \יksW/?hh̝ԅU׿{sK@N2k۲߼)kk+ҷPx8߿Ȩx몫΍Bd!CC@p0Ғ%7Shhn(!!ي{gBMF<tap g6^w[;o{6"#xfŮ8@6v7"I0<]pƌaS05%޿u]egm֭[Fr2kR('OFozwĉY4԰_zR粫.]}|: 0{vASSr55;Zǧ'?LM &!!G?֡#O2|}(RĐ!O6+uRP24xvDD)uu8;UW332ₔ7{sHFFG99lze%/aؼYXzHbGG g.,]@pw5OG qqN[:(Huّ#醆B~~ӧW[ukUzma "&6x0AE;:g\F᜗ܥCkV+^\jgӘյm%V9vXs, xyXy"YC+狑 gWB - lTVad$SFz]̙Ww`۹o^Vl/sT#_7]h>yik:ׯs_١S̟@h:QQb Ǐ||7NXR{wmnEeΝ]o&N,WWv;A\i)*lg(&Cq#CK`  Z=gw΁OXϧ^}:i`|qatn`9@o0n4!n  NDEfNn݊]]CB/AWFON=w11k䩫'SX04yJ3e~$DHH[k׌Qkgg͝q/_jk:/~3Fl _־sNUUUUU՝;wS0TU%Ѐ7<؈*cHySwR6+ 1~<+WZ2EMZZ<-em`Oog &@iv1:0UKHIgKبRDžee5j p˵isUߡlk潐qg}=Ԥ,(Q_T茩ɓJ-heₖU%Ӊbĉe%הw*[֧KӇ`qtd2! 7\' p"z@q ChoG1j AixK atڋ@gqPXl?l<03xυop\zt}CQ(FLD Q=3gRu1r IDATUO(,LSfߌm M_2BU;޿ϬBI sd\Joֲ|}3tt$&OC˿ PR`_ (}W XvvCGD48kAUWW7ˤ89u8Pb;%--t^E AXYx{'TTPj!}2=̔y u55گa1Ϟ:7okm߹SU3?=[nN\rPw9y{e/ e-ӣIJ/׫Ξ]= 8r1А()!{byzrQJ?W5 RR)T#վt<z]Ӄ/f9Sѯ'mm(`$d݅+FC}"VA;L;z~>!+#6AJq2s1t&E/يs{<0x|jL^=|8qO`RDG3)Ro( w7vr8x~Æ|]ݤ݋(bBTTo֬QhZk΁\,YSSAy6wST2DI]ѳa ;گ?`ocCIL$=#32-]Pvv.t-Lda!֭fO B]48Q-9ܹV޽EEi Oid L׮R~-XwXXȧ\R r^Eʨnpr)֍;%^_RtrZUxՏ;!#CqqONVtu0@ /_:ѱxi0b5MUǪUlGGvVzJ&b’$qǀ ,Sf<5e?8)N.j?]PTĺ}r֬leU8P(-eo߮S7OOվ}(ή]ׯ%&:ԭ3ZWdee՚uegŕ:S/5'g۟X:jqɸqt Irq0_>lPB~.={J|)֯ӷ۷/R܏YU?)!1dlUUGVɓcɼVb`5y+]/IJhk"3jЀid\痔\ )ijq޼L3;֭J"(C?sF'Ņ ŌiII^JO/`4KZ/S_Ƞ&&o7.%=896A}BeE6MUذ[?MM~ F[ADza3tP׀/1b9ǂ=8{Us:io 'xRpmd ؿU[gWӬzs%[AU5fAz6DE-:Vp0iiɔ -mHABk֬ JKos?;`ׯ.17OUQIػ߿HYn|jCJP_YHHE".tҥ fUo_9[BD:hƿ ( ? !O|OOM qӧٔ)R11~~99؆۷U/嵒2Eboj( ;wϞmm_"PgϾt KZZHCC,;.8Y kN~ 75V\IyԢko2fNll+9d%N(X^GYs[ĉ?'N|TIqqq?ݻӼ}}ell袢D~>O >|`4k 2'6uQBDl`D=EY9>eS-U<Ö`0p&C"xP|cOGwm\-`Jl8s,i9(@t2nmFGl*d$`0`poލ~-!}'M$;n,oK>݇ ̜ױذJJл7%MGGeo_Yɵk::;wd=^gDžrֵk6++'XZ>]UGSTTN}lAATmHNPj֝R};7+ysիeG-4[TU;vH.Y"~DmL z()Qv8wC<{FswgŹ!g3N)-*)JYuW-D`F{?##֯MA(_n&Y@҃ } :yzGd 6E` S&U0j-]jf4Y}"5`bk0k`LB't=M{H͛)q֖-ϟ3E__.,s~Rh%5xǓyUU.X WZ:v{Bѣč,+S^H[ɝ;SR~v`[$UG'9}?|=;c3̛RbDX m&2h4Q;2v05 5UVVxT\>r'FLBB/ӚŅ] i{JcbtBXf .԰<Ν5'TQY\b"1qtζBs^ -u^r goలDDݫ@/P^-^5L ͷ@`y7:×3XqLOǒ%*@55`b8P{L- KJRR.""Vu5'8:0*-E-11J.#%&L6LB\zgȥKttD##:SziQ ɩ/~xѣ/綴"c6XZt۟&&ĬY| W/ק]6gJ FX#ڪmC,]AN _`)|Lfm.ܴi?b0%KrZE ll$6rr2߭ 32_?g`g ťp:|?nf]P@$>|7M.VT\;qXeeJc#%8Jew %z hk }lBJ7++l?ƼG3j`:i~lC~@O2JddlbX-6JLEI\!#GZJsWeRNNŢ97W5WW 7.~=:HDlm<=+*8`~oYu& U^Ac>ϱ!7 @䇢2~;ZᏣtddxҤ—/;>m?rD׭WRR]]NN!<\G_,y\[Y@` (q,).wHH:ps͛ݫ-ÇKz8'$/]% ǏΜqƢ 'O"" 3g$$TݤFaj$$<^aY{;Y, S>_'/]=˃#qrsv-*;7jp6.Ռs m%U5 V“~&Lȷ{dRjfz| So]LS3OJ*ӳԩׯ;_4FL bܼ!7w䀘]RmR_fa0~Bu ܍K $:8,Y @V:)p<H}hKO8U@?>%0<3*287a0` ڵ ؼs8}߾1OXk#4u*mTun!ԩ9911*6uBazyxZP=f„aWp'OjLdKN"c65~}_ `]&r Eikh'6  =+6AنntpƕPAE ?>JTz…]=f:˜ RC@IYDm˳ETa>pXbE9//aiixĉzC9nn/6p\>L۴qcyC~~ߡ/r& ff븜ߟicCǼ*0qp4u%xWK8' orX t!3r aJȺgp C }!" cfw/_||!Օri)ܼ߿|9o`젹qPr…uP(DjjlقxY`޽k33{yv[c ]@xxWMrã\I++#}*O̍C<{lŊADD.""ĉl{… &lݺUXXXXXx֭FFF/^ W'] ׯw/s9ww! u}^sx{+@HH`D)9z[vȥ@X ʡhޝ[ZO 7uyt[PUWc3g4qaa5>]]EɓMˣ'&vɓDyWqDٳū(wQ>eܹt:A!.;ZҒ~\{`F;:&fg:F/ZGG:,rhLFCP {G"̝a1e_d}Eeau V'Es()ssڻW@PsfqWWA!!,8qჺzga3摐޾h*'"--`hddNŔ1MMAAl_ x- L IDATOH$R_v gAQ< . my3{:)^, =!/Iv 8̄{a܀lm)jfF9mr6NC]vuX}CM cWbFFC@#Gꔔre2aU%==K! KzzXiiBz0+>{`e%ao?'Llkcw"c y|~ Ĕk<NFYWB۱E3Lg q%TP^ƌlk_>HiPۋlRiݺ񲑲YX&rsvX b ¼y‘uuZ;wJn.9n.$yUռŋonR-%$rEhF>qqLl,ʪ1&"h#p ތbY~>q^K3ع^u륥෹(žSifnxXs& 3歇\-r %EL8z ] l-!2h:hʊbBCqlj@g'eK_+<Clog>ݠeK$nTÇW~d~v=i,\(33AA% SQow#ԿF6$|^ ;w[[[?nhhhaaիO555ml3 V;恅.;,Q53 Ѿ}}H%^Q1LA/!FF|wKff+9"mdīBϧ8;][հRO~F|.˖TK9?\NJÇLOOF{%.#^x [gFqO#~s~(?AUx;u Ý8ș'&P 74{'a;? B` 7@='tUUDSq^~iox.&w/qhN( $')ښ/4TϮw?h˖YZ ϟY!=NKi9jBqy]Kz&888;;{߾}277斓[vΝ;#F C]'[Bn>C'cٳ1hPܒ{z b1Rbb1c=jpȊ^GG03iPQusS{aÆn~#&JKHv+=j(!c-XBuu6zzz}Lf ?b yhgϖ_oH.Lj!92(S4Yb:;I "#DذAS ywwcǏ7^4,C))̝;"Ӧq*_`}ҥPӧhh(֖^ۯjl/`n%D\NOū __.48,7yfN6uA-{Ba~Di)DBU-)x~n2e['^C+ A'¯&ٷg1gϲ+-mDjk+gb͛ϙSG4}UƏGBaWzZ^^;]2>^OGe6eÇՙM&| ĸ+^}~^nӫ=| $$$<<<(Twuu#,,jhh`i}{|mC I(@ 8pY0 {guPۣGTW3"Ķ{VfzV:XVT ,k%hI^=̙ ~܁r r{]ѷJo>`0Pii3/_/j"jlQ4oBm-%)yu=DX,R]Mݼ{ ,Ybtz)-9kh9yArzf|H,QIbYYAAM( nP9b_US b x7&W fv>.eq6BpNNoQ__}ѣ*ı a;ܺd2=[?.vbVxn@(0߀?)HKPuPY c4M. (L{s PR2lmEo123Q Q̼y^P&KIadd7o KJڸsgEETiiΝ>>"Chog\TV[VFij ^6A*)r aNEßG?뼞2 گ_}捖WϿxU\U<R© @Te$inf?ӊd!*yRc~~$ aUU۷z& ` 77Ͳ]cb:a`eHB| r Z:q +*:Ν+sCB+d/\LI![O)/0mA};G X,>vLBkJщydwNN_740gdˏ}r0 1cgp/ؘ~65yY][ ) ik#Dp+G"AX>A-do88b` u2 n?,a^ BKH ]7'DDAB2 Oˮdpv_,.FŲϮ.\h61.jaABQ #8Q޾iD~ҥρKSW̧REE4b23g ÛUU%1tDjjfaaa]MӦM l``Ӈ ?3;]ct@o 45ÃONgcDD߿89q3֝%̜)˼A`|i 6h~3T\]U/9rdXcB-wW/yָ E 4!,ʼn>1Ab |&&ܘ%d"p>>lRRo׳d4@-8==YdGkv%'~ Gpq!BWgd[Ypȝ;- ~J"ep`OHJ™3 VXq4 !C '78sqxDՕ`l8 Lπ[pNjs5L9? R# l_ 8Yx{PPQm#Qe45(ܺg+.?yժ:m?xPξbҥ^^X++ :`5뭚Zڃ4ccMCCE2(%SEp_hh1hVwh.]Zx>>kccQ]]M>|={|~vɒ%ojjjjjڷoG]n~l pRK]yyaJ Wtl-QQ9KRhRQuugYϗ0A 2ԩs*緆ޕ F&&Rd$&k+ e jkn^sS 1bgW@^8!x=qqϟ?g!X`*ՁnbAAɎXXTF Ge 5׮|!U5׵f(B5`ss كUUEÙK0l˦ZC p x>d]+D@O ma\X;W`? -L ;h5~}/Ɇi,]ƛNH~)%LM"IG֭FF={Z)(\Ԩb%޽qq*::,[0(.rjڴbbI'OEF֎OKLOO?c8$]+/_:֎\U> 544{nddgnknnY"sEEEEEŌǏqn"2@ͨbX Ⱦ3֣0N46&P ROVVtEE1`dRmY#9YԴ;dgWD699Zݕ+U[*ݫ1<r`Ds]-;.MM =8w8NuB_):r M\秷p)zHѲ2'ia.̙65dn.4k=e5_}vmwS!\7#;Wh@m!l@ZZg6:T͕>oڜ1׃9PZq|6~OOh;LbEY}hؾkJSGۃU )OaoPPRn%_n=;<{:;ӫfWK@Å8eQWE_GEpE!7-5TTZSXaf&L`1KKa//)ao^h4tTC5+AGfQNpBҥs樅?AtdˆcP3BC30,c5qrˆ'݂X愐^ ..Hp0kmI=j38oɒe[XYrscDan9C*KK_ `f/JzﳜSv""ETEobsBYYxU ``<3[u$QO2(JIJw`1 R 9͛ŋ4M$1>ЦLbEy]moX?x'HH`||H˖4''Lj*NI F=<EE1\ Z(,oC 6 - Zp' 6]EE1xvUUsڴ&PT>y":vA+ RR;$9bWYY#VƳg-!!5kX[gٽz㓛N*,kh]YYijܷgWq*̙r#ZZ9a'X \TwekrpC}}D/].45;9zJ;KGӶpRYYiD! ĸqcg'Us\\?0hiEF79(#>)HkY:{Z}nvsyގrܟWtAAC|Bebx .+fML59lBϼxRDm]JbrBB]4k8n3yGԱADePY >>( Ϸ;;7{;II"o0=]HC%8qt &1mio{ANp `0ϞeΜho99Į &&iiT MKZ]Q%deOα n$iu \kL'7 Ǐ?^TSC=[MsZ5/F}ɓֱcFhĊa3?/~~^ ٦ځ w]# `DD,5jn,Iwt.wTT @g'zv1<# cg 0[ˁŽ̨(͛1α+vmf 52߸!,-Y 3}JJ~xhP==!Lfdf[ysKyK˗Oׯ/8" 2>Ņ;__x{cW^ntD,;:||8>b KhhEEK ~y54-(( `BsvMPRB&OpV1u*{ӧ{ur-^,U,kâEҍԋ+`Ee+mϏ }k#%dC4%d?drP6Q}}pb$6gawRyt"uu)MټpD3,Yw )Ej%\L"v`Fq)(b (ʪGoY2X  xm /fgfl}H2`#akU585'(7ȶ(4iEC"<~ܯDO8))BK ĉW:0.M XXt:3 b}=cdDLy9ӳ>@Y:(+cCC]\[/zX,lތ~zsn61N¥3 % gx.~4n aP(0u#e`;d{ze-:)A>>6$c+*ZZ3fDD(ij8GAQk ޾  ;|: =[bfMbcdek߯+kg'#ĨU5+Tg0O;_ X3t|ՂY._&bƏG]z5?^н`0fϳZ%sD2 (*-_TΝF--={ |5R7bШ//b|N^OB9o$%y䆳^Tѣ6ӣ=1BKKdd:ZLXV9F^2c"'lzjɏ<YF,+k>?dI^ u5-" rzȍIE/&m~ 2s]EøIޭrF^2") ,LAŋelmEytQWG .x8ضpX_gfQ6^32 m D~(X??(,.>rB^Bfhkc޽K\COYwk\E PTSaøɓo,Zhk_Z0ӏOQ1_81C{G+^WA"Q%$S @XYp%L IDATr!Z׮i1cyp5X3t?z"!(H1qq- |U2_^T]YA`N~??>#^w>0LL3g0S`FF{(GAVAyؼel3+!59hjK:\Ղ'A$xWɨ13gcư$%/YBí^ͷg?GJ_@;}Zn֬ipc 4!ibeTU##RSI<[(ݾ=׵oW9S|("et:/&6y/UU9ݼ93˗ߙF'qW~y'`j!]=fAՒ% =se!~lnYYu*JJիTU M,zܤIBAA}tt.U0H4 ʠF<>bx;Xj)4A1I9(^L '.!׮5[wa!UɐTzo4+*ڸ{D8xǎ1la".aZ\W7`Q%=O{C1DFCP(B3@p |"t:lكe?5kHoSjkׯ p&;;QkךN%_?w;:L ;7SNP\ܦrW]XC~~mTYY__<:zlٷ蠋qM,ϱ _]hg&X 2tp0e14'xnC=Nx( ΑUUL#zuulXX jkKJb쑲赞_\3iЙ3}͓vգ#˗'ܽ['6h}%\ӯ)O|{dDGpsS[`ؾ{{ aDv#Y+]SȖm-<\ t8Q05X,Ã+(p dddeg<`AYR̩@pϧx|b1 SjjZZFF/1gd xgh_Q~,\&&M7mjh y cA@ꠠd.Qj3a\z{;ǎaW`7@^^F)AO3t4'r 2W]|jh8:jkgבK.]2[Z:ymEq8\v 1c]dZJJU``^ddHnnӓy`J'X#`e<|㱐 @645C.a0PUzuKDDǺu=vY3gPhhBzB Qg`e%mPGcǡS (GYV )*axFFmLt;; Gv6IG灰0ʙ[2UsCtbګ#w #d0qQnnLFFku5NG;@N;ѣyttTTiI/: G=+Y9H$tzÇFfH1|ۛ)joY 3u׾*9xPAǃhPWeEQʆf`dMJ =Ccmͮ"zEyps#2_RCRRPTׯc'Nd-MQ1"pιsKI$&;]x( ::pjvPSn. G//37IF"::@TO~   ) k x_-5GY]ח-YܻG:qdƒ4%\|jd/dIGk?ʸ޽[ueT/mfC:b3BV:7SG';"a瓃'L&36D~egM8xzWlb%"͒dFM VSC-+li嵗Rp8$)Ba wQQ(70   r+kj*[dkZחЮ_B qSN+YQ7\[ U +Dhiㅶv>p"BA!`b&F`o7ǎLCCM,uZeec98Ǐŵ9; ?/'!1 oii+qqO4̙ӦΙ#&Ŀ%NMO^Z_ן;]SBB q}l*;Vl< e"&{ȟSAD/܆+`'?Ym~N@CE.pDE1JJ]'/&lm㩱"2˗W?߰ͽ ɶee}kRQ>|QR?c ><<ƫ֏]Jҥw͟yӾ }'SGm1Z|4Էu0Da1EZZڙۖF">l$ 5yiB66VVº#"WXZ!l9QbD?a߾ӧ԰'smA_kטYYf>p.Ke3:)* ADgh , ꠣZ?ONm1aBc+d0 s:-!7n8bW {F(>BQ&L=[СbWL&zZz֭EX,+mՓ]@iz[Wpv] #mwF.Ev=1 !6 ?IgddOXnn`\B"'YlDqp^R66L&Z^ρ1KgV`0ٜ֓|BNuu8kL S}TT)A*GXƙ o*0yy]8Usϛ'ujEYl8OOI55*jRRIF}:~ :*epR{))<NWW' W X:*1O!: @J&~;R .Bps$&u89q2>|x͇p|mŋe /_zﰁGN(.d/2n7 Ǐv$iI@NL v8xy Yϧ/3j[*N7i0ܹSre޳je~P[%c"#nryJZKM#;ҥ7oؽ1c 7B&Á?L&?40Bu5$%rTںAL 16&Nj{mnfrIC N?tDQw]\%qqF%$O~dn<~ >O\&CsxɱmDPQ<qwPZ ?/d޷o7o*'Y\Y|qKrqaBBjl8?aӝPc ;`CB bc W[ ARB4peaX)7֓p8 ؑu'b;;Ջ'ܩ5y'7.Ul17e6~r0 R(+4.YRA(IJ s;wf&mÆxʹ>ÁH,iiʕ3g [.\HwF[ ϟ&L#-LIIBnXDuX2zjUڵh"׮iY#ώfϿRS&MHI? ~y1! USe\Ti3PCwJ(```/Kݝ !* JIt =y"# 3׏zgϝZjp ft2V@Q1иPH||u`"9ܽYY'Ojܲvκbe%rFllΝ^yE8t<,&juuM04Fq'>~\,Ag /e8 ܒ;3 ]y͠>FNٳ:ŋut^TeZCkM9;PG)齃/\hpr*'"\H$GDН+G [ كSSsLLX`gΟ O pw~شI 5bZȑ( mm>## c-77>sF'̝ef&B|vLI&cccSR^2F& #8?2MBSO"khiNtd( )/ʕq|K}gݹ^D0ic}ccJs3@~t2x j?Ś#ܦ;ƣЎfmBQ4+jb ˆHYq۷wߖl+2>EZ&'oh`^][ի.$apHU4g>7 ~~`HK sf`]PME]^} D''$3Ž-(LFܽbA&?+ R N``i|rrq^M% W_ {n,)-mCDSG,:1ׄ8, pC-s~u@"AjzBJcښQ*ooI--q-fI50lTU$)®]i%YzҢq>Gƻh;L\D//oΝV..X}dz@@͛yOgdf67l3zoWV֠P} ёe7k;\ ?""# IDATR+++"([U򬌌 ѣ=U3zp$mY/ ((yPGNlX,\H pz/G[ $86 =e]¡_ g?`G%K0ٸR;AQצP:^$v-yyyI ))0PULa ݲ%ӦBfIřߎ0ٳj K# V9?V::^AT*LZ3ȍ: _<)^Gt0k]ή]ح[h~>[SFX)-VE7!=(ǥ=dIGƺml_j:ʼn {YSS!,јrrtNQh̊&??flE#L߽#52sFw.Κ%}S!W>>Dyg}j7nDصKvOɍl]]\pCܻ+*PH$Xt)V`@<ȹucb{.]Ych+GG,\HuLFwr⡎uN@Y *uKEX?ϲٳ3޼ `Νә?Gh6$'SG|B˧{]*.GO !A`e"@T~YcFu{ <,'" Cll}2bv2/>>X,ʕT u 6|sC._.dՆކכXY}axWWy))򡚃ȴQr۱smTfmµ7-eȌX0z۷f$ݚŋdsR >bc>m*fblFڼ9)Of!iiHM Y5y2mghp4̌m5;y˷%KuulQQƍeeLaaݻ&oR212ru5ܿ_*xW]Ï:XЯ4¡z fBy-ӵ&3]%Fa puĉR_zխrr{|ƌ i4eliSS{j?[G{ŊK߻Wv\NRwp;d[K w1F4=BaPA$8iJJFzFVm*w;w֬ZUSueeltՂw?~̿{i0"#qkbPt<.s[~wꅒ8yrue-_NLDt7+Wzz++9_fגc AAMK?xB&@sÇII斖ýk`RWG߷/}j͡_`Yiyhlti6@Wɐ_0T C14 :սLBfe""3{׀"ß׀c֮?yRYS P ddd9911&4؁ &ʢSdw>5b@P+=|Xhj/^5u,JQͻ6}:E sDxJe{xRmia{zf:eoٖ+lm/\Ko_EffٗM,Deyv($x(nmeA]7\lmgYFl/xDݭ1ԫW۶Uc0(_HA|(lGE"4%qcidg$HK#0jYhJCٿS[  dddfzzG#'#..9#F`1ׯS$%yPH ;|"IySYH7Y{xuݘhj(* e>;,:(<O , A `5d]NN  " rrv.'bbH}=\mĚ; (.PjjgϚ aMM[w,T}|*+;.]*|;+8̘tviSeReCL-imL*-WMagsm|PH>e顡ӧ4 YCf>6eJ:0VUU_1/bi4_a0s`LMMM AQ?'! - 66=r(u\q1E]ksvnR9؇xRWEE ;4M^US-r ru5 ܸQRR쬄5',XyJjae 70n>8YZX0 x܅7Ptv(-?Lܴ۞\P>XTslASkܸw""1vq>,l/R=;25޼osN\|[+OXz2 ̿D{#*yW򏷰8Z衲Fo1YYt{ aaMî߾eNޠݻEtuO Ф$ Q;#& %!KT;A /WPc0 4T[SX(B>4;BDCJe45 vK KT#UWXrPOkՂՁَ}_XAq  |p@̍ ~׉zo'F`Ot|agW-*̙|}e߄`ɓ%?7v~haaf+V V׮50MKoQՙ 1ρV`A ~;ױJCur7DPŏZsh_(ǰ)S0X,fb)-e4s(g--…{:1ʘq?V–t8:&ى]2X?=攔&Fb"./O,.nyyREE; @ki 鉪}MaaίI..i+ vtPn$1F/X$<3@L&d|[4!y1X#.!!N[[QO wkྷ||UU6]!HK U| DYdd11W~t2@,wI lǫܖgOr@j-ctFGJ3(U|--p5XFOCI {*elrK zPo /EE =S()jwEE‚̇k[<}H7O]رc32h.^'!`DO?L~8,0E[[NTL[[XGGDF("јMMglܘ9̙}}Ӄ+꾗T[Jdl 0?C|3=vరҊSi1ep)(."8!j|`1E(P} .q*>Gpr"QDFpXk׸%$6({H3'O{'kYF3-vP:R6ڒs8=#A clY5%CEm-nF)ܣGF޺fMw.WmFamMz6cFQM oLF\8!ZZʹv޾zhZO^1,-늋9bc%x[?T)ɓ,4͗..d99;wN]oǎ *<.q1Ǐ?u*FcOH!gݺ;wJ/V7x7dȪx>".=Or~\mOW<嘽\~Z0z[bbh[pPW 1VTn_SZ46MF\F …$_U$Iܹ*?3P,ɘ{`ë (YoARRR6o}vIMMjUUȑ#+++;T  ,3x _ !os3=5 I0J^'¹ φp&?޺t7g##G `mlcc̆ ))ͷnռ~MML(K4-\KY5oYJaa;vd~7RDƎk;5NyVqq[Y%Aj *+{.?EPgc#ee%뫯/ @2_ݸQr~ҥ͟xy_V\^΃aiƭOȚ@\䉱*@Lg{b~ JT*Hfn.?)`IIRzzp3kjGSVZҲZҘׯ%SWE/^1xUW&$0R]T:;7M~~G| xĉn,-%$$M䖖l;2]+JI=j: ~' AP(~~~{cHHH4|hC`(j p'Qp7bl q &[``k 0w KKa͊1.eGD˖a6oZhLprj-[lmSeeLmSSҕ+**܏?(8wUi/| 7yeeYJ{ ԕ`29!~~ f(}^_Eh:&lߔJ%^nԵuHTfmmGUUGqq[]=!!+D¾~]#G562 Ӧ)Lh`W>{\Oϵd0 'U9OWۋ/Y"7w.ϯ¸677Q>3XFyH !O t׮wXAAK(66(ӳEb.oݻ~om]UNN5tvddi f)͙|t&6FDԜ:JeZYI0(T9SQ\O]x~١C11uAA㜝vCHC3cʦMS)gFMM7lذ|?Bkk+\L&SHHNwO3/aEx A/L66P4ȸzjsņ- ػ*O0>`IKCYYos['O!-+;sa:Ysge^7ag-VV顡6& gg,]?jXBcNKK34R`p'|}ءoȂ#--(&QU]|5ObII_\P25OLl02xxΟ"+KA^(g[>?+ټڵ4ghklTy*DB""$PR>tV7p(Oo^^Ԍ LJBBB>($Y_x6o*+]m-s4vdr9t(׬\Z:RSL>ƴHLl8Q矕夤xȷo.Z:sK}9/_g0 E(w7A)J OOh.2 | DWº1ظc@e!:k92{6F^ u.%猜ʕJqzڊ/M!o'O梁 IDAT?wwyyRr2ٳ-^]ee5%?f#= =M&jpXTАsskUW7=4QFBJ}TC#xѢek{UW8,^үMjw\{bE'L+gaAbyzde} =p@$0PLQ5ÃeK3:4ÒڵM65edF޾-m0jݺf))ܭ[ʼ/Z) JM-Xv˖ԚkjY]7/5./wrȈ!!O>Z0ndc jk%͙3vpRWl6ysʫW55bffVSՖW__?%%㽩zzz;T'8iVp5T5ƚpt0<SxJ*:k{Bq:=)Hs3ӭ$$06R(H?Iʢ;fӧ Gk,/j<Rb0\`$$ `&M۵˨rj`ฑ#)F]XtiQwvJ5_vȑ‹g8PlI$̣G払07JLKܶMHL gOfSoh7kk>J ΝR&xbE۝=Szy9)̝+s!UB?>"-JK; %$XAPrYeӧ )D"&4㊑#HK?\4~۶k׊_MLljo8}:Ѣ83N 3q̑# ( +W&O̝'m瘘˗/nnn;T g!8,,׀)zd!{' ,> 0 ָ/,s'ko e@Q(LEyvPTd64@BԴ!խ%i {ٳ $$EEBBܩS+V䨫,ܥm:F7ehiaɑ1>OݻEf](- W362mmeeZ[|"?#6&A`6-[tI/O~*.ڵ d""`0G33Fpsojb8a: Cƍ)e m%y"FcV:HOiժUG ߶mۙ3gkʕp . wl Q0kخ#WNad ,6 xy\u+Wblm˗=ZZ8ww)I.BShk/\%ay;;1+]8;QT$߼9Z__7oxF[:4RRR`ƔfVtt }PFm˖TSsu,_؊w;9nuѪGDNc[P߿뱪7bq,`lsꔙ"YX/+hh -s,_p^k+{/n s옂> "뀴6r$ 7(zz8* h;~rZVw1ekO?QOnonF%$w$oJupaY\\*cU^US9YL gl,dѣr{d2NYx^O!Lƺ)aTXRPzg+RLMttDW9rd_xa7ԕoƃeʂwZ[[ ސe˖˗/dss{u+WQQQQQIHHx?{l` F4i-ö#<ؠ* 0Fh-  Ȼ =?^F BqtjiH$(+Ë}P4css==j6HQC pߺU=wnĉH}Hޭ[SͳzՊ l6:z_~hK CCº"U4IMB栺=L2b9@@n#R;m:sb<"YwEIU;G[{Μ6%#|X,tӦs`j͝; x( WhgͧNJZL ?pןÂ:K!ԑ@"@C R{c  fhC&r )v*Jp/%AN5őhTPQ4.#%(C>nM-B c=8zz%%t&=TZg4?˚W0R".20 }==cnj1CiU4)D"=Ax"0ƢT'`$U(qtzK}]JLjߡi,fC*10EL*f׮QKJºD"AM 7u*qT" $V@@sBM~u`;gδ-]J{Q_nksI'O]+3]$/QXxTܜ7ubKdefpf[SCcŊĤ]Fv}zcw?f ogg7_jـ5X`l Qq2T8p3GC~hT^aD%JP⇀@ łHP8z7$5Gi,]]$#ɶ+iVV7ozjoܠΛWbdDLJFT͵ [Ynk"/yfݻ*}ݛiS`|#ߥnFc>|Xv04XZO$*7`9Z[jҘ+/8 * a&׉K[j Z|6;W0fbyj,6=~\{Ŋ~;j@@nP1cT*aG\#2!}}.N^R`nN`Ѻ:N}='+&`9--?D7580IQ:r$ρh˖e9S,>R[ƴ..Qyy۶=(~dr֬ywdmk5x`%ƃ0G0ARlӟ`J`<+_ :J`2p)hC$"К`= @C7 D44QPUEԺzzSJK9 ssZZmmCbZZKJJ qps0ĄrJQr2UWWxtba!HmllMKk0A񘘺?L 1E-oѢEzz"~b m#kRSPMĈU[ba23OGUJ>snVъjN# !!QQ4%%##!NGloDEֲq8SK- ~;y(<ƤJKzd$t=2A 7/_2**8(cg .^L>}2s&?tt2& V#Vw dlb5ڥKiFݸ1ZOo>~ͬ_M~\]]K{{ZV}2-X-` K!*H u@A8#8XL(xU[Y;ugvQHHHCj7p~W4nZ%%{N7/=3199oɓWWU_b5,V[%>8Аf#'ׯ++vNի-$uuAjr|dQYPSGb55D* |ݍ{R ]Zɯ頑"oO3g*>>JӞر'22:77rJdfU'/m25ş9.)QQap8 ePRy83f?y"sҥED~]eTM/^hj*&t@ )S^%'SL 05"?,X _`QQ΂ %sXA;=R]%nP$EA r I-P$"@c#()1 #%jj85t:.Q 2Ӧ{hRG󤥉C.1M4rƍ3g*cјĆ[$$t:Ӧ)}Օ9kX͕I[pFN,gG-(E5}r=p/kDyױ5å7s8h`I}S{||*P۰a9<~$#{TАgsӧ 'X#Z|sׯOBQ:?OttDBBl>pU`E-nX![`X(n RORXshw amO3 ط`^Hʅi5Rbph׀?yBix/l̎A̐ bcFrt,DEQXSX(++ImGǾ6695ʬxƁ+nxg08rr$ww !ii"Ҷ躦&xllʕ66R&HH@ ڔX-(U3%*zx;}?j{Tc'Ps(-m[-mi{{k~g{AddcjjK`_j9]QcIN) H+*ZCQ3(Hj2a;)|GQص+< ֪U~0@Q8r$wÆdKK J@S\\u!FJBxbp)\t88 ⮡&OD8y{pOOٳGŋɯ_3""4ZS{׭7}:Oii-_r{`Vi32ܱ7OȈRY^|yѿre®]mMML--Y#"쪪88 T~%QSv YIZYLC44w-EuC6js;;;i̚5߶+sܩnl,޸}Rwu0>e~)>Jm~tt|J[yרU#MOOMm-}ʄk88QQ_oB`U=iPcA] "TZ4!(4@VR("0 4ѳi>D!#ZZFOA@^QtT@ٸQJA^/ ֮U!`O*W4I6!qɒ86{dYhESIIq_Xmu77ggY//{Mrr&_mg'>eu)aXr;֍~w@9X,f= W^NLxl@QhA0֛X,}g,*o4)kbe%c|~1ҥ4LqU\1fdH?X俑"dqE3`K;PAW`BPa!Q{\-'g *l怢,Evā{3kIK뎸 g89+(`8sŵ]]""퓄}l$-}bg-~a 8~/c);l? .ڻ8l6]/ziY9_7 _xt.jƉzG̦eq8LnnsP8SS~|0%K^RW'EEEzzǺuIIm 68XMK_\7!}ʔB99&I &uuMyahǏX诿pH<|8nq|{E UȃWKԖY~H0a8[ & `0ZBZ%"dH+2ik 6栩 t FS1c :0q"_WǹG37\]<{{oӥZZG73Аr ڵ3k7!{uqAEb "vܥ*3ҪsۙOrm6ʫD!TVXRG'-,D ׭{__cs V}9%M˗԰/*P KJ:ddWlt'DCCm ٻ7{옿35߽Y~|? g^,0 j3`s@k܀3Ұ|R|\WHʀ细Ӂ^ tma4$%ݳ[`!  gp' ݽK QwƴiRgVFFRe%$뛾xp9"$#݇ɵS|s -%OBYăԶ:V |8U4[ׯO:{O†ϟ/OI )۶iSˍ|g8rn۶R/H ܱhǎ"iiBX:?9tɒrenOs8ڵS7mJ)+ksuszf״pX~j\$m`L(6@x3s`N6` 0X$ F?* g?bAp0ս199 n#(Vqz L1dl,T_\2?8:ʮ[-$th͚w@c}W k5(dU<.]_`Xdw$VuUsZ XԢgYw6Hhh}DsVSkCoA-.߷O@㛖.fxh>1g*n(պpa=!,>>%%%QYޭ-bMTLLz 3- h}A<(75}6,򧟔N4woW `OgWr[Q/I@yPBSLSPr2*Hʅv:h("l6К~ &$@s 2Z[Ʉ2Kb0@$"4jbBJLlfKJz-cm-nh`?U^UUpxdjAA /k -tvdn}Bv} miȌʉ$%UWG$֩HߪwqQL *-H(Jƪk,څ`6 (HHJw34Sˆ (_x3{s>r ˊ*~s_ Cgdݼ0r"o`""Q?%';9wZ*--M^YL&+)RRݫa", УUUl7jj|;w* ot'YXH,_:ck vut7%%M!xymOK_WrI_67.BAs: IDAT*\N4Q\c0y ^ek2pđx x-!zE?ϩh!4c Jvx8U||ҚN(o3*GްA#)+;#e\2N 46y?thHYbyH [qsX 4t8 UqQMB ϋZh9BG̚ys_mՊoy:~\Ng''mܘν rϗ:qBYGA'%5cO .,O:^e 22ƌ15QP+yZ66Cs?F;FF7lHʪSQwʹQ;Xs #y0T kQ^y16ni6PA f;BI(AFd ^3z5rhiHK> lm r;I&ٸxD+++3ܿ? pQQС))mgz"-·Ȯ7I\8YLr?HPt7Bd%YE^\1`ի}_~~`{/>F_CG}J{ '/WLzen rwOãTՕ+9wP(SFvpRROH7.\]o痕5-\MrȉUi}_9($-$+q*.Dl+  aĀfQ*rou>:J2E2<Iٿ_KMMر_ߎ+}"t:͛yާA-OE'kpblL& bž-hQpodEEA#W.='cݔςXe9SL+ʉp}0ѣqʋ8FCQQjFFݟ|XV7q uꞷgOΚ5=zTg6:ZKˠz֊:۶/#{ij`]3`|_a"T_B\zXwC>'& }ւJF>ȈX~pouG1f0iY~>AZނ\!.)}-;V?{ٳ Fvv7we;yyM/Xy$ )ٿ?Ν|11ڑ#ǒ o<y}kF.pj'-#zۯ$`1B5vٻh*]a w7n-jܩ&X"طO;׭DF֯[WYe|͛:oٸq^;q"2m{(/g8;ֲo߶_sK jXXؼyo{v԰jjuu*fIIc~~=FW)* +."B㗑oU4ĉ|wwnA6!H׉a$ҍ_&U$P5Q><2@Fޭ(?{̶J Ix2( x& 7kbaL%A k> <~)X^:$*Eƍ.^To{*̙˗K7n/RU\66)͛JGG]z_܊Xu8i-WddDb/qL3o x5UTJmIA+If29Kp&yyM;w,.-ODdh};Jy9{˖oٕla:ѣW1ß4#r횥/ӋNJtr''wnάE_Oa=~l;lO]X$͛W)~eKE?"| eL&h`a*8P2"x ,S8CG1``AEO?&tsjkQHL s$]+JIOgp5[RSV"-+K>ʕF/^Lrݹ|,/yWTŸaÀ!C3ܞw?''nxy%egyyh[:KBB޽9l6ysѣyHίClB][, M;mw?ǔ EH8}UTt2 p`VxǺع@u܈%vv,&YY4с+[XakɓK&'rIw]kW ;"W >]YYU{g(I|||o1 /rqR3Z7n-{CXk[;-L)zrL/n,Y}DCya޺UhQRY従'R7XgVFE_NO"/`j*߻72UZ ASUPk|&?@333GR_Y"P_϶~]`A#GS(]s _$41ĉ}ԦM=h:t(2EE ̦Nf;^jcܫp@`/?EE9s+VTC֬m6`|_zWI$rc^% <\M |G`(= gp]2| BV( Mfo$%kHÇĎ?E Y ĕZ^55SOPqsMXX] @#{{gv>'&֭Ctdtt\]pOb61*+$jkYEۘ=\X3C̭ lB\\;VPiB*h/ 6ӛ0rM:iiXq@o{{!!Ɩû6.>MzZZӕ+U, Ԣ"55^>dnQeeÇ)fg'BlcܻWʕ&\nwLaRR ={K<͛||ln&߿K`29>f9szXլI<5Kw:M7, ܟ#`jot1aCB0٘pX KMeaQd!E^xxm2p84 ;o>zXn;+ S[VU߽˰?=oWiJJSJ{ܼY;HQ+/ ۷߼YM3*+&HL4?zT +0dlhh)> IK-^5pc[zS|^]{gL?c%կoZWan) 0'yݡ 0B9;8:jHJv{lj:w(~~hgHW~Z%.N9xP[_kk911 7o곳4M[_Ufj*8`l7fyS+,z5r'N{xD)xyJ@@ܹOY,B^^pJyM9|8>.ݽ`{iupII> &l6RRQMN13ڷښL~p*sHNH_8lD}Y5p6d(tQn(חёXF[#"65qN27e_!V~@UUfdٍ%%XllEPCw̙]h^M c˗tu%EUQF黗/ePPaw8wC0YYu׮YNS||^jVẃ]H{ $au iao`UQ@I0N>™ h)w\xCס*;Öbu0$@f]QQ!S-)),7k||c߉*_E2ܒ8CHlԫ+? de%&SRj9QQeeM/_WV2,-e""ȦJJҌ%XrrZZ"UU!eeAa/>fg]{@JEc%MM]~b#%3V[nU}oJdR119:ߙb!Pfz\&NTTU__rL9st#VٷFA8okk ##));%|YÇ% )0И7Zȑt:sٮe)8񁊊ț7=GZobb|7oR{\|'ڵvDO~} )¯`ci[<"q( Km3 up r1ph:أʳPӀ#諆FL@/%x-!lfo=q()SaaG)'~dfuuKl">^VOX8 ˗$R5th A-ñcWg{{wYԩC\)xC7 3rU@Y֙egOEq(FʵpB󽶨ƍ}bTTD {oYtIq]zyNEG*kk֝y46rc>44 5eF 0oޫrQQڳgv%t+W<<„JJ"g#xΟKH//oܼy0BQWԼWTxOВ-[27n#H|AG,obI،/`хH ,iLB\%ؘm(@UW&S j)z|p4 nT!39ӗ.) N IDAT2 JN͛izQIO7|nƍ G6ܾ]ؽC䥥I(ݸa)(H ȿ}hc&O uq2?C@W^URXHⴺ7w@AAh˗+YgoMiwm ]\Ŷ)$$hw:T*'oɒTqz,l6r{2wN?޼+ǎ ))/g\bUA`Æ]KK&O qB'4~ uUt)ҥT&.]&HIաCyWP(xJwĶU~QG"+q)0\ ϊp+ Xd Q~\NeVȧsp2FoYU,qD};Fš((Y,u$|D5,{fÕ+nM,SSjppSL w?993-ʧӿ&jڲeU,?C$$Y/YDBIŊkINi&a\,QOU`Nd҄ }\.\,?h+kk B:rŋًqW>%%GΝ+>=+݁~:䕖2<1QW籺6*bҦӧz&ʕw),?yݻ-H dd|{ٴ]yyӖ-ܪu?y{׳x#?'=ZDD.5ӝOT{Gq!k_:8³\303R>*fX 'L5QU@If`p^ȓG[r  y ??fϦ8p2D13㋎fzyN.9hPa!so*leo/yNٲeiL/r'۶0(xw))=U{ NqaZ?;˩sKHD%'9" _:L>]7Q(䨨ѣt5=cBZZBGjKHPo(ٰ!(;y@Hr䈎t:sɒ7 ͭ]M 8ߔqwpLܻv G7r Ć OspGjFFÖ-NJ;^]hOJ5k֨zxx1"*; Vå^j8 >NFt Xijj`iіL]ܩЬfOռ??dyrt4qn ֺu"Md?lc#wo7mL#[{0k׊-9=aIIsz5Kp8ܹO2 6`>;)N0|A,TFL汄6 |rgd׆$Nhi){wRTThh51B߿d_ytSW]OaÆx M{wȈ5\~}l}NG88=x}|r'I62X^'mkWҥ66z3gvxu?#s߿i&QQQgg7oN<9&&,Q[,ͅ( f0PH0Eu8dUk4. I!4IA(`c&&Jq+yQ()a_> E>ƏagG,%_S՟? (d{~=.}{/Os<?>QvXk^7Ec$`e rLVںzsk Z9i(436yi,] x G\\22j'M(/rNNU*GmۖՅ~n.[ %#M׆$pZCilf[!MnnO33D|}Jw~̜N )cd$sp|uuWgJcc %<@ذ!'_E|7 2ey@@_wrrr&L &&&&&6a„h{t]UU%$>ٳcƌINN(Dkڹ\5 D  lLP7hbíL_+aTq/x? GA?j-~7_a07~-tpc|a$ҳg,_RАOz Ɖ3/43;uJR|۶ςTGG¯~ Eȿ:@I7͘8t͸s?l! 85סPHkך>~T]lld]X^TRYYpΜE?9:TUiiڕ+?AAK#fZgpyy[32ؽHK 2+eBCǩwMF:UJ%<:YCzxhdu]S///g8=m)-- (,,F`eE~eKuҼyBaa o:gV3%֮-FF R&%|-Ulme7&h[ U &69;nȻC̘@[͍G5ז׳ SPC f;wRs|˗svg=il,]흗Tw <}6(W~䉕]ڹɓ'===%%%%%%===p[.qqqRQԄ% q><)~EAU x_2 C %{!G3Kz8 a# q5y|)GmҲLԔB{r$*`Є 99KƉM(Nb׮o z͞X_޾=+=|χDUtUgg,)ʦb +Wx1:H2CgF\|ONEZ\(תz֋p3UUE=7y$]/vY 2XL.mKEGtqb~U-Y*l~EEt>X\"4VI{񌽽8͛?leMSWTQPVƜ:ݭ[e66;8lu ۄ Zw:jƞ={ZijjΝ;-޾}6t-sFȵpʕGLLAAF)**N>) '1 !SBTd7D4DZHpBW"oΨKY)̞w4ƍF`0d8<=ɱƍ~ӅRRXWӫ$R=Z~72OI$<;oҫWs$we^C"…e7 a7o;9ieVZR'4uN=YBy b]0ifppkБ#9#F(zyxQ>}zdYYǾN-3GiڥKS9Xo88}bt}:EEUZ7HVCNH ۫X'u5kL23;w!={R?/[{hw VVoJޕ{>wIpkj| xQ~%&fB555QQQfff666o߾.!G(!NUp\Lƨe;pȂ@N~/ZJ/7[S5cwQ1i -( %""Z]l,-9Gj ښ5 g+JJqRIkK.,饝De˴h4ii5?֤x,?>B__j. uA,e8^E*j傹V1"²xDŸ$b'<ZJW|UΙx0ɂ n"&v֬Ī*֤Ir۷LgZ֚5o ̙]FsPܹsI´CtdKxѣ5E?킲&cc ].AO+-K{TžIq ]WQQy TVVJI IKKWTteZ*|4iRI TeeԩSǤ}7mڴnݺ_0Hz;'p~@$o<'z fۮg I!`A"PܬYz4]xIM^pa!lʊXY({i&6Z<&HXԔukmnnUvs;V,2~޼;>>Ü(Y/^Ї`܌NsW~~b۶Ğ.X,!tzfF  R&ԑZ7a%!Bk66:. =~!˗C2ɓ>>y*ww%]…[f0o#:foMQZ-W=vr3IIu˖fiiGشiS:mWN-8XH?m k_{^ApQ\\pBIl6uk #e\1:0yِ!OT yW@ttMĉ}.9''WΜTPP=;@'&V@\N=}{-$֮U߾wuu#3ݥNTP/uNLHyHwttܷo׷l Hݢo׽0~ʟKKϝ[>s1c¥K}MbzG::B&u޻c-^A~V{WӧhjwwsB^}R 9w.FvB͞]6oΝ&̝G"ad~N#Gܿ7+vrm\\gv`z0$$DOO-:׮]n&5l uo2rPN+Rs@MMhش)\(mflaauԐH8wNU[vQ3F5͵_w#""vQYYYYY}H777>.]VLL̠A޽{ɓ`GG*jy%!!!kkpSS*# T=`pPXQ\Sq1!c͍q~Rs@` Cx^b.Ã,,L:wQP$yׯ+VT76RW5Kիj 郏5pXPP՛&!VNH{y%aa/^`ggw֭2&뫣xӥ1D (~b(eA 'z<̇`&p-a@ 8 r( | !hD,q`ĹOVb2p 3g Ѳ'O"1~8^]~}}itqyuO;:'$T]9ڵ5FF o Rmp<}kתg]"m GGuUU%K`ל>]iӦ%:p@JTLcQV!q?ɢ?'$#IOu֖OVXm5^eB^^eЪAAzzլiKLqqQ`3RSTyT*YS2s$ؓa8 /Kp2Ľ'BEU\W[|2,4k&Sv\~ޘ!FXMng;$VG>~\g| _~y"vNɵ_55;RӉAA4e۶j FCCC,76>[3z\*4j̘8?"AA…j0-={J*H[*vʛaΘk@ٴiӏ(cȶME@!|\dPt&Fɣ~ *U@ 5pւ ^!@#S'cWa1 , b"( GC 3PQ{},׏  hu鴰0JJ8T-6|̺:ŋUSH+L&%-)I}.4ak+d UXXR8lXm:Ù3IT*y>_</JI'ExL"BfUh2AeDDeπc:H47i" MA]޻{Wl6l(DD: y?DT uy7t2yr@s=o#zCR)`84 ZZ\gg/rml埬S('m(3^h?z$b?%*3.tW7nWVRT(m???PҴ޽_*bb'Nᡷa3= |>5xB_…bWW9sBBy9t)Sb8۫>mߣfpΞ8ܾݠC$~ժUuWZrHވ?3*h'r&0@2$z^:BBb-D Ҋa8ƶ8:D%0#H % ~)#r1Ɩ]"d0e z5YVSpe`5Y9gNaEEuuL$$ǏWϜ9۶YZYmKn>?7p |[ZM{OOsKJ/8b#U'-t\_VTB 8eh$lf'KbLz5$ۢr@|``N4$ =vz```_f njp 7N0QƍhZ8 !A@R0RG/'s7E;{X| (ѵ2rqAZbP̞ 2B‘A B_G 3g*ڲBbګ0L&q򤉖+?_{wN|lf٤ իҾ}d9!ի߮'22X[9:~HzXTBT&k 3 Pf!xw:+KާUu<ggmx79--uGD\]K:eeefX[,x*oŰ:|8}Рs$S'O[nMT^.ݼڵFQ03SټٓEhTT..:4۷夶҈_ ?O'OZ.\h"O材 ^,"Oל5RJ8h?Ɵ`8ZWLAh)vi>v&Y6vd'fa{05*"p'fwFh2D% {e<6PP7{PDb>wtF7oܾ{?GذC]I}ԩSeoNO2p%K2>ǖJPP^\Fv!+W&(e}!ȴiϟ|NGӝ?g݉:SCz᪼ GI8ih(<>Nb0c:QuxOן5g8mۙ&}*m[M##kԩ>m𮬌<~mq ֮t) 0gaa9K>{2qoo=J,L&YVJg4 pg { ۵]ppѦM?W<`pNfbh *Bg!(@>O#͡l-B'kD 0N@bsm}ZD *\~]{tBQ }Db- #]ݺ1n"͢ڴḺ%7~{*^^…b>lӶTJZ0o^\A}`cuuNhhAD/ 44lz/~W"]aR4 kḳdJTӿQNXSI,ߣӎ cGXd$ W72?w0=]gNfh`C#wzm&&C*E3fz{l͛&Mxkך=Օ~ǠC b6'9k={"lmէOo?P+ttx23eGɓɏ}rrٲ=zbBS%%~+JKɹs.]*9RmnkE'XUє? !l`w,i `V30 | yƻzw @|6&;Tܡp]}f4Xb(}`decA.[pt$֬!di[U9=[{֬ѝ8Q32| >X%oo ?|i<矛?xm^L[Ž ~{_{q`vL$d8J=}{Y+QB賷tҖoUT+b هب)_MSqŵk:9 >-3'IӦOnj޴)￳((Ν36mJ'\S鱿JQr/6s<@y&M .]j)oȑ_hSSUh P[a?+&O/\ԧOm ;f+B/S&W~~6髪i?!SGJ0#pԑ/ŕ|KKJ} &q4b![$#*Ix[LqxCZ K3}X@,eP"+g?3r0ǚ$\lgvP:粙X5XvגSt!*+IZX~ϊ[*W ]k7n\BHD'~œ'-Сl:~<_΍1eGt:fL}iWD$%Kye~ڊk=tm^DI.[ 0d zݿeJKHHo>έ m[G;yzimbi+>K7Y7~VoMq Mw DȨ@9:(.]Su.pBn9 L\Dd`+lARHG/G % Y JDz_a0`b KEj: % Ȩǃ ;4D\{ڕʌ32*o(bVYUVfgfLmR{ on̜5舮!PĽW\\igIݳPn]p2;uuZ^l+ơ>;B_Qq8yC`GY0vQc: Ѻ5Hm(;< nPH:Tzg%NN#RS%߹Ӑ+X5GeGʕ k_]жN@@} zUWKN" Ky,,ĚMOHxɣ:wĺGO77NKƍ+/P^>*JlYDLLyrY0`m,izsp+9Ç}ӧHK+t$oRY/^d[NKl QZRB,dOJ1@'R6$߹ע4( g{n~>aW2-[^-ЮwH14+gR.@K%/x0U`I!,a.Z.@?;df,k{s8`mޭ'_oh?J`0У=Tp[ '[?R#ŋz1sdsvvǧsBC-]X6͛jrâE$ g5\Y `*V7S֪n 7#Og|y%Y[3;k(sg$du !Sqtz$*S`rW{{MSSZ: ;v3 awRmNr.%R;vu`.֟߅*UGUU!{9*'+b/ݻaânΕHɓ ӓk3_pgMڵJ$y'#G\Q1'XL. &";EPG856!AF0 iF:CT/"ftxl) "5\zyA(8{:M\!տ!$[v!%IԂ-4oκq|Ѣ/uZۧӧ57Zܺ ,=xŊoDIѧ/-l#&&ٳLMMYF,z>jQQY.U{OIda]Y8WVL))1hλUh0BۺIKK)"BtboǏ|ܹ![:ikK=sL\bbh7TJ=_%fgWY`Eʕge [hwoڔkWnrr={~%i+*,(_e{8Dʊ k .VzO:CoܸfMhQə62442EUhص+NcGQ(-3v p.؊EpkGOQ``Nx4#VlmY7()[}6sRQa=jܷ#y?Li37nxNp|V/njUx^"qpP:86E斫eԂ|)2@cd5T2 ]|﮲$TJ>_mygǎFѧO}aH3"#E3fPY參'OrW˓,ڎ#GZ*IPн#)8  {Ē ]sHL,o *۶Y^⠥EgܺuY [[+8aNS#Rk@ROHl?t)E7],jmۜڵm`ŏݻ_Uz{-]j+jG9:jNh۾7` L\b>ʼnI^^Z3g*(lڔԥKwo`W9G|_Mߺ5Аz_ϮJJs ٓ&nj?rgB. QƳ 1e=|&*#gCA},"{_ u.GxO.&wC[\ B[PU-| yQXHgڝY~Bʳg)67-/' xBn/;)#I,ZiSvEa~~_E) t Q^5^iiIZҗ3۷XX07l(2>bڞ=JJѣy/7dP Çz\YI=~\Ν\WuV5*JTYefjz2 X7 >w`WK#D*j'p&3:5D28WrsVLf?Rw~%ȑ֎۶Ѡv',ZL(䤥ݼ%(6n|5~|i0H''aì5 30S};77df{̬PQa?oh)eA6,ŋR//M{1ukIf&+T$KGi4h V$(!B$b$WMc4ի\ƈWАcPWgeI K!C"SkR'֭OZ@``Ɠ'u26h~.(y*E=y&F󇄽̕k[|u ~ WYwX6lpۿ?ٳLW,]j{~̙/qjھ}os,8h׮%KZȿ] UՊ'O2MM}O ]|nIT\wROijgE!!e}Ց Cjre3RqR@cN " b` ^:p$0rq1f6[i )LtlC`20zB\x f`::o8lf9# {^ Obw sZPa5U.EJIUsQZV(/boQ\֍?q- *G,R۶M2ݷo$ݿOEiDې!ãz {z AF631̤0Ѱ~%A%] ;`QSQ2?۩luu^K7YepJv6n :{zxu;Wc__7ޝ;!!fX>҇51IubbѶm&&ʿWCFF)֦-!M04 ˫WsCRjTC??gmm'&>7x# :dJJ}oݪ=[yjUh V(Hwt SG|H#ES詎RG `_,D QQOC;O~̄FX N_gޠHf`CM;EIIׯkIZbwTVF+z+A`^#++*Y?le`tèQz[z xQ^ sg]x@^oUNj^.)֭V &Yjm's\Rsg5~Hi-k,UQ"@GoOI,?X\.GիӒ*+kRbEdj*ͣ~%NHw/31xZ *34T67WGIRO#c:x0"//]gQnnݻknhAǏw]ĽvL(+ u\3ekU6E ? TP 9ƩJ %abLӅ/K 0-x}MGp.* Q*ݛp>p,_ ڡESx?pk~m] 3< DBRк5O bW0ۤ sTQEWvEM[811ÆDDK$ߎ]\-ȘLCe^WW//$XLΜΛ5udg[k N4h%s^*/UM.[0 }kD[;; 55iYkWԖ/eoB667;iiP(,ب'Y׹ ebp0%Ξڼ9Y(dv﮹h͉;rmfٳo7d/$WQ?ܣg ͓8u$8@cE4a WA; Ё2SL p1}V7ȃ8 Iř(1 sEg4w@\A~ k Q <1,rwß @[OgHGF*VEgkjrˏK10Pvq(BXaZA\qhƒYt o92*2dٲ&KѸ2;݂\. w4`yNJQ9dwRǎU^^({91`ʝ '&M +PLbXnE`f.tn)0lsR %ƻB`^b\@u$ P8>bx*nBQ&~xSXtu1x0#dvm5755jJ'O:B A`rݍI[fBBG{YE*ܹϜC ffx zI,55*G$ˁL+O 㮷kAbLO ~DUU%7wY%VhHZF:&M736Ohۢ 11wd2.x8UV͓mA VrrPDIRϞƎ'߭B@h77͓[IRΞxcT6?\(3Vڲ?DoqƜ`=Rza \%S-F3 g1RMp20lMDZ9VS ʆZ"B`yB)5WQ&I] x?dp$8wI1crKE$U?1q"]jm-ZKN hCFSKSf~@K6€Q Qt7%%Rz%՚BqV"&{;|@v՜:Jf R,@V^\%Z-$${ ֜5jPWV/ ) &=ϯXցYW$޸ԡa [ U|}WQ9ZmEDyƪUt-[D]Ц C:W/ĉѣygϪ?CUVbGy[o1߉xq$`9{'чGp-h/ F<рdpf_@?+q0e0VC&H)'eGQq:lEa}Tz4z:x3k%@ӧ7jQ~7d7N_ 3gj*)>>9 K$g?<sv]lƋ'S{|>+((/RA‡ņ5kTϾۥQQؑti%nq7ƇƜ` @ʦH́5$@w>HQtJI1:4ťdUeD4k/3>G~V~Z>7p'L֎qH1$}C<.6F:fUffĖ-̎ 23ݻUDEҺ)^ˋhذB'O6߹ʕV_WÄ <s\k[[~67Wur*,!/$@LjLKIЭn"AOID|q-,?%a쮪YХysCH$E9;[MU!-Vad޼mۜ}[A2ĒOϯhRGy7ҝgsY9p`!W/'hq8tV[գʁffS&-_^tpY06lH-[FZ[c2zR0q;FƜ`U5*ϣTYYو%+$(=$)\xT2\΀ Cq Ʌa s 0}]t\-U43Fa)6Z;@V>~?_} 0f2a>b[7qۙ`` Lܐ`2 و4] p&] 31<ȀpԆ&\A[עAR`20ZW5VHF{ceaP]{3aj?0صO$&RW^41an PWgKز%yS''A]/_*IJHѣpC#oݢpܸ&WMhjҦ-U괉ŬuVC9P-YC* )_XCgKRO[[x b{xl޼yOOǏ7WQa= 5Ѣ##ޞ=-*EI$dhh4 Vjw =IcG# yܿ1~<=ff54/:60!̙„ wϟWXL͟\0gʕ#~,4xEi_0ނ<2 6nWbv1p '1P;%ibFl1z;pg+\ mQQ<<~ :l*{~plMƽH If-}GŌIvء$5úQFFMM9ffm/\PPF `>m&LJ*'Y⹸?xOjff*$IU V[/9hBh($.BY%KDEdMs/&M{0m۶@Cs kMAQ:ExxɖNN4貫pJ­[wwLwaaTZsZ):}:96_? 6$Μmsvv++WfЪ /_Ry_lP"ΞeqjP"áCjkk BwwK.\v .*RLC~x Ն PeaN؀ H.^p9 T댗I8Ar: imVLASKa15X6&M75ccG9U37os֒غ6 M8%%MY7+ć$v7X,&wH>vvI!ȨQf<3-<9Țׯ q񩂗eGx!AZk3kp EV\X}G OH,oh vluF"嬬 /w>}:95f̞MPqn Ϛ8񇦯x.N,^_\5ʌϗ)IvvVٶͪsgzCVLr挨Kˮ]=֭GTU+ULXOgdj!]vٗ.]JOO߽{ʕ+:;vtqqIJJJJJrqqԩSiii]^h eeGP2DP> %sCw1*Â3(T]TR@^%FDoQXqP`,^0C5 Fp e~zryn(6'0# W eԇZؾi8x5u enMl*t IDATlejNW{ʪwG8p 6V=ujjy9zdV۶YK!{ܸ&ti} ift2!5s4g@([ʠsdR2dzCQ'FjzNOx}33Mcb֯ՠyy9s^B(*5(>=j5]k*>yY*jytǎز2)vtI{7];9sh êPÅ98ԛzE*+VpeN >}J]߿1l򋟟wuu=~ƍ}K,QWWWWW_dۿؗ^h wsEH^8$WPn DpH6@L| a0M4DlhJLz@/KDDSTƀ(Wƴn`8{A<͍1/Hkx ? E6}wO?1,Y"MH=b2a+;>^:c^yҜ9ZG=]rB7^ IR&:}ZֆTN!С&NHJiHĹ_ӜcZ5F6 mT=r;s@QS~AQVh\ীv͕Y~]?{&M2>?k׮n-+ mpZCCuHF/^dptwcܺalܼysyKĔ+ZEU oWoEWpdĈRj_*YJgw'`x%8Ɩ-[Ԏ^:z華=z˗BcNTppEO~La-dUl ؝og!v%CG_@Vc±HM*Ky]]47Ì^Pav6N'>DtívI&+~E[Oٌh`p̙ .'|Unݔ ! 9b+rw Opƍnn>>>ͱA6oΐVtml߾YުPp0I`tei|_ӺI;%gv41Q}EcL+wwͥK#~([0ѡCo۶޻6m{~=B__y„ft._@YYe~~yVr f޽;N*%gϖ믌3:uҸp2=[NTCy3>{khdB]]Ƅ ?~wor͛d>Y`+37nߨ(GBcN P =y]*T{2)Ôf8pg!_r,@wmS \4SJ8=-U=!3u4wfZ0@oUG2ym'EfvE{R@mPVpo 1i;իR)?:26oVup`S2gN͛M<=6k? `"ӁCCnj{B@yy#Gh_ʏVHۣNY$=dՔ`/U|~%yW/y):5V(dMoe%SAX.ktA7}9/ @޷O+\Bn@a|Qe[dϿg54jh455BcN lUѐ-3 @4ʠe zh`f8 íTYZuHHu Aƌ1ss(+Ȑ^];Zʃ2Wސz㱽ژ<*&+9@NF Igzr{3g޵m=vZé rҤW֕'*ȑɗ.v$8ydbc+36f衴}*닥7o 댋gf K」+6T,cocލcXĮ(v.(齳lߝy?D]M?7t33~\Kٚ5GV[`;wZg+{XзorvvKlqE/!A8~|\J !h]}P}]7(d8Ҹgk!9宒 pjVon} Ve9BF~::+]<)8s&*BҥѡW7,^#?sȐnr̽SogܿUQ-޽#U,dIRhhi~_ΠL|TIbd*ӑ#ձxJ>cFYv6eo pjHc[ՕP*.|a^&[zYGPBGfff߾}W\٣GO?ׯ*,,}߅o`y@( M(L j4| Ә. pCqm.'2Al\I-aąL<X L},.`OF:· sp$r`nN1'*߁,Y,|)$`qZFvHD/Yatwg<(:qBeQBCX,cر \KF&|bbU^S\ƳgELBij253ptԉ*yOWъ5 G)~cmE= f.ՕXo5plϯ*/HWW .*xֆxݻLW/ӊEL WJ;%QT$X;Ҹs'OKݵuw?yRf'N4G͕+`ݿع:6ZѲKI{](̛}}Ƀ56@5* 5.EvYmUӦM_|'Ѯʬa0:# 2PN$@#RLցƾ2G3ʰ5 " #.$ zLo{ޮhiq.:8»%cnH Fv֞F)/t>A`*7S?Am}RY,:#~6̄ aaK\Qݝ{رzo,6ܿqfZjӽz5j}Rfpp}nnFqqϟ7uSc>2H2UR=wQ]$93.4? b5xwBKKcŊSZ~\NmwW]Sǎ%D={<.$EG?ݹޕݺ㱚4Q?o_bll?8]vPV&0!Nwpnݺ^JΝ<<;a 6V޻wի5wШܖ-S+l_oHeؼʉXa\߄ϤvvĶmdĆ TXXmd4ŋy2N- Uc3j,C++qW6 ޽.;w {@>SmֲȆ'"d5i6zRVxܭz)mb^b)~ri[lrzꘜM79nJTڷ7SoaH__/ bĴi(>lmkzTl޼2^^;uj tڱbw/ɩ 4T?$կ_e˖_]rZ)S<~xÆ ׯ mۚ5jK,I~T*}J>9 7S@]k?C;J RFa&>>Vaa۶ ={oҷ/^ul޳翦~F<ȲR?7ga7 lI]/ U՞!A>>w:ӾsYϞE11^P @DcF޽捧Et &9*GIÈ5jQ%%3wy왭o߾ڿ 2pJ$BWd Py2 Hъ3l ୏"^(#;pA{c[6A!AVxMӂCQ.ƾ,'@ gf k :PVA$h6z1$""a N>EAU2TLkK/&xJI)kJMMǏ <=,+)OѿQexL.#CfmOmmu&gdzSm۲o;3ooŃt>Ĵi5S8{~^ƿJf5AOc逝]```YYYYYY``m@[-,8@}`ZQMw @Od=i(q\3]G$=x|g7ʄDS vB3#RIU,ZY3ݑ#mi%4gv.BBfχHWX_Z[#ϧ^mb0p^Ӧƍ+`a qԂ75ԸcI">^4jzowKꮡ|0ӆaMTXnvը2QmMg`d "9"*hKu)E ?3 LUR7zUzFVCIܹSUm[V2uT͛i:_Cŝ;eX$\s@ңG&ܽ[}{jppѯ6b0Ox!Jvv4j9y҆RPnI+k>ynvEQ=[Ngg#0԰\Y .NƠ@X7o`QI'h[}eci $@80[ `;&.`}sp&̱ĉ,0: sF^9bsMC;l&^$ 7v`0p2=;bHoa*gb!wوƝ5r߾DA`E||}Fi)bEzKSwEء`26m rzq̜t&VGNLzzpܓY3e*!( 1TƤ${fՃ'(!-rtus3 14db/fdg$*BŞ= [[XY5x,QU+#kPWuss<sxu:D޽<c M՗ㄅ ,.)GXGԮ]l* )S4EGDޒ%wo"(%Gۑ_[M>J?,/Ad;H!4@܆d?L8!H:P`g ix1dANcؒ#Ʃw@GJ(0#BS*X ke:V~Tb@K;]9H BT< '/+O~r:غoWmr4MzPVvzgkH- S'WHXd.ӥݺ%ef6iΝǎ5 )^4zu4>7WgO|a;IUm{\'>JM̫.<@Q? ݈X8}VWl Ӝ"*f|a?3䢄i//˗SR=ψ֣F\p˺Vz}bf۶'-Ȃ]5 4믿&%f-J[r|…q""D}&Ϟm&:qBWX2tln+Wo^b"r.}f\3 { xhy}@rq,8-# }8G7xI7ᦍq:] 5 fvRT,igS$#0rTPO vM]@gi?dU}7qπ iY3">^3-[tZ&N,sGMѿNp}?>ˆw?o\N/_TRf>fR)u~ -ZD򠠔܆Y=<72GKg/ybސTsAo :۰$- zB7dOk4@u痰fM3OOӻw^]zH2IlBVuU]p$%py-Z㙢 L`o"IbFG2z^OѼƈz7Ǯ͘QZ\Lh\]ŋu .]j!=?McoƸWǷOl p"L4AG7`G0A(Ʊсs2$PvF!A-9ؒhoėOVsYv=&5CaQ!%j87 IDATdC!U`_cs\~O" !*dbftm{*GC` bŲeu(Tı6eAZggNh sQ׮I!! SnYXX 3g:jޭ 'Ef3aʨ}%'˚58qZ=}'8:2oW]=}JYpv&vb ^P`\$%cx,ƸBuy|+e"ICZ_Cq|6(sg  %JJу .&aex!  Ag1^bOi R2ƴPaJp})}aL$7 O,F9lLk"% :9`w|.D̞`y3uD(įi+WԌ?0OL1}zS}XZZ\ɉꋨz6ɨ'BݚcNuS *(,-n)[ޚJ*OT8Ri&Pn\}Pl6m[&Mݫbҝ8N+?_`WI<@O=gNq DFII01Q'7>\I)/5mI =Ց:{^q|hl5+33e{ɑke^j,ԉ=cּyJ呑t߾Y_Wo³Hou?iS/:<Wd&Fo!n 6rP=h؀Ї$RH=$720FH2 1$!|aň/9K \. 9PPNK1g+G +%K(@Dtnx̎x=(_GqμW/|'ͫХ%*/"ACgpFs$6 aäIdǎ%1j"1׊M;ub)vпE֭32Eϧ6oΟ>=Sر榦dIcF}W3ԪQtt͛iII߈&g1n']!Υ3yRQQ.iT'@Ӄ"4iK Vpnmz~fPP=s7o^oqr f-׮wEO45Uиqyܺ+QEzU˲VswqqB ǫ >K^T%) EEԮ]:)uOTj*PƗ S0v221v$u]:o7*P_gǷL*`zÒf>$ M;0!i @ 0 '1l*裉Ni(*MG6!O QQSZ@W`b`@"0Reaك`mC>x  GΡnefuDǠF03PYb% .ݫK oڤ&0i dlx4kF,@qHzGlΠHzRwϦU+ǏUHVVǿ_FlLTcJPCR*bwy~6tm?+Jb[k̟h0$eG$K$9w.: (u۵SYB ٳ&MձW(:?^)5jRfk6CKzv ? Oh1REB w8 !yB̦L1cJ&&*VS7g0huƆع˴9,:}5Bĩ+Tahx| l )@  wA,8#+8SG.6BBLΧZ=Dr{ 18 ,  7>Gv?)$l]8հj \M: iiIYFzilLxлx bV쬽cG+;wMK5BAǔu2SzU`-Z@B=y|QW=&OvP5TOMϙNw] Nٸ(ō>DB/XPvHWrEsg\eVVɓ /nyIJ5^Eݧ`0g_ > x n{\ (F}:d:㠦rЄ)(Ճ%1Fac,v6&BLa|'Fp&s- @~0[`\'h;q:RΆV~d`M7~2!6vƅ`qM.N~z]B"\atLnB-ZTHj`=9WF(.\ڣ5xqxgrARKBe;v;x01u q8=jʒuMM凅MѺtӼΉBBpخ 65Fp=ea ݐ jTWS{CUg7s۷ _g7:];åK]d`իB&h?w/&^ t6k;ij?~=;#owQ&(2Xk֘vr9XL]݂޽5n6Q)vEQ0Ak5t(q&ω1c>,Lqܚ~(j:Y,mLN$ dt+Q.(B BeA)2`}4ˀ /Cgs' 0I4@DNAD@o'i# ~!?&^)4cNk+sPU#R?A8?Th~(LRj-[l6m~]l]u8%I߾EjjٿjYP 훜e1k83'wwb1uFNJ 3WW=^MQflGi<=E0VtڪҘ ru5(-DF6VX [ĩw5kbHX 5̷iDM5._N ]S{;SS- UM۷9*?ƊGN(?bʅB![|ؘܸlnqşR<,a~]efc.6Cְ]M ~.4P[&XIp =$w4cQ'tIIݘ,L Cb9j<nH LoY,in8)^a`lGk. WuB/o =-vg?䰱~ڷ@EfM(x |Aܻ7pw',Q*ŖܘAAM0 t\柎%}- ѷorvkX3yq 54dOԡ#u} iBARS*K7Pѣ$fPba!9w4GWW_~uKe(S'>pF={}@yvv_bamLF]ھtUsEES;t7N2#|>=ujiz:̼}MYvqqiS9f6_XPP6xо%럄o`C@$ Q -dVDQ8אCY'Q]A2|p Δ#ILb@Fx[0fZ,_1|)brq0Iut_\ 3 " kO}@ # ,XON7h ` ۻ/ݱYFI֔mŘ4?TiU!:ror5u]3gZs nUԪwo|}<}{T96QZT#CO~@G֢kw]$O9ZG2:RrguQ -rs/IJ ˍbnoH8zmz'&|9?&4ܹN͛>L.{1ztm?8p)i8qv ϳzw*_ǯLWqZ0p>0 H/h:$@f@c8'@k7! E0d{+ٮ <+@Ls[_q@9 T05Bbq}\(|Rث Dr^ť[ W{_X/[2 # T8;t.YY1f*;p@ycc6..ϒH 0Ndzհ=V[e7 ^^6L&eAIIO9KcK5<.PO~Wپ!;FU0eAw/B,m4-t aLgQ#=ufH5cfZ3 +\.a[^Oҫ dfW+WRH6Q fyD*A`8;mmΥK^ suZcg>puk~*={VܬUeԆ T6ľ}CkDXI1 ԰x }ka]G: VO`Y-!y >| (kgAȆ#JQHc>Il* G k3Asᬉ_!OF1ŕAi 5p7l+w&վ|-/D ?hݚ<=YYJ͸-[GĴi˗ni,-Y׮1(3&sOe ]-^l!9S@6sΜFb߾DU``1fKQeX.Ojcjpiw Lpr +LVOk4}OVُXzvYne:pr34ԨEfN6l;7KK2==Ɩ^lš^&RR\.$>i<cfACqtϞޏ?V??#msTᔔ(.5#C;vjN崗Wё#!C4S]5yŤI)MY9䋤w? fװPe3ӯ* YpC43h0@CT ~36n0rC9 6Ai3.4?L3,>x+b1k)ޠT .m`c|[v'VggT; ښhCw} ĄƢ`2+W?qM.Vn{w~pؾѲ%DSښ{"޲e< .-gYL_q|ܹYՈB9eeq5h#U+V6gdҰ0ِ!LS){w^T!wk|#WUhj245L`TFRRTJqL[<!=څUyf3Z(-,iZMZ9pݫ;ЇMѺGcmM/K>N5\)x;wr9Ɔ q99bE׮e4$$ޞ7vj4?ϒJ-=(+Äj!0YTDGD}Ocf/ (ԉkqmQ9 `DREbpÆU2qw`dbqqE.b3&LnӼE ?ŢC &$gH*xQKf~#/ŊUM72[yX| Y VZɓ|5B;EDѴڽ;~m4*ϗǦM[zRRihh6-?`A$_q!{zvddqrKkS22~Tps SVYbjS;;Qd6PHءBYj(EY<=ɥKI]+(.Қ_U\0e K -;tz(hK'^ޭP*voCTT8zGâKsL_\Ƹzټ9A4H^sgG ܹ0+Kda^k.>CZ;XUܺI}3۶!fK4 uֱ; ~EeP5f#Kl!I³OnA E6wom @Out?lΞCZRU!:p >$pڽWH'k;^j^E>8$Nn~_K\$;TXz{?]ޢi V-XkR32jn74Xм!!;_o|YIZ?jܻcnhƬM[޼)4IתUwoЪ <2-75emݪS9ev JJ(D/]ƍdgr:"^Wn`veoѥmк9|/㑔cj4{?o`Ufa"kpM%4 E`qya ۂXw! 2thM`dpdaȐBB8 P[@`* D#<7B[KpE W .1;dr\t\4GUl c>?7\< s3<~j\&&rfCz\EiښbzV>kVY|:,0NNsNN\Վk8j(=RzS54/_$'ܚؘki`AA))h%ѧq:V|܍#2Eq>1GɉOsDriIT;Ha0yzc612ė\*RWٌUJe2I??;evYGqwm7qw!B[BiSZ-@qHHqВ}K|5sf3ν>ٗ/ٳpݷ/̙,KK֭2ʼŋv51,^P/ٳo/|vu&G^tTxr<,#op?&bŧOR5P!+ axQU1edd7Gh_Ў.b_Xc&bI*j}+43;q:{˂քYuHW0mgǢXș}< v!K{Ta1Nc9Һgo3+]7&ٲ́<82X?|芹q옸S'ږ-ՙ[D9:Ο44=]Wv[FڥkW_e^qWWnH=:}ӇQ>n\իdáCI$u0 إ^FAiLQ@,7f+{v@T+.l&WZSa͟ic#ht -^368l ~*{ĈrvvY})WqrOX_~\,f\ÝEE 6y!32D{6nl聧NtQGD͟i({ŒI|5m)^p2Nҿ5zx OJRR*EHpUtSwLoT rw) FXGDe1 ؠ)89M sJDd"Z;x R8 0Hf@u&%o]F֌yrG}$be_l,9ȮSVjk͔a,\YQ_MA]FO]4wwa*C>TgY[ kXm&M9\.,^% ̙2q^ ,{0kVF~!<3[pN)Tz=>~V'wӼû-h+^f}"qI,Jyx JMɹs$ͥ3\6ӡ6mzڵ3:yiSyVKzJIIIA UTtÇ֫gޣd+M^]:cE#/^͞]2}>4kܯ ObZ*zS{^dIMs'X@^5JA\+J,Xj8HD{n)QC' LV|N}KVǣ1mQ4bfW ؙе$ܷچ-iZf+b-rkN@ϸʒwDWv|7-w j0wCρܺSHΟ[[kXdpopmn&JIzHp>s'~ 01-]g63g>OK3_̀>&[(nj)_E7j* N'rβKb<0!=ofҒ,\p-jPpؐ ޷f8w$jp.ʳ;'ʕ*Vt*uNĝ;6i?h4~xac#u:&O~V9ގV̉ kbZ#,/_Vg]M1_u]v??5VIϠMwBBӃ?2P<(FaF'Uf(ßLx\d>J7Yb!D_~ ͈mPϟu+#22oCݻK$kfr64scԼ<]rI <]˖,<#e1-9v.MXZ-gP[),+>xaKn \ܰ#2CW'Ok[Y/_sFhIe$B$d$%W!&#eŽLJUsLϜYL,K ؙ0*Xsl m_C.뻕(as_*U̼mvG&j)3ږ}E Twk_ZHLZm\F^mᥓjVu_MP w^eTe5z<ξ}Q5kڏ[@3XZuk\sDrrǴha9{szW4ÆeT,idJCk7n xy ݻ6m>tj2 7NǮ qݨո;1kXq),3WEp"$a\IMMr%FSQX+;:9guN] {wBJJ`ĴiqWfĨC22t-[ܹ˅m -۽~ӵj~TWkGtȚMr< ĺ=g,g Mq~M'LByUD_Hf$l ]#;v"NVLJ DrEKDΡ rثQL_KLdc*5ޘNE"p;\,4sI۞ؙ0;ޜ&܊HD\ i-.酥;.!urǂknZYchXWc,-8b{Ȥ|xNI*UBBtGk [XT evjFtU~N~Pb?= #y*"< 2%"HxLxKJ&ug]P&XaBcrb~ ["4B8(2EQ LDl I8<嬍Q>fI&_;߆-aoXڗ3\eZ#BVwUڕ˼bLZTfe3W4?+cދwr1š]9i~=Ν/JMծ 2"4gf!!^R5cEFF؈3&F5~FP%ţ&ފhg'8Txx֊F'\]kpz4=VYٛ[}{67ܳ;Frq\! OS+4iVP{+Јgn:-M!1B$Ҕo޻ݻC/^|վwݺvFEig'?Pwu^8ܮC.wrR׊ us7/k޼5ǏY[Įty۶gW߭#`AoPyG2+0b1/05~9ӷXZݻwGeccU wFFFvʪK.QQ?>}EY %) N%|e/s۵8ڲ%F >} Z"R*si t| 條;=Rٙ3C4X֮mP2:Z״FcG֭b>ҟ2p51v5lqd}! ]DF vM)d@e$~R:bz?:te! V,1lUR-j1Odh6+9|42j:ds)-}Hcƕ7Tit]sɮoN~h:^$+֕lCX&dr1smV3Tpkm>tơJ`fƾ}bJ4PkL6a䟅%K&'ծ,'[YrT\Ac~7tA΢99ãt͚Y)cPq04TӳgZMz^ R'$лF,֖mĦ:{~#ji݌! yU*ۇɳrL[KNno0?%#] 9O ǎ/eׯߑ#GS2R$\T-Mi5bmE*ey -p9c_{d nI+tFbCM栁ɮT4Yjх*l_d-`XE8coP3)S՝D+zRƍcx$hiʪav燳Dim\8xO ^=܍%4pQ_O Y#c~\΁YQs}}g5jh„LtXYWvKJܼsxzп buh)=]F{. _J 6HeUTȓ&C8/`L;,ZaMyc:E})"xà \] `=zT) 6 z) R%#Jٸjl'O6zutԫg!5+]Z23uzV"dۃ3i۸ߒNoBd1uPQ9...RյwOaɓ+YB" >ee/5 JQI %g&A$y[v 桽IY;czz!|uh:HIqZIp:#ٔ7'X0ڛ,}N[\O=껼6#W\~%o/ T/1z}֯D&D'p+5Lƽ z/dkLO< .Yŵk ^tQ߼iZƺ}{Ӵ4MV)}Tj:i͛9CD'&ʖZwu_xeN1"YȰX|G+:4eLBvf0c fӷr-vv>SRe|5HxO QM$z# '>bx2 {`/GFfKLJ!Dtr&x9&pT[c"k@o{ITA*;`J9,V"rt)I\֛$H`a+,\{I[;Mp/+hpý4B\dR~^Ϙk5+F "7E+sȰאHذAja!\յ%kk#}b񱲴S3XwAARhJFN/dIJhqcgOU~պe˒*V45˩re˗g=x>lkQQT*Ǝ<~+VL8}Z/G,IϠ{']DQb7\A,yo$GHy|q1R ۾Ĉ1PϞCP+8rHMLL<<<&L0mڴ /⊻ {P%gG*ڷOIL49$uٳk@ժcz\1sfd3?ZDT E_X Ц]m 3%-u@`Zܾ@&񹒥}Kb]8LГ&~=޽$C{=T^?%K޽0vlb *_~IJRԩгA͐ŋ#RovNMbPqiiٺ{m}}+ɴZ lYŐf@oJM1 nfy8@zs6s14'VVsv R.pXWOCP+|dtwm|UrrrߏO`Q F1u¸گ* گ/jco$+r:br/ɝ05C"u/DhK*hb^ҋn6:=%"OMg^x'EDNyK憢b'gf%,u@$]} \W+&u575}7MchU59 ֿ1Dyih1EF*eVw";f~'yxQbB#G MGYZ ٺ.^Tt0 ]X`f&?y>>Æǫ&N4|J:}K<Mz~yɴ4Ν]׫gJbq{-_wr֥mS-A'&%|x$VDDeEU=F@>g݊eU(U ;tzRVCz _R69ې#_YZ&Nth\^-'GשSHDٲI ( k ITîiޑgk՘d[hG7]l.e-4meVa9w+$e9"ww޺um۶۶m{wmڷ/),5Y@6OHMWJ LbL0q)89`uep|Bq6)sěGv/)]1Fs452{4.$Ѱ\Rt,NCvYZG[g: 0owog@eW[8k vfF~!kitAjxr9?7v$VI[g J%ݺivv[gmf&=><B9sjի˖%ScKKS_/>*V<003[JI[_n:>*Wq7TZơC8c1eꟀ1Br,tfg+_}Y M7ffZ?Eݻ;wRRh%K5jؙyVqc[ww:ӞTֆ~I;vV-apQzd4ўa]x[V˘~L.e:4ZFt=߮FE[=xZ?M4ٿ\\Jz… ϟhѢ{z .X 00pȐ!s V@KJy$7+XiwP& %H^W8)Q4Sơ"fvFӪH;Q 2!QT[ V]p/攠cPjws̯GMWc3cz#ơ+{ѱ2w^rVAY/F˷p;+Vۍ_opb"l]J;3bfStSZ g|2Y"oo/5*ŧNٻsclm?orR'y[Zgj $=K[/n'LGwkر'P5LL yt]7zrPɾyHW;м{}qIK‹JbEDd6l^cwm_ߵLې$* ˖U$rqq5G.QQ(nHOJR,ifUzf޼77ɚ5NNݹO%ZYWǏf ݺwT*6h!l|y(wiݰW,E5Oj~tw&5(Le78̘1c׮]ʕ333_ӧO^ZJ{---ϟ?m/////~ܹsA22=Srbùoy*x&'BxN^6>e *[>4cǽRT72GdY!(g,WM).AXzan&=7Ct"/3pn]$"% 0:bǂH~;LiBsy?Vnϒ`EbK'gEPHӕbioYakCF.gXR 6>c{wAfZÆrƍ}g㏹WGLP4%EUd2ќ9>r$ NVE&۶4$] /O2ڰf:2BIMUҒjo{ϥss sfgmm*25mm蟨s/ޭ]Z֣_ N{/²R_4ʕDdDOnܻ+ ׻-eg2jj֔~~|Xn>äU\Je8Df`wr8s;[YG8ŋE/ƌў8ahph-ϟWDكY>66z2LjnĈW7ơ.dܸ}4_ߤ-1֭5^ة|?N\v)i9{7w{J9gM%\~޴vF@>?O`SK6ߜ)EF+*W&*=3SreTTA:uӧ6l0Z޻wIR{nE8} nc.$(,k]ꄴVLuumXW.缓:>:66L%QSLL')s1; VRSa))ʁ ߶-.$$S)Sb5-T zJҕ+'Wjl͆ ZLXP좯MvnF~A OVEt/b8< {ٌO!5LyO~96Jz=GIh4(Em?>on s\]i"/OjK'$UIN%OZGjny G)N("P. !`L+uLM2&+y^=f:Rb*֔Vb2uB&F!1 /TNү21@iW2}cU (Z!tvmhkkQ:˗2D"/G>޿^<22LۦA]77Ȝ;wR1.&e*Ğ=KDEhPq{6 \,W:heF9Z ̗wQx  7Wys͗_V13+9;4dQ6>kWJo]DBllT*25Vf? ޽w?|vB54<-] xJȑ~~SXQgx1kӦ//?zuMqqg+ynݪ]J$|V-=N2z2~>|ލ?tGaiξ5T*L2n9 %.vZ\5=s(FZ':OMF.>0`ܹ?ΝK[Cq#N3@L2 M-nI1<qd EЯ,9*$7_ '|}W b;)sg,3fL4Y(h@*ZRҸC)ڑӝFr%+ĮBj*۫1(U, СiaՕ Uth㣧$vrժU7Zu~]7|&"B7}Y3=WncIti\9.B5y?ڂ=_c^mf^Pl`CdF_O`im'w[c_*Xɣr)(ky/g$XY IAHVy=1-8ف+R IK1C/9X㌋IVbg @swda"% EBΛ-;"s+; בwHxǍ?3{`"cQ]5sAf݈ YȘŅ$&B9Hƍ=D99h>5׻Y))+ݤRĉWs%Z{"wzC53f[XHΞW(!,cj*9q""#z4-t$yrEm~!˗T2yRJʥpΝD??TutuǏ4jxqmj}m5윜L᪱9ڶiQ/ڵ,-euiAظ1\fܸeeǓsnڔbm-.QB>yLݢEY5kεVMu˗ 4u'p|(_a"dhlKl<'HLkO"ڥ JRYvGьoJQq~ d9S+H84r*URI*)Q]/vBDg< I@uo\ID| Rå\װTD9gr0 B$ם&G**~">q1KNU`B=.S\vsWLLk̘̃ mlM]Xt:I6,]aN_fL-U,# mnk{1U^M:ab3 `Y Z'G$ | Hqǽ(62p68Y"+ENW+"AwHpCV"zb Ym 1μeCI9aGںp:O)ӛʝQ?MvMiK|ߋk5oR ˆҺs<=FZ֐RR%`J[kmca@ފ iLN\Β%R>3$$ׯXQՊV)7yرl?? k77nȚ5:Z [Qyd ۶݋yΆ lx\^x =6SU<[ uR =!W$ݹڸ<Λ}(wk?ѳzxGnΧNm^*|۷t=3w'e zq쫁I;o d~ЧUZv˖+WG0-lYJVڵ3Qݷo_]ŠVr+Qd CPXjTjԿJHd$ЖsW-L[A9gF~Ę%ۄ}$'Otez[df&M']ČxYת|훱vv#d&oHhÜ6mN}qۛ\av挏SppfNg^]B׮۶-wX͛emLG˖-׬{wVZGDDʕ޶ubpad\fԨrom׍U-[ZeB%+.0thd:5L֬o٢QطOje!e8ѯtXx]A7UMR:&r˼ϟ5L{ h˪ONcmY7EB~x y cxr VNNwdddddwvL4 <ݐ dqG-8㢡 0'3S8G\t'I1TFe@ B&Ā~2rEkHhp&{a~,@[{\UjX5o945hv{r_mH8)՜Iabkۊw)yU ΊwXk߂"0c%;X0 {1Tb:iժZKiFѽ`X>ӀvDW_}|l+K$BϞa楃XcԵU._~ȿHaoBS[em Sc@r곋O*4ٝީ!<RkTS<4{X0s杨ϻK 33}W~A*Qwoq{U+ŵk:++aϞ̌&M U(=`ĂRxh(*knV֍e%% (}TGz嚥W w9&&Y3~kaiiz2Ы'vuSO ,I ۷Zw+`ԨVVv<۴uqٰi(O.Ы~yIe5~9Wៀ 4A۷44\W'8֔Oz<ݨDNU3Wj$7Y2D#dAXG\n (KZ?ԁhCEq%D= aEx-W q҂|fmp5!,$3.=A),dEXLi(ݖ D(0Wq,J ~"AhR]g*Bl ǓVׯî\Ŗ_t,& + 7WjPOD–-YYbAk:QS'crƌMpͥom}fԩe-CT H3'$?lbE0aB7R/nbBjͫJ oKU%/:l9ZD_,et|K"ZAAA&m^ ӧ:a ]=ٺh7ԬiRIoNһ%`Æ}˗,inLtH]ꦥCCNH|9k -&9=vqXIS-\]Y8IkOG"" K,c$F*F,JQf-Β_kڃx,&.^ܰةkq7=q,sNp-+:_GIоg8X ԫW/$LBR<\neFy Tĥxg*ZTw>[R뛄w92bQKT$5r|q7ym"T@؅GF3)%FB;5dLr^FljXQ:t ]îhKM{ԩގF³5m{^ؙz3rBYNT].;u$_ f gl3fg>V¾}27ťKK.Jqp]ku%MYXS:U˅ L^Z53kkٶmeC^޶-[^PHmJz||hh_ AqJ.vH>ip6PYuy9ڣk],{u?"+Dh_́m"Sro5x9=q33/4U̞qq&MWW ص(2`@uggմ|++Ie_6FLQDުU)..6m,z42:5VSշ1Eqz=k [H4b819Lܜ~%KdRG:4f37r>h׽g1U@zώ_r:jDȾ${3t;bN}Z'` 5_lhQd%(vU}9\6IDD$p ͩIyV& Ad+N@{~4 ^G\YJY!!Y,b'c+mɀrJa} 9+@GFZe9YFL)MrO`g'\fl[6UmL1Zv^$N'|VKZ90 #&L~}+WNM12% ˗Wr%뫯ZX^N~׮Nn6|xԹs 5j9'Ia ӧZJ _Z:Z1'ct:&:X[\W`#~=}G7noV6"^_g޻LEڹשcu=!h>:~D̰a{i+`ʔ[%_\9i]曘1cL8,\t~ڵ&xZ6kDCSQ IDAT3l h1L ]~ÖIHf*4y/5`yxQP@% , LRp'?opTyGWBh]Q Y{wExCG9$ةQ+Dؐ0څN6r& ૪$O&(_eI'mSQ|*Ӳ"ޢPǂUNOx™L\sv, QLRB3PΙ|&/ѧCfJLmsΝɆٳuΝ-?:+Kr&ЪMjvx\'ooc[[=6kԮ5VH?MMӗhbBց%.]4z-9s&iذH$ANkxl0}zPP;|v-O/qVJJVt pDb``bܸ9En](g..&˖hvuk~Ŋܤ$úu֎ƞn.k~0Alqis9>46UY=횳cuYgf oI9cQ|[.p43fH|RׅmM_g8XūRSSiVkc"i?7-9+_jR6{MshP#64$7.?¥C()]3w.8MV pFJ1 9,OR`ng/\dCc%O͉ nCI/fzu |q%+33S" L;Z΂FPOfffPPҮtO7ӽ4yI|=g&[f^~2Ÿz">hGyoBVzQQ '/ϭtwPT(((ȫnOӠ.31ttTfEO>GЇAAA6 *)mzPݹ0!v[fڳgs62ǧ/ְ)N*9_Wqr͜y'%JN|y gg՘1g0 #sxq&GI1^T$ 6iS%;#u6_I͗?t3'^j_<ϗ],5 slN1w@6-a tH|%U/VlQbpa0*9<ð?N>J/\x ^o=_)L:cǎ9vŋO4F#đHdCVɨ7י+@= i{d؏(C6Inj$!톔&qAaM6XbWRn]u/̺FBlآcRYAsoM4=[ pl~=@b'5Jp Z3i=FC)˗I| zۍ#6A\|Bh)-0ch3sܯxϡ(~?@!TO3ܘ% ?pV /,1txaNi2/:ldI)5j(oݪTx7x#ʭ__Ww9wH ˖7m 9e˽]ϝ{_B?7{C?L@07F^BZGU Қū,e2ɔi>6%ڵac^v, i$͛y3_?F.%hGXѴ߆27ޕQtiµٳTke&4n|ڵŋLl,*YXh];4<\iǐ!pó$N`_?}Rh0pLVzDnmq:m[qt1ɫ#gyw8z=+U=3֣FF^|/g 4͗38*gM>a݀gs ifwdf'5X)_.Sߌ`93dRSS=yǧiSqٳΘ2RO5Ag SI]@ 9xY@A:Ԉ"94yDZoQN@*@*})L~,fXz Op m̲!5HR႞OWr =Tc!%GL>qBFt:N$3<4'(+)F*iOlqt 7b)x2ުDHgUJE誹!|w--.OcoM:bLf I}d'%h|,9p`y ӲZIz,s~Kc]GVDf$Pۙ>x&> W0˳lڳgϦ2,i'O?x ϟaÆ@U@䮂x3=ksq&!pAB9Z< jDu[qL&! $bO!u5C+p]P AxbUJC 0đB#`|%sOgW5^D28q7'-pAR9"}MЩLaR 2 ^#'>R"f*~GV.atJQK6 &Nߌ_+T*~E8fs-RSPݗ_f˅ӝnΟ??CW7]<2૯L0A "#/5ms6RNr̙UzT!lH2i4<ޯZm[0cxGȬTIZW/c$3gYrFUYbGK5}#ʡA-|ǖlc00x.?yA{UbX5yjY^ <]Pq}!IxStT*7eiiyԩWVPB 'O477 Tj>QGU+Zn O3ȵ]\ W3$;BVhFO };oUי.hLYLA"KOg%U,J*y?m8ZUH7ӏY+ꊟ̌pqBEJO6ݞ=&[MʊK),_Jtݹs&y8eܸQ&޶rΜeUf|'z>'V2Q+ca/k5ؘ篷Ng8ut?aCytqmE9cFPr|͚V7+^"&O;yv 1$;; ʒ޸1EQŠAFy0wnbJ=;u2/s~nxncYd73msgcq;P=ۍI^&*teץM̙;%g qofUIoFkJV,6^ɂyt\-ˮj FF֛?*Vwެ{VPb"F[6W$8i½Kxdc{ͨJ?2pM {~DC%/f{?Ohш1@ zIa||:Ăؚ 0[X ``AC%2 :'3hƟ"i w}t8N>I yr [ O^ ?c6~Lꏅ~ uV9@ad#Y2, ??sz??nk/MH|}>Ϩ/9s'ҦtZFC0ui+e/\xD\U7wbs3ٖ͊EdvݦG-l~H"jwcWO@"ኒtz2-aG d3uME6j4hnLu B PM-pCqNXk/ G=|DYF_4 VniZL: D-LЃȁ6>> CrՒl-rՆ#l'xqXlD#)̡[˴<*x͙}囌G> dTAp``"Æ2=0gNq2l@0ƍyy&cݻusO߻Ly'MtpP޹yH$T*_<00ybRcJǡҧԖ$cv٥,^<} +3܃3MpqQ[װJ^ rdÆΪo}#A |Inkֻ/;v[D"lڮUb_[2re 4~]lN}{ΝQ ֮MΟR1NՒ%9Ν}dLykzٳpFzm>`bZ^2i(K 9͊_hQMy۫? FuqqJAd^ߠS_\قYv9iXYמ_1{3i2pV=sf/gE4Im\M'B oN\/F $<$S*ERxlG佰:E4QEv1#H z%C!p8G:XRیHNF3KjX(_ЉtpDgGP7R쎵/!$nΌ w}j/WsF.v ~b{OwTrs(=bW<.ے4v%uĬ$V% Qq:c_>>p(ӵ#Fٗ-ZyyO}Jԥ6e`vB[[IӦ^^P_T*mk-KRH9w.cr&*Iu` )#GVyz@ yf.׮%S!tv\m'2(m!;\L(!>˻4GaKsU;_v7noѦS ebXZʽO9>^=ʕÞ='^Q6<Ѳ@ )SxaG&Illi%w`tÅԨ!۾ںxA@اQغUV~enDx]} ' L`]۰i1.|Yߤ "czI ٗ` m tEj}N[p>_LLJBBO!gXWLŠ9ΊKfIB_:QX007koLz̑k'j9Ro뎫d8s`߾»wiJ;K&`:"K Gԡח"7w560jٳgG_]-|l-|/kD4AXS'^Oh[2*V48LV"||tqŁV2V^W1GHHR.=XttN>Fu|b2UDΞ>}5e>=< >+0rdfAF/_]z:Zz:t(ջ29c cWnbQlX4T?B-ubLIi9LJ^Lx2{Q>_˴htE"o.q?J֌lP괍f~:%͞xTQ[pYg (x 9奘0`'LR.T&;T#%>4}DF qp<CR>]Pt: x!o.eĞHZIkzE*Kh #AO|lIU (0WZp)>no9r3+)xSy9&GVO_V! 4 )?M*M Gr!f W*7ť{k8r~(toŞĥp"}:}snr#0k_kDB?T u>2Z ΦMco2P#3zxSS/k +5 RxJͳt/|YY[ca^"Vխ[E''F^ RI=mꐞ4?F8"u+c̕͟%233K( vEϚu筷~ᭊxRNogh?*dM8߼jf&]TQ_ 8Ѫ[UyW PkB'{6iRzSܸ={v[oY͙Sd̄]f9j0!+1Q-\he2իK6l0=ɮ8ލioL]BǖARbt!.U _񢸄VGĤv6}&VD _ݖ\^P0olhZ`Ox'DE?.b64 ~01ڵի H$ƍmz166{F F2 qڴˣFQæMr7+Ͳ,n޼\݀e*9<9<1QeY1ͶmwLhmrE~}bj IDATݻZ__K#T۶~prԈRc,\AJfPbfG2jyDEdugcfgTBd o͒!ߌB_w݊uxV/1]\RDil Hb!:uBh8 53A$"wwi~CC7/pvn,_`n.\& ނS[J][vpaVبٹA-,$W5oP W4h`yFvzys;; m-//[ < Э[ŝ; Uyt:BpAZ8ʚ[uBQ:] ˪V%*u:qРĂ6m,(IMRޢŋ9֊Z>F\./&ڪVٺ鏽< x({¦=`ݹukDN矛}/f⯿17.VcKu5q,C (5!N.j4evJcTQ+~=/2S )F4 ,8 ˒6f"H<5z;9Gʔh ,~nE(sCWVٳIc^JUR}|mq,sl`1gT7m, qWCϜ ?|X9t(.-MbEIVoMڏQ?OW{ݰQL&22ޏ@j`RhzD.wW|?/F#J*lKq?oS_ߝ܈sl8g=q15Q$rv"W&_.|/8XQ A/C0.&f(XiIY.'AEly+QnG=H6 ut:T=pOGsďp0Gc*T b SP^BA-j3Hec\Oҿ8ҵ>T$,!Oe`[C 27r)GqZ!cp2~3flӐEIzo]<уqv&իW*aRw3V"DG3gHΛg٥2%E[c5kI±c9w)la!y3yO1}z-''Ճ9~~1e/~ԦM977_7+R3K+Ț*V,椋6FPuHGdM^E`Ԩ*zydeig [mm{tݻjffKWCyǏpTGUrVJ榞9VYl37vtAys 0{S~XHn[եƥΐ +'ZU*``<"ϪN,5Kڒ_J3]yۋK)_Rl+п ?{>שwY<ٷ x}v0aV <%p4A:EO=g鬉mƠ;%$ʘZ! *>(4j<7 =4&8\~4hPxd3q=F2? 4Y>6q G܃(H$ᦁ (\RĂ#ʠUUԱa~ D::pGOkjjuT~RIf :=}ZYyn:M+Sum2NaIzⅬT͊TsVEjukP?e?5*Q*{rԭ?Ζ%U9;;k'>-lmMK*d wWzcusޝRje%۵+O?u3٩^f?ܫWy1 i^U~9_BU3|9bM>SR.[%,@(_b"(]WnBr"&&oʔ[yuyY]޽}bJRRANLiyd^ZXȏ:t(VRÅ #Gټ^anz˖pp(Ӏ#LN.\Aׯo29Y۽4ݲeUW7_4oSwZԵH^WjMRG ?P/ vIk(;{V}G:ކC)8n8rؾd`^&Ɏ%cJOD%3#&~٨T:,~;2ڧة#sVG"#>k@7{ÒY9̞=:HSd,Ci=AsF 4XR ;;pNUZE<(EBQMq΢aUeuVph `AA`z G;zt(7C'2/B&>aD`]W5=&\!&ث9"QͰ3J4_h|C*NdjP$r~c<+ϗ3K=| &rܨt.{ ŕ5}"]X0}DعS 4{{mZƌm/ڵr ?MyFmFnO(͟bںtXXWjǞ99ھ}mF3ӧct9P%hSI=_ݛ2iZqm_$v!Gfq+JLoe߆ΟQs=,̙3g|Yspŗ d K"Bk+D,(ͱRb!O&NzG߃zd瀅?I"j 94EPC&[ H:*SpWKQ͒5qo:D@ Gd&EMrlq>}yV-hV\xe2$#_ѯ\J\":+Qh`$^Ǐv+-kSDlAM5i>\*Iҵ#cI+ %n(_hF7|Q#M撼<ãGݻUC:rO˅%tQQy;:)ok;޽|EI6T*tc0`n.]Vhhj˖Fҥ!}h֬#W_J&6q~b^ռ_o &G\kI_/zɓLWiZVVo{innfիh.ߟzРJj>:Z}T*D 7P;w9ܴiWjVk=Ѣ+ǟXqvmke1744Om.-TX >1¤j9V-ԩV5kq4l(YZ*7iљtĠ>&jf,Y]VϡOQU5$Wf(_>%Qd.ES4ۇԋPg`^Ty(~!'dvT6gHXT-`{1nGe] = mHY%>ZrŒY\J{{Rݮ=%,C Hi*Q1vB>kDLQ1HC4y%m2Jr"@\! z+pg &V˜t KhmG qƖ͜ HL룹Qzfr1ﭝ=݀\|IA"aE:n<ͯ=kG6& Y󾠺tB#/Ζ:"vcJď>*,?J7S3w64!;[f74Y*Сn*Ulu r/&fݻbϞ5~9~%AT={ PeG'H$&l, iO2Yaw.HKLK?S]=z/cM;w.VΜWo&\ں5ƍWyywӏ[f\\6} Y^{-XPϵp~ Ajʭ-FVtV*^eKzttQEƏ:;K9Ú5Oř3MNôZz &9cM~ܑ|>;QϸͽǴCr:jP-"PkYijb/\|c7&"fs;X-@!NJ)N$yqr…wegg7k֬z>|a՛7o[XY=Βs)}}VQ˥*ktz: /E$Dq Eجa 'xG_yr69uGGx#,*QfW'UxDYՒ3qL:G AeQ8ŰKʻa?qi*L廌sFFT*"1 s h %;Fo=SXFvcxra=SZ* 4l2((g„7]ۦIۋUcI\wUA=vT[(>usϞ>hd_^snֵkZÇfWRռ|]˞/T\yDR HwNRƓx׍`/:ԠӘ1ɯJ9u*qkZtS݂bc߿b~~NNfr*[֮yRݺ:1qՍK}!_p߷/~77mm*Ec;y2mO{7nL;x0Sĉ&5q0եK-|}MmHի m2l>,"2;D,%n#0I2nǐ:ݿS+ ְk&M}^++Txӽto]T%y_'Mʔw{'zx}O~ѣ2e, ֲ݁KRawT'U֭kzvӧh4EqSEE>q_vVZmmm_399͚E\\*^k׶8'*~. hڵee'L޿_ شdK݌(2Kjhۧg\V4b)[= 2(۬C wAk]BuP "Fp"<8E"6FH1CZ1FIzPIAtr'$ dmAxU gHyȦ鴇swo;\/LE1W*se 6+;ܺOWT0Ve$Ki 4M(Mϱʖa$ڶ4iҷ~vC; +̯iJyC! >8D YDDy fV=?^6?\Y.km+˖U5H qȵkIK={{eeVXL*I?~(;,,ĉ'+gTkǎ st|y&dݐL)bu{VRQU6Z6qcW- Z9zһlѣ[;?p` j!ͫT\.9uZ͚&W?O8z4iS+J:rlFFZr3F< IDAT[Т>? O|'5+uWh: Ekg".D/50{9gݢWUt;8oѱ ;:.+(iʺ᫇yx[' t{܀WbOVVɓ'ooNG,kNl6[wEV_$ $+)r5lh׍{/$] 77ܬ~L\u|xxI\$.u3\YD(ʙ+|:dOCCkLf(e<˙?_bk/~̈́ V͛+#"t?PXԀfqq aի[ܙjU|ϰOP1MUZ^֣sҕ*9GGƍض޽;8Xƍlzoޘ,mŊvK6Γ&xŻ2ɶᵭ͌/aBZ;ɖ-ϜYibjC.N{WQQVFGk +l3qb0l) :UWТЯɇ%̉&?k.ʂo&6dN|qA"7bI;#_xջZwm1cz˗#1 "2q<}q/w}VIOOwpx8::e;z*]kQ_m>-OD6 x%XAiZRh@R@Dɥ |BF,!ԔLe;SND_1; cQ &*yg@AjhJχ\byXKb1FK~a]"3 Ɛf~+gЩz4D|SwژůB㰱lE#Wй!?L7[0._O1yD!z\N2fuaJ l()DKpN%9aa۷K2|9w„'yn+SDf͊ ;snɒ&/2bD˩իۭ[W=UppsNN'N<ӵheݲGɒ[{*V_N4*j5_ۨIT0ĠU###˗)JNfc#\ٶW/:ADct:ÌmlRz])SJl­^J~#$${$[[…ɩ5ߤ`˚ur˗}ϵkʕƶ+sO=<_Ѩd枢ʽ$dž0/E˂Zu5к !gX9mjѵH7'LjNwFqof#X "''GV%P?eX:,k埁i$gcSނ>,\f-1j'_aS"a ;[Ĵfr:n>}'wpc x #|&9 ܳI`F3yϒ=nx79Uu[L.˜V~L멹)LǬrCP9Zte}i̓f`<ON~U#h %h^oL]N1c4M4jǵj_L&J_pLa)=}.uvC 6p͛{ݾݫ3[ݻ{v" ILT7o~:<$࢚EI<mG+'ܬL %oI,2B3O.'1_H+"ԗӁҳt^<3MƇaUNf$7W}SM$.K1 g.]cw>`ʊWΜ19UrsLjuY-i3YV._۬o_7֭{iֹsVBCU];}|)9_m{.it;IamzkszGnj<'^6//5:2ޣcFnnZ71yJ4.<Xgl [C[lyq˖-[:uTﴃ]ʶrW h TP(6fKM4_9P ;1 T0,T #?\i::QRHTh"E8 QXj-|D7#Vs!6+ِ Pߚ MAs^Z9q.m9փmIx^&M=2%%9Es'GyE7`~w$9L؉굌p?/vOB)UV2>Y7A`!j $xwM51Ȋւ[W=ָrz='G180@i"SǪPYiNC xyΝ{>({-iK.}%iQByh 8U e=s i_g0_REMAs J or6PBx,[j'b 2y'Or\Ge:Ha3z&TWKr$Q/|N@5`i8?%߷ǎ!za֤7̜/T¶it_G*잌^d67>ڳi2OR;T0'.#M-gNR1>cС_ 39iƏɄyϟ7˅5kJT<(,TJfIIьQa+ai)۵+b_~8S;JimuNnVs`@Mqgh|<୬ c#1w8HOwFzcoԩS׮]~ɓ'---A H-Jt,**0Hʒ5|ݕy7gkyf`6Y3qj\!11S>9L8Z`5vȿ1f8KH2)"y[?s _<%A~aUwx/ANgxt)E<[O-em\MG^ft e=RhyFTc u7;`w @Qݸ A8%[Շ6 4Y%ӈӓlOB5$11+M,~T;Ùd9?p`ę3wWi߾HEȑ?_ܼ0b)`-=6ntS~:ggOmcc?)ϸxo g]TꏙP ӷ<T:\'UFЉ%wzOPD I?"-K}a[ͨR.d' F FqlrZdD{> +M ! \*5l|wON+?pFU MQ@Z @GXМSR\, [*KPZtN9<*G-#T^x7.ZOI@~:RQ93dv¼ [sH<`!3%udIA0ہ%j8ʖ 8܇zTЪ͜c Rw-wRTqA^݆|U|SUV3_4" =\1W(ۮ#pvT`(XA2 %4aޔ/H]5@R^AwJ qhxz!"*Ki^`fNIsvPhxJ] |ݨ$R 3 r&50 UHSPɯIde2Gv8:!!Θ=F<;%A崑.0܆ urB)ac2y*֌/R’X~SV,IQ~~xXg_(ar`T/:~ z d3n)ǘ+782t9y*c-8 =`"t&4[tX=Mtٓi"s1nt( "ɘ?`VPřgUl6|d͚ T?S-{U[R&U2꫻хSL1rm;qAgem( "|Okp4Jw:M4.D,|@M욢ۄ. CnR-szKۅ2O7`}4r16:Q#t=Ay›ߒZc9z!mN+fS y\-ߛ4;$p  G܊:Z`%mi5CqݕR2t"rTŔPhS)*Ԃ,2/IiK-stϑzUS^Xʹ0ve8,_kn0r&3 tH=v`$L_ȢuxN\T*KbWӶ;*vnhv6mꂂ%3fL!5*sŊ\/#C߿T֕<6;jm[gd̞3ew!/b0G߸x1U8r˫ݗ)B0%,{[&߹P3);SO6n0KGZ2 l&;&W{܀[ﴃQi_W(=1HZ)^C\I-Bu-EZ0*yp`U:38$r2_G 7 WE.ܐA_'5shjF %sJ'd=1S ;R3 s3IdC:Qr"q8y# 94%1ƛ~u-ˮ~8`m>|H){竽KY99ti?3ɷk'lg~Ƭ8˷lb$..JddxLbb1r++͓ht7Ս;tSZED肂4{t1I{ݿ_`AR֮&;ךIf1#f͚NM(D",\Xe3.}sE)׾seGk5xZyt^E(ZfӤias S*ҵ fb~w0A7$2fx=88~hDAo_ଷjc`Xi 1tkxdODbr}8SV"8i]#aS~ʧGuH_Lh6#CXCcV(EEkhe\|~HG! 704zB(ᱎIX ZL{Ħd\{8+q8ȹ\9n|[{̩ ,|~!2 7kvC aH#72=SZ}_CXY|ދATM!12^ظ(DƳ$AGQS-\_`c#\.33Ǽy w8ۛ\.6,~Όml0eib7oNpp_ZS(ӧï:eK׽{}1żIdN-J)3l[9\y?I/#TX܁, n^Qseb{=|c}rj2}U׻_ {-E6.(~mMO3n-ũSMfYm"yuwK<Ϟ}CԄ ffҐsn"nnf ɃRƍ _ߒ)WrȾ /DKy[3}~$boxW1$3f72sc"+H\P5uAPĺ;D0!/f2AnN *iG-ZD) R;<5iDRiI%[\bI!,GD]n4-r:c_y$, PVC)2_ U#|cBBY3s*ːKnKhW3cG)s'3\Igw=/4bJDI-JIs_G4\@UOr-gkzu]([9\FF./Zl&0W#6NT%4s(MFlhҀADꌟ1uzWPoo# @`"(H葡BYƗ  DDh:tLխojݽ NNʦM]23ϝKڵDRQ$"".yS;[@^2BDjcv lTOZ.ֺD7h |!1-Y_3gı?p$t~uhTHJzXT%tqϣAwAl*r %MْZ͉:*ijNj"#9POy5sd OxLp}*'<& lwQi쟢 !HO-YH.!~@)a>C JdؚE=%cQ@3Gt,O^Araϡ+(nIҞt>biKVɕ%LfqD JJ.ׅ4fnudGԮDrN#6޸{-әO=37*ָM@e>D=/qq5Ν{9s mʖunvvٲ|/pQ*%۷gQ+0606-M7CѢYasvx4d5 S\YL1ϑ*U>q^+g(jB՛+G*%,咭gLp=ﴃU5D[Y$ƶf% $>V{Y+o6W$X!`c זj,t; RW+\XfS8Ds.u(,%kS Dc2U?%R$0W+#~!#qFX9%:Y+'AWϿRoÁ-SΊ;Y̿ ӒL ^ /ahٶ_'ЋAxԐN:L1 !mkU ˾87e1b-/$aJ&d>Nj \(;ֲkW(ݒ%&eJaLp!Ν7v;ٝ;9n u::RvF7u42;}57鿡_9_??pzPks쾱.Ow@uL$F< :+NJyh8w 3G;oGk!UHza "ޒˎ69@ < bC:w9XfYq%S OJ$;V'QMq-9OXJ>"E4_FZmD,3綁 jDeN |L\fD,*=Rī{S 6^Sopc̓U8|Yf4,͉h:m*9]ݒT#>;=p"gILʺ9q"]$؍@X0r>;Af3m1W a8hԩٷohΧOgo(TZlY{M9w.0hȑrbEt׮AyyQ9䘘?lYzڄ|:S#~>8qFU^N?)#b9NNH@>iN@ ,y=،@^$e$:o03pΜ LNd.z}%u袸ꃏ -nU tCiK9v8B=.?RpH>P".FFȷr!‚ 4"@?gYXBaU&bEFRߕ p`NO_S*W@3d\;Mb́IytMJ;3GRf~HZ$t#VR.'KsVYuvb"R%6_H f0Qխ2Bg*ĉ+Wrm{Tqz8mZlFI( :-_^Qq@°aRRs%AA][IgLڽ|? }w ~x?#p<|o5)t?˞tc-e\b'Jx O @`TQEQk qqY]F)D3I5e =$"tQKH{qp}Ti]&(rQl26q ?3>ٖJIB AJ)tTJSA( HQHKB }}!MG/g޽3s)S/uBjtCp(lb5:cuFib ZDVTvt"Fpt0 c]ޮ’ol3G'w :$^.ԌNT=0,Un7"A82 i1ߐAN!'`oUVvө)0#p9f.E*e8u4-cwr`;N8`t:7nj9RrL|qȐ}4KھsgҥZsGe }{qKU"iy}t-!A߲UPÓjxE-9ujX^^+<.bGEEa?6W-A`<'ٌiAk([fXԎ}as2}<-*أ֥[:n4uW16=bkʘ&Qu4߭уQ )(Pw?;4*R[q gr,]`P\M8)9NnTw@:uoo$ksm}o2^)|J*yƬkdNߝ$0a'*dպ|DE3hFkd6'_U+dOwű!GJi^a͝">P\]SH1자q`AW@,bԠ1b%WdGb112L(5kiZt68@~ii@L-V ,RMj0lC Ⱦʝ0^#UN6'"v^45ױ<蜡3`FԒ !UdR"X?x R7f؎E1l+ Ja=> cm|'%k3v,x|^ajb<a؏y}|=\c"40k2 ^cjB ُ Wyc lߟ@vܼ (̘!qu.]2;fFRIv$%UY0d'6ib嗉6ܫ\<l6YyNA"74 vn]d]= F}])9q)9q@Z^RRvL]f_r]O:w F]L?PTH ،hAܨߘu}oH tM+ Nk(7n]ZէؖQp`ԥ'o v5}WGgF덺{ /=Tʃߝ|́lu*L;/Jf8_P&QZ}њӟM*d%d-"]ÓCk"}].}H1ic.9|35̬CC9to]frUGGmygۨٛ4c(iIaz%ܡ;pᜠ;!Q&#'VI#)hlhc KBF^("-tm5 NLo&EY@A ]hrc\}~]K>Q8hr%__IPNo#9QHfXpH:)"HARL~V B4[vLae4Eceg>kԴgX)l{[tw&{hu=92,M,Rvm9&9 1 x)_NÌ |hOθ@F6V,UeH̙Nd4WjQ֩#[o\YsQ0@7.wϞ 鐿3%^/9WRrHw`M֮mYpyxxi3n\hXXΈGΜ=;!=|ބ ܔʵk4a0Wmw<4Xφ#GU[{=Gl}&ѴԼpuP"΋y6K:C76vo 쾺FgjT"]nQH}6iPl44TɰgapU6"%oӫNͻ^~ڿ_(u4zN|r>`ʈ}ʷNF#$yJ*3/&Hmn5g_ۧRXU2.Ҩd%P6۪\\q2zcOurKx3ol[Gyb%p*04av ]"ihTϴU5tCȭcfP?IŻy')Ht C2a*X`ȴ`J.3 Ykˀdg Cny<:|vvv璑 |s,g2h#oCN";຀uvuNcC:XAqEQFiHF*xC4 |DҍR`kd_!wD}7{S+oy쪝=ٟx}k[p W]X¦^|"frF֍䕯8E[fk/Sh; 370ߜn%s8r,A`|%213hNjxu(}DԪiF$[n?ȸl@uggl `>|!3qȤS:wvq"6ȑӧs q|ӻBfMennڔGn]O1HӦ7~2K)Wkb G\?!F^/T$\&2O[fTN-'OhGÓϺ j30鄐أrnQCZ|PDW\f h}fZVWo(媦k2WYlkJf^lbU>JPcx=ƞޕN\gK]ɑ]V\WD҉Lq@+2>Dcm s\(~?gؕ\/DnACT'+k,P6E6#D}Y$$|_pV" 6Ԑ b]4-s `}<7{1:x]Npuw:ꍕ=5źDht}@0C E/>,@-%(cT@kR\`-Go? QF)^h'X/#pkEî\l$+̱K'1E"36VlY5ռ~=G~\~LƏ?JJ_+(ts|񅍝dZuVVÇ;vh"ˌdokP"O[뫯ըa}Z.*cgOJFM$f]ĺ-kT Lȼ};-k[_TN|!te$rW?`dhrN%bT;򅙞ճ SGlYvd-}]-?8_"3D2J4T2T̟Hq&Y *_bx:X/E"zүɾ @Sy_i8պt4ro7 !y?J?9<1$-!/Y"a?㢚Vs5^%"-C|RbMZs3mCLT )O"4ޤzyI1`K4Ue`xK_dZOD\)QHV #6tPq% Ԋ9/թb ,w%bRmK'WZ/boxmPw辖=vn2m+̥ d`4W'r*;y@p̙2q>ND?+ӰOWР0{ +5ʲ}{ŁکS+#bѢݻ+*t@kk̙w6mzOiEhҥLmm-6-,0CODlhϞcc 7w|ٳ|j!ETwE(8{*XYمi?gzW ;YF II/ `+nncvy_?-ޯR7(kթ忝ʑ (N|qя|7cjd?Xq#'Y *_bG$ k8ZDuU ?Ys<X]1$Ht,Y"T$5$z_ -uu'dXQ[bM9R:w$ͤH/D\*ǹFw@,;b )L!mza)& wEh1F[VqC#-љ{ܒU$xJc R#*VLY3!^mͧc41s#flX? G[MiP+W_f 4\Bv9.ގHMgVP%{%,1.,Yb۶Iݑ#רaѭ(.Z ^s>,ڵ?:hg';7pΜڵmo+z68?˗<׹ &7 ?诣I@DETul YWx~qQ_:ްu:C٘J]ksCnK||MvVa/zL+M)/?T/q][]=6bmw^wS9 6ߏ`VJf_&Y:c P.,& zO?g:~|+;3m+hq_m;vm|,3Э'X [W-y=_r86Ʊi\I$g^8x$݊:+%YEL;L=һ~~FYBz~;JbLlVh5jFBm9q7cgڤh%kݦ˚;A'9ۍ%nV˄, 1G&aέtod,(|83r9_į5sQNϋm2v݉!]̜eP= Sڴ`l ;ml%S%QQYV$:qԨ!t:o%}Ltt^rrK/uPeUyV2>', IDATOoG[Vz[>!:w<48%{ [ȥm8xO>jRȔ(Q/uP"zw$p( 0H!j"ML c\:vR emb5|Y%-L%SaoI B=-:>Mi0㸔רTn^=mK^r,ĥsf:v(>\5VJ~/F,ߎا[O;Fr`-o1f":3޽bvBEs## v9jUaqʕWXhڵ#<5o}3"W//|boڔ75ٟ8kշoU@ڵm\w(**?44+883.N}rNۻw5ÆU=٘[*\-hL% WpD !ձ9O&!iQaC쌲5 'X&bLS J~Wo"H;@c+~ˢȍ"8wMuvf=ldDrIMu8x:GP8OZJ©8ⲰWP9VRM!(9{^ fJY܈϶`$!ʞ5mԞhZ~ü`* d!uUp'Hȯ̙3sA lB|_#n NA!n..D<=E\+שy> k6bbLQڟ5Do~0/шAAzMl0/!Z4E&K U$#⯿fCmx\7/ePSW?Fa!>ЬDuQQ_9DQ<|cu>;j™zFeqS'.˽=+#\ry'{!t^ϸH|Δ:gXD;8g.^MVlnEY8e3CpsH~hs\)رC 5l\V V(4Ⱦ_?;iFf̨LOϘ\!_206(! jUR= Xg}Y5COL٪x* %Kt1Xp\GLÎnl5 - 9p2/Ndƺ12 qCn4gnXE6 dJa7,n#YrC`| r≔!o@(biN37$%=MC| dfHwg/z(0BkX4Cr v`ChPM)GTDQ ګj0YD/t*{`XUݽlt#Ὂ%M8Ď?EOvjޮ{p }b[u r oâ\?F#~AZδ,,}L _xA߱C#thaF4[咶m5;,AG֭igTv9Vw9w?=oYYvNG})?0qsUq˱3g|t>} 3}Ol {=@sdžqQ:R DldGV c" أ1v<)ǦB\1d?@Ilqף!%8'Ejp;Spw.L#VS a,N~߂V2٠P L98D>Cl>.?jYYR~#97F)h*vღuf~8[*W(ґ_+G"85b01r W1uc2ԫWo`@љ˚6܎gyV&KUBxywߕ!ٳ4J0euP_5aan:;&OvH3'54\ǟaa!Y/ *+K?a͂|AK9S]wg5֞2$`a8< kʗoEa O Q`I$s̙ݽF;;zFR+z15}&)d,4؎FÔ  B3j& :EOn.GR:SDA":4$3cGR;Q}cB`I^GP$;N^#E,De~P Q E~3L E~g-r@3k"ؓM]Kj::s=xhPgvVRӆ$5nSρڥ%zĥI\J@.$ۼ~ch_ &>B8>ّlNmH%e^hȉ˄!!WZ=2)[ql&-+` qlNx#8ĝ;MKxyIo׎iYVՊgP<G|bKf *zsogج(2sG?.ٝyk]:PN9[y'.8WCk!brcVcw՜vpل?OR\N/NJ5ZS)3UOIa] {<X-zS&lCw茺kNXWE (Y rٞN*rh=p!4WaIH#a@:Р*U{|}q8-;uF$&<M4nH۠pGB=|a#b3` gUprNK7NW5J&^}J=FQ߁7O^lFKOܬÝD9$YJgѲg@*4Vh>1$db4{nT`Γ\1sz1qH Ĭ "|"\\s\KKa*;''ɡCJ aW6.^X5TǏ7rsSnjhX ZiӸf^ ,;|JKmԑA3Lȝ[%.C5.PH>D \yr|ZgI+|%7OCg0 Zr0ې%VhtԐ_ >ĚKc9S3M*]7UmI {_Jl{܆Ӹ5( #wk)lkg3VFu+Vf l a5ju~T=Z⻗ﭱ9}3ZbD8ᰈ"ofu;⺘ dt fb;+-pq&O+,%a%,6-c4=/Fr]^|Y<&^x&]ҒmO9J[7w_t5-~Nkkt_I -!%VSW[6-IvH%CfU,؀+bo]v4&}yF#3ozf18ۛpA6̨PҦM? }[XTS!CJd*Fxx:9Uy s! kjrZ;Ņm}˃yx %DTJJR\ް{#ٽ[P5Ǒl_۹}mCwE<ȅ#Dɝͯ01֐{>|ܹW_}gL{{ :: <<;!HHJk$rL6&cߛdn"K #@  @7)b}b>1VZNx0r[w#`@ Q5cQ"y_j4V\r-pM& T#qԐp’t\вH`s&Jt Qł˹,c٬ҞV\dΕVŒ]}XqwgY/Deg9Qaމs4͜;1whjc*o͆EpC4EO΁͛ ={ %&Ό0wuNм;ш}X@իk+N;6:'s<yHEq.6 W(%sSz:1 $6 ro}aO4NDeǴaSg%FN`GWs[ ?PI=8^PPбcƍ7nܸSNjU8'24 p _AH\|9CȿGb΁Dmƣ5?= $c#@LE,AE4% 3qJz븘b{^ԓU-&vx<1oF7yՀ $|{ԣZ $'GAK5<ICt _b@l0.[J>#a0 THB~\` R>aw՞DmJUljL K>`o!Kvw%Kn̎XYº -Y ZzzN''``v~Jrx'ko5իTHWTvOr/WJ+0J^c 4Kt^'VZբE3f888888̘1YfW{?3m`=p6޾h1uãiR"5d_CY i=v]2aSEiH\0EH `'CVU drtrݑ c"۪f68q $k6{ D o`;7$=@rB qDv YX,aPD$U ϘF&'Q0  Ԛls;8Ȱ*i1˲uf~~9G{%\A6GI5,1V9ӦwoN'ΛW*g[ԡոqIʮZbϞ;ڴwf)zu/6mڴ]vWoXZ)+_MZLW yy;l _sػ,@ݑحX{S85$o*/ $K䮸wprl1^F̨,)оH㠒|Ua(?jɯF;-W9f]w¯zթޚ6 jEK㷜syRq# /֓O@)x@,\?`4=F_%`:%+(=Ao9X !B4Ec<㫨6sC*BBB""tQWAEPQ ޫH5!^OSg% {ѫ5DT \!LwWrcͦ ЂAeZfiBŚnL6:\&=kc˛g-&+dz'-Q˓j,W |;JMo"kEH&L.*JKʹ|1<9U_W7̭CyTG¹s*c%V@Qxm,}ho4CËzﮮȑ!C.Ԯ3}p'.)*rhQQ9@\c:N\_Şȳ 70FvWVpׁ#-+"qU:ÙiFH6DF(^ >b?F 5vҀqTC}y4;9Ė(",c8`x'4А`@J`ID0L2V/fCV2Nj:6M,><[2?'gNfJdEg| W;CkWB^R(WfY\IzNE^Dz/j8xU峏͸ ϫHzKl\(,Tfͪ:P(̟VXwr*=r:vt=}63:mZرWrr ~ַފ?^lv_\Ցv3CI`֟Q^l]M8T^l}OR\Lg=S/nېY Ν+Je|R%U(WYXj\3G޳u`[͚iE.sUUj_=m۶hnu X+W48dIg:5.88ϒAU뎘T r1Y_Zz/~]*L+Cu|rwC:apybS`-K) U`s>-֬YӡC dIzɒ%n ӧOVۓX%"޵?Xz0q/q:.a_U:όUD0BD Y 8h߸м)lIVzUpwc/;pu֭JD2jOkXC˗ÇUF CC٬,\߫-v+@hڥwoḾ:tn⋤1c.]\e{a?i*[t r$甚,vJj1oTӇV tu fЪDJ,`ocޯfl) GQE sKK42̘>٧Owe`C&%%}w3g\hаawyaÆf/ܺu5of} (_Ne&j#~H$;ȺBd!,]$a-ƚxs Jqu4[,|R8K(pM_\weu ʆhq6OeԃXBt'6"/fS<+9%Zϓc t.W(NaSضUF8 ldq% 29b bH!0n:4Jy]УeEiRϼͱS̞3W0}h՜e?VFt;t,,[Vuɤ u09̴?>DZc!5jUtiiuwkj'qx?nؐUP`o֥IOkw/,pHEɇxOcmv6 G (M1-r{we`۷oܹ*((޽;vј0a„{=z={v͚5a 'H* r d$pdv yi8 b)ס+؜dB[{AƑNI&J6U@BB(q*sJS6K`%75iBQ:jRߌqw͊Bע*Ƽx`'w9TŲtJ>)2@ʆ2 :x1@( y^KkfeE!75@Ȱjy6Y\h !|MhM-\._<+ 0/'\u ZDi$`͐͞'>ŌEQdՊ=^3V Fq)}*oV0*USƢ"e 﫯=Fרܨ>9Hx_*?yl`kV5o8d_Iq WϓM 0ŕ{<dn#eέQ `CAI r8;H$= 8 wq6e(&+S9ׄi\;6#NB~hR6+^Yjkw~<'9EW\aD֏(LLGR&J+nHmљ\]cELLD*B#ϔ뢣 ٛGU 0EV.._g=Md .0i['>ovWu{cW*JEEr1͇fM·3̘S_/ztEƾHm{NlPسGyifW^qj@}m<i E޸`?5}iS3u'4kvwﳯn]fV]ɱmޜ=yrl~|}s95p(Ij%'w6o;MGs ?e[KzԲrq)Nn ߫h .DkZrމ6P@DQ.M\+BAc$2~]yasA2`IGKpzYJv}Ul+\TXd "8|XT=[")~:P(̟,ee3fܦMx{,秾r)v>{.ڵ3f~ݮ̝2t#.oN;yr_$M?mZy)?G S}VcC\4̙Fc))oo2pV`yB1mvD Ų][L'؈{v6=T2~cjiQ%v/k0` ~bm;-LO9O^ ՠ'u%uğ2=U4BV9 Εf]?~~gG(-,떙څv,D(| 5|Kp_o$DaƍEtN)JL}3ےkezc_r )H,NK0a}IKпPc:IBLo㸎lCQ p>jCĉl^rɚl,`//ԼL'Z0wo֙)VTޏMьN6N%e'9s Lx3Ii>g""' D|c2rB$1Y0SS7 AtX߮]al,˳̾e&;#ϐPJ'V5l4C׎]BoB+̛yVU(cC*JgxZQ,gm䍟iT*yi?Q'Ӌ1V*l>o$&gTIzϾNw_ҺEE)mz_I=&q8½{ f=@׮]<4m|lЩ^VܺKmڸ ^f1YNnj~6@N3~eQlʔ4NQHb\HmKCğ. 0jNjz.m8sHG78@RJ:uG|i9/# IDATpe2[H%'/g35ZT_`!G7ƍ*6Qa4$gv[>8 ǨnsS Jhŋև5l*3:v=CW9bY^\"욂<kȖL\҉&aA^WŇᵱ+|M(m߆zxhӿ8||g?HޞMxq)E WQ#…6o^FgB6m\۴qdY7_X\Td0]Un 3L\34'P}պ}#7eӇXKU랚2/|~buLwP 6L=Jk^۞oXeaU>sKlضsj1H7{dǧyi@ewtJqʁ;~e떙#RwPUke`}Ӕl&O"% 8~ݭޛ#<5cpߊq9I=@@TbgR;QpПh9n[q\=e9a帕}˃Ag}cXf|õ}"!ė#˩ժY~׫iʨ5K/ٲMy{gwOdA&ǜϪxFr8XRorž}_HPyQ[f;M;Q_n9׫&!ݹ_9PuO>>z{vV!r'I $B;Zh6*%݋FM3_q8Dr _[KEt&(Kn:y'fXSsbҗ!PHnXWc7tx(7 ɽ4QPxinF%.7nH8պxUɂcg!i;W)4 >G)ӱ *b4A(ó8n%KA+BpjbF?mk_BjmxVpډ(Xxzg=i+_E&M1wku_ 9u93֑4kȨS]\pJ'\VZHo { ‹7+ 0ZMQŷ̩XQdzqt5zqė0Tc9ΕD]iMvS\~ƞВmhͰ-D'2jX3b,va Wca(ٔGӰ_l")tü8̘Uy}w^OO aFLB|܊Rsg-_tddT`06gA;кa!! J/,<@eXֽHao)8rv?oD@NY}I7F Ÿ`s[*ə3;WOa,N@W1Nu5B&MlT]swXmDś}ۈ$2'w_ˇ"g6߂\څ DgwrnMMEQr1%Qh*U&4q"Oqu@H&kg<зF 9SPF LO kN> Nh_cD FU7ߴyz|v3nYC<~(c3}H55fFSZ=Z 8Ijg^bSfA*^~ B'(Ѝc8H(;lWe2eQo s^X+YQ?õdgj@AůqUE)0Uj`6^u#DG+ӧߖV-i777 }hL`A`Bu~Sqׯx௄b)qğ. {jAoFʷ,%e$@F̲}$_e^Be͖t0FTY}Vu󧊥Xf*yiEN ΕS$e*uǵ`6QI}?%,pu#ׄG5 &3R\@xբĆLt_$p N51Kh|;_U(8Īu)$K>}'oRO۷VQǒsx=נ.< %rV0qpBGvrH/axU_(#_BJc>(qy^vgAV]X}wcJVF݅.]麌ǹܞ#IuA|=UMwS(SXF$ }}J'ݨnXӋlc8uzU>7W#RD`Vy Vɓ ofI^IOzڊʕ5 >?Qp:jp 8bOZVMc D wD1,^\ԨnwTr(lzʈZkv̲p#eo{jˆr5Ajvg0`/|)vW%S[SWN;Jn">기uwCSEDa5~v KLA/.iwq' j<,Հ^ ~c1ڎ;*;ƧqF=9#% b=KY:|˵W5\DPtA~qS)JE&'8"Ve]X^5SJF3ϝM8҈lxBV &b_l+؟Y_&QT@ı::Tzw\"@I7D5Y]PO>٧Oc}l` )[)((PI6X r9Dt8AN" X;dQK`"y!NqH}73_#u+OALCe\0@G"JVZD]Bv {ъ93Y+$gՕ&XZ pl% DubūIAGdQDS j#FA7ZDZt3:@b+* XQtKgZpeVcd.q|4ƀ=_"ã Y>oIqSlev5j[: H  |q pZ]dڊ@p(K%WvjEV|-ŕZxUp8xc]( N;vfΔ/m2V@[Nzxq'n[jT76o.lډxTb1/|FfД^]qл_[j𽵮f2 UZ5oكL>=QԵn-xz"M\Y\iR@0PTZȧ #)N4@T 1Av(Bi0b" CC9Ŝ B.*h^JNu ٤6C.f̉$6]1(RR7j_H: (HA+<ф"%M1xnfn̏ &dBy.bl6&TWQCE%{3-˳TstMuAD6>:^ad02(! |}!!jwӶ+r1s*W+3͜2tlj(NRǟ:CCOIϾS< t/jh&#tM&Jj*ѝAF4׸ֆ6idMS|]™blMquJW@c -pJ.> XS[s(kdm`Ta%8BK'2ȼYXJ3<['xZ(NEUfYޅxy@ŖϟvFJSPjZLF\lHB9(s8J mޙ >]GF~EqqH9uײjkЧHKL )0bز<񄣰"-망0Aرki``$I֭c#<Mf^0.,6\dxY=%|\0#!\!k?q@4{bU#YQˋ/v"SfZ`/SөA9ս1a{#C^-q5;apd>p|=0 +1>T!=,Yxy [6׵FYt&s>Z?VjXBeٲSJ7m*5;4Lrٙ_\<\X`!I"0i;o|8\uu[p*"y˦۷^ݾq.˲R=NF{g4УwQx}`_l(8҅ V#*`1[I &u%\Kl n/$aple>60K6kXU*%OйC p0mzc"kI?EXĺ2.S8]1-Z/wZz3qE8˶k!%3ˉ$%a%fmy#%Vު>w/! L :7%5~(L.lUHǍ_/sxCu<# |"8{kwQ IDAT;V80*.Q:0aŋ}:W~մKP ]R"X?lXB#umySr`_UjrnNȔy_ݻZ~res19EEYVf{RbǷ{GW-XK|)_V;aN05b1Hizʬ;g0}?޿IBr2D'ǎ.U7sD~\9F] &ϑ~ tZi8K$ "1g(P #8"P,zIR1InLQi5p)ukÜMF ( +(5ƴ'2UJ"#W*${{Cb0 >.ZEv6u.`߀'Zo$4Eː[ AIvp3=PESfA#f&V'.7/pvqR+zXCEtljK,HϚTw%2jDtKNcU`;ۻYl;Gl,' C"C$zQg+~W#-;hɉ>xy q%XkC]%:9UX .\?;>*;5wBK@w(ײTݕˊ UBBBH'dz?B`&U|^y9fssȼqaDބt o__Yn)-͘kz ֥oeX#G4{3oXԩqS^g~:+90dx[LJ-?Eth2Yrj#}?V_XlO<7mz1:$/+UK$B!4F=pľt]c7|ӖgO7"u:?mIݻ+"G0sT~kW_iK3jWwlowfJ&G֔V;JKXl:5Jr٦ ;//rv;jCUU7vyf?e#Ҫ1O'|$A"|™\j'i῞aoV0~䡡+WRh2i]sWmJ18%9Nb>|ܩBpC[Ņ?[BqWa`iP XSJ&<`'-2lӱƃu૎{-%mˈ,r$bG\Ig9ۃr+T!} "IApN-C<0T3(busB0<<`䐙j?Yr㱘E#Tp!MBhk;}\y:?s] 띹bM68 ;Ĝn\<iec>ey?Y&sU<\Gny,b ^XDaLζc b w>4a'4WRbr II Y3+KuiHѣw+lĄ >ysݦMu+vV2vǨQnqVk;p!1Q7kLZm}7ڛo,]\m|"xx(O;u"CTwD*R pwW~zbM0[wHu1%ꍀGUnLU9}d4 7MU56Μ7ӦwrUHnYUM؞ Ⱥ^K5պ۶H욟 599?\X|tWi{arөi ƽl,;ur6UVFE꜇܄A&nsJ% 7g2HE.QuBj6Q_ f/XPuJܺ*Ɂ$Ia/rX0POa'QAՀ3hRJc⃻}"WZ$UoBJ]  Bn@T"IA3/)@1!?E|"E"#ԂQ\0&au3o4H{Ⱦ:r3Ģg K]cl(jp:mۙZFG]/33&MԩSiRaia8J/rzф؅H%h +PtiK W'V9y2F;hۆW3Q\n]Jyի\*fecѤ$ Ӧ9=k ._3ٱAKӽvUXQa+՞=XPRkZx,3x://IJ1*Js~]:_a֫%ꮱ!]dR78nN6i0צ$^M-//SfW7EՈ'oi< zGW7渞WVۼC'Ny-R=Z ppuQ$/:mMBss`a#t@cGEO,74^mW*5BViZOO[Rkufz0˥Fw'\:_|pܜƤw w?˝,$.*_4b"Ρ/\ l0己`m%l@Ƃ}FaIK3LӖ}(-%Hl`VpGF~jJ Bתo4Xߎ#{xk#r F&^.QW)e Jt$0׃LŠQhȨa֞[o E*Pu EOI\8 <[kޜBV)~͕ǯPTIj W5]r6wh+jllV\ s̵kaT*Ç%$D_>~{TR*US׫W/lXw񢮺/+3=[KzٯVZQa1~\ƏLOW:vTl_(۷^xM9 -$?8䇻xϞ.aC}EWL~b(+s Kg8؄<|pB'F-wp?pz k!*n{:`7gͷ;SaC½+^jTqC&'i^V\ڷ\}*:t0*__S}#n-Hx &<;6*p󢾊ޏ؎ |#q#p Jo0JO<(>e48 @}HcN@!z:NO{#yZK=J}i+bb:+s}pq*ȪϣׇDy3ֶM'fؔi%GDw - $A[ *&fRg&2_) AEމmP\ְVN6)'vSA7KɶRRDTº`am, K%.7Ѭ+Kw8! d3ic7nԒX//fFMNS6[`{]5^\[%Ah4^́ Ϟ.P<נ7nn-t!;1Ռ.#eןA%DR ޣNNjg"E?$" 3TmEΣ}"=6`q:eu~"98knu%XMe'pȻ*%vx.]$Bff_q0Vu\f[rToL|;s1ߕOUť%92Mj1l~?l9ū_7G{'ߧts S*EaTo],8u=mkqq.2//iC5)Iuǎi++^5JJ..YH|`#ȭ[[gdt\*tπ{?^ހ(yCrJr ^""}~"*: ѯ6ɺi$vJYY 6!U͍Ouz촟Vo=L9ÆdB1Vx%xjvKǽs+X|hϢ%c_Lp)hs $Q ?x)}K٪ePQ'EEx{  HPLWH9$h-(Pf@.:<P~ߡXuhjp\Ɋ< k*՘Ho\y 0rҝ֒T< TrB$ xvc8#Nw $zVeH#  ɋt>ʮfs $? obmt*PEX=l|V䪕oFSbg zԗiE-"I̦$ճOaA?Yj9[ #9W\׊/XraTKq!9H# xQRZ߾k.IY>^:ÚmͥQ OI/6+W#,k'\&6..—_zv zӦyyI q}m?p}mm;ۜ;nڰ3{/xʕEE{FVTtڷ͒%A{_قI%ߩd-)_&)r 0xHd^󁽻3U5:fzCjJ|Г8^olۜz745c#OAHܽuk.倪F7`P#u׈?iqL7N4-;5i0XVG'{;{ n\|f$x:|u \QA9Ʊ$}7vֲv)ݢKM&7hohhDCsZ7m)#SRa#DwU[g-^wy3_khhxZ(%<8䤒M[Mӷ8}3'o(o0--o xx([F9/mؓq̑O['kNDpqQh4- _33*rkiEhL~ؿ=dX[U_.I;Μ&~ma~^mηmۻ-b3Y%JD@sIx=0w WwW{XYsÆ Z]~g֦|X[F~~+Wļiߞsᩤ$qU#($rǩ v:WA_KPJJ{B5P y&,'!LURӳL78m$OՏJ@v0#expl'"q J)&:+^Dm">BN1j_\#@,>,'h8v.H‘eaMt4ao WF&C 'hj⢉Gn$ 0̃uJدf&U+VSɩZj 288][PvVM(saG䪘mˮJ(T1{$I%ixܐ8|ū>Jb2ONn^Y*{Wl$9?_zV+)lhKOfZ!Zĕ+u*8dB.w{vehAܔ~ktA| hlo.M##}jcuN&Dwxlf %e舶6xPL&?JZi܄讱7ƶmg f˩G unhhι/++Uk5&o'FtkuwiIVc t{rUnn~"*+4FuĨD6|\EY56drӣW\.ͺ^} G=b~B;#b ֢_ɞF#_σu?]q7-X6D*өSpt>>2jߟLi\W4!tBNJ'|(aģdF"n0Ei?Mu YH7h EbQj~D$  c[1,ɓMj3JHx/t<ՓDP'޽J f>VSNL<ġ"~jPpuّD_f>C|qIG5Yy-ަi#AU-j}-nMn>6rQ G]kZjL,J-vUqMLBO76^)z.9;vvFEή3770=.,p[kX8ATXc+i0`^ R520m f6T^ L3i. ɿZ*e+HIg:kpx /H96b.K/՛LJoNqhikpCY=6Vzè1~iݢÇh3 sU c$8ݷ`p/`  NOoU VOxJ IDATE}4*.K$p%j$D3m+@X*=K>:b=:q lK$Bؐva%`ݜbMڔPJ ] xx;wo+{ق^*Z?}u5[JBCņk\x53\60ٶA~|(J&! rKڌ(%((L恹({`,}а?L%9a#ލ7d8D;5$V2ԖOťXfQz1 tΕ۝~e}R$3\cyqT!ɛDg@UꀑxFt| S9QFYfl`+5"go![x%vXI$ڕ7*3f^rH ⻁+4N:&.8N*``Gs I蟏á4[Ӝa/Ӊ `2/f{9}em.q,uGr6Fg.-m.9s$| Hx˱cl9lUoX>dHH 1(Z 'ֆ-|~aq/[Jx^^r֢ywn)-u:Ԓ@hBh$Fs>ɸJ\oJr:k0 ' nD`/-R$O2w|IDPܞļ, \e Rk䈀Oъڋ2T\a A*r."Â-A'CId+ ʦĄ%xe*Fm֍`_V1O/$B/܀>(`ŢEROA<m~2`#Hk.)0&]+9j(429O9|x:9: OO8l,H/ ra=q/Qwī4. hGbb&v <)rn"!@'2iq};Hҁ\?M06# Jf#3ir%GQJxǡMfQ#Gf5`Df9dk(2p=bm,R^LeO͚ߕ'rI6%|1|s9 pID͎,~:^\e` x#AT’ԍtm?%$KsۋY3a˜BF,_.} ɥK$'U]|^xȶvwSe(&Nxpe†^cbz.>^RY۶3ϸ }) |)>p4HQTd=wμ`AC|Um+}W}d/.lhӦrK*mnnw0gulke'1wxIΜg\[Jţ&4׮zF’őBk`_XVtn sq#:Q/>B*c8AdAC)Anc"&-2M@V#9A*8!C@ K $Hc]BJ*(Y5:?\! a&xl j wJ0H_ĭ;?>{x/B=< +0: {b-\2]BtvS yX!*\ v>Dt Yk]kR>6G`6'u8cCx/F3OƱa+^ A$; ؃g&8_RT\ <1G&c0l*@#d$aaԻz1{x+Vx|gP49nK>78hQtsT!̛@о22Io(`Q*2 %5椊V[L ռWL;' %L5F"|wK:oEdwIsXExɰ&j ^ P1qFwZ!k܀>CrZ<@!1Dq=c@ ><.. ..nĈ:}]>04 \ ? ҐӺS'uzzx.HEŚ;r,[ZzvD{,i0ꉉyFǵ1"XVOa;FG1k*) 'zSHj_Egq> Q (9LeUF H%R iXs66Z B4:\3\%WMm5=E["O*)9?jfMΠ@tu_^fu&Kǀgr)Nr=`fd14ovb01u1Ōey9BD߼#(2{>puFt#f͢.|ys꬛0x)k~-=*8%+ђ-/ۮ޿RUm6Ν={@>h\Kgr8Pq? l6M'N7n4^b;i^0~2<\:trouk۶6o6deYڵj%uwyǭ < Q/۶ɂ^w0=o0U^1=&ӁGͥ[OXm|zs$߄TŠ zh95t b\VIV=L;5|C7;z1ݭz$ٛIau8IW<ۍyjS2"KGӢVB{^v$jbOe΀ q&SmҮؖ@{d%5X↛kЛ=EP,:,Èيu=GSF@p@.W\39T̿!!!'oy'wh?$˃x؊6'vbJ"# Vkʰ0I<ƌ:vԫTB׮j%I8tE"J++ &,ݟ 75tý5Nc57Pty="CΏ ր-i6J+ƿy]N|WSуhѶmt '2H/!xg8q.R[H݈()zL̠[;| Dy0cK)ܐ&gx aUS0V;C؈e#ztf?AR>]{OWVYv{)$lAkgJ5"R$BcE o'ًUd82*ٔ0[t0o>@Gq3t'ŎE'۝"~n*޸deHUiXd1Lyk>TlfEVP -g6a<މ'9y8$#t~",%J{:To+ gі`vȁDep#< ulZNXE!Ɖv5,OʙVs}^Khq3BbS 8M3_Ujz~Ox=]EMzhZM䈢hKOm6\EQJEQ.kDQ DM4ĊlQŚQW+X!,(7od980E(hӉ(61QhSE,MīMu:(jĢ%bF3K,4HEQzrIT٧aV$!ꭎ-ZQ)6kEQl (cM (n+u 4 - i0.br_ݲuE(5w6b6XgYu_0l?Ç۹~>[kB8? Mi.s5º2hbed ^ oT7yE]e2@(F9sF8%cBPo 9ܲ~y~]ol6߿(LN=yceeWH-luښx:W-?ӿHҿ4;'ƧӬt_JߥY'ө4k l&ztU`}Xpܾ}+wz ^DWWWee).$x<+#}`93gX,O>=~m``n dkaaQӴd[ }`577wvvlP(iWCaa Vjx^+M/;X:OIDAT,`HF  @2 d/X'6|fzzZDҧ#/_tH{H#`iBXp)t:Uυm }zqC D-N:?hd2_ڂG6V]v馦&S!sORIԑ# :[WWRWWӣj 7D`g_9wP(zd͛7eee+NP5vI4 VuuuwwB 8{ꡐh4Z\\bX"y]HޑDUrG"Cwq V&Aͩ:;yXxiiy%ҧS$`H1NDWWWee)xW<Ouuy%ҧS$`Hp8gffVVV&''[[[< Uυ;v5D";wb1s!#ORS :zHBFjnnlUUUPvs!#>/XV:22z Tυ>}I~uì$qDr];XJP$`HF  @2 d,(XQ$`HF  @2 d,(XQ$`HF+Wܺu+y͛/_V5&!X8.//-//4իW.\?|@vdb744x~n7} 0 F"|+@<88x=<%%%y޽{׭[7ﲲP(d ˭'gxx|pƽUUUzkvvѣGS]]~c2 6iރVBKP%/I4?CQM~g{lٲ{EwuuIW nH3z[x"p7$B @ 0` @ @ 0` @ @ 0` @+zE.5>>.]|\*b Kp 0` @ @ 0f6}qi']CYذa-}!ւ@)0/j̙TTdh԰bt Ap-$5ynrYPP /@ z&~e+=goO z.+jT14zj=gcJ!@ >p~ƍk֬ټysܽڠ\Y/ifA?Mz0rCCC 0?>f/*wo]XX8cGG6?s6{PcCCCrΝ;'>}:%%e1gϞΜ9wo z|2 4CГラ^zi2}mI0LK g^і`?vؽ /D"-+W닻7=;^ |oݺ5*} (((-H$??6{P<88x=<%%%B!P(T^^>➵y'|ʪ*0jjjjkkpZZZܽڠ'CI3?CQg?쳉MMMmmm{/*QˢgNj0$@l @ ]|>_|x']8 V|YLfA0` @ @ 0` @ @ 0` @ @  @z.`1\5̗˥B+ʁ*izb!h @A|>IWvQaRS{OŠ `L@)0Xa=αy0[9`Is(@ 0`H Y N^ :b @ &j,ųD$ZC8+a0` @ @ 0sM$/s`ZH: d4JvprB*QaOqH=[7@)0`>:#dffNrMc322222~ooM.]\SMn)))x<ttt gU3Nݎ1}׮][6nܸf͚͛7_ )OVGM`7-.Cjhh-@^#˖-KIIY|yEEEWWm~dQQQggg v} ^>|xbשSJp$@x…W_}c= |?.+ :3F}IXQFFF ɉD"999{W\7R›nN2 F"x޽֭wYYY(2 Bu`AVUUzGݳgOuu=an0p86ҁ›n4m>qu{˖-w.,,\hQqqqWW'0ܶƸ @2Rg7HVGM`dR|>_>O( =Az:Jԛ0=]0OP  0` @ @ 0` @ ʼ^IWa\.Z1Wz:Jԛ=M0W}o@ 0` @ Fbm,TXHlu +a0H\IU9Qahlx$,B ֢`] 0=Oj9`B @ 00>;  ]y鈞[wu qJ!@ @ 0` @ @ 05~$ 2z:g ƾv<)>GbDw= zځ 79`|>H3=l $;P  0C=# & ;EM{pGjLe}oڴiҥ|]###%%%񔖖f/LQjƸIsss㛛hii(xEvܲq5kl޼99lzS2@ `g$4;::nyKQQQgglA>}:%%erٳg/3g;ҁV#p A5`0(] 9ľWLh8'''Ln_re___ܽsz!j9H D"@% ಲP(d g$tzxxvWVVVUUQSSS[[ @Vpd6:ښ8zZے+epgBV'8|@"%SE @ H!s}0C9)zZQ,YL@)0` @ @  0`ִse>=[ H,@)0` @ @ H2KeM|0dM pME$IA5\OVc6,R(@ 0`@w>Sr=/г՘nD=_-ːP  09VLBzѳ՘b?_-IX(@ 0`X ]y^eQzga f8P CЀv@&=Gl5_-!h 2?q$nXBC]=l5DJJ0`,4i`6T L=[ s4iľ^V+gvPTσk=[ g q0J!@ @ .C0_\\ =[$ů+!0`͑Dkޞߟ{{{\;477HWO5}ddtwwwww{z={x vݕUUUaֆᴴOe)2e˖ݻw.ZkFzzzSSSkkknnnnnn[[[ccc p᳞.za痭 _zF.9(2 & 9#|x^b˨pD?z)^`~0}b6QQσ_=[ ̈?؇Y(@ 0`0. ..@=[ Ȏ?ثqME$Uu0y@Y !zQp5@ P 7cn`p$Lѳa!hBPq0fȏ.N⇠PX}pL>fiT8"RV6 aJ!@ @ \ \( *\uzp,VZէN#2=+l5XNǭ0(%A#=l5XsElzh'MD=!V Gzj@}>_KK^9[*|/ FtNVc :`B LKu?V0&mM,}5cyӟ!Jep\qjEo*&a_Ԃqx %EгK⿩W"W qWkTEԳKonο:{F4p0|>_KKy9U0`\9;$2 9PO>*B/JϾ:I*&[k0 A3Bzꩄ (=zڢf]y^9S}٪%gjH0&a0 %AHKP%_+&Wzw ø;m۶bŊ+)#Y^rίРHP%_+44522RRRx=Oiit]XAGvܲq5kl޼9Oh9WhPE/yK 8(;::nyKQQQggT=AӧOLn9{e]v̙QA ?_ABK8HWhp3̫{;E: - ZE:B8(,Y2443ɓYYYqcԱW_}`Av;wf3 Ο?oL%J={s?@rqwzAAA86oD"s}IfFTG]1w68k, BrzNʪ*0jjjjkkpZZtiXA=ܶF$Їz@ 0`===~?#####JWСC}Z)z_} øvܹS)V^/vuu9sɓwF?ڽ{?q4~#G9smQ]]H)}ћn/ϛWZ裏Jw}7++W_|Wnuƶ6qO1[VTTTTTO'6~׿>p8//O8rHfft3{6m4O܁%Eijj*++bΝ;o}룏>.dO?ԼO?MOO*gv[mmy+crf0I!膆@ `IR?ywH~7rÇܹsǎ҅$/>tso^Z).\8}㥗^J.̼o!UlX8InۼS5ۅU\>qz_tZ.hٲe)))˗/.'?ϑ׻hѢ;>.*m۶򗿔"|>p_u11X'E#%%ell̼ell,55Uؒ ?y䷿H2wW_IW~7?|嗽K.㏥K.6~Y$Ybٳg v 6d6l`>$^3oyW=qܷ\ۚ e```W^yo[Z+..68"%%eA'TN?KW1?\so11]7޸k?J/^;qĉ'jkk.\(]8.]o׷l2zbsѣGn+]Ȭ455XB)8OKKbe˖8q¼epppѢERpĉ'OJ2k3oy:rf|<IDAT]z֭{U_k'aH$/UO:~nZZZ*]ˬZjppP)>k6[^k;ay7$-((.a??ʒ.dǎ[jy˪U;&Uό^oSS/^|7K\VV [BPyyT=Ijpp{ygKJJk7xtS8.ݻn:*z-7|is 8{K/Wv>hŊRFMMO~*b8q._|u]3L^722"]\rϞ=Ur]w =zW_ꪫz-p'^RRo߾<_.]_~-ujЁv}wJWqA۷o~ԩsW_}/(]{C>䓟?tESL6qpq> 6oذ!$8g O:%]ך ,_ExM6uuuI5ǏWTT,YK.曝9/ᦛnz7e޽k׮̼馛^u銢OMMmv9}c[8 Oҟ  @ @ 0` @ ^ hGIENDB`gsl-2.6/doc/images/ode-vdp.png0000644016036000116100000004422713373111455013160 00000000000000PNG  IHDRKbKGD IDATxy@T>3 bhBkefefX暚{.ah&B/3?gaΜ_8NwsιޫPT ˄wU0` 8@p 0` 8@p 0f ?yyy(MRc =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|MB]J_R M_6z+V$%%cF@pnn׬Ycgg'<~}jJ- xǎ.\4iVQpy+(+<<*JyxxŹo v_0$œۭP@IUeDGQp@g0 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'$$ׯFZwLx{{_paĈ=>|{BRɸ/W(Ϟ=ۻwu(d@w'^NNS~~@='.ڳgOƍ +77w BcgddL>>v]sss{ݽ{h)<<wܹi4Wϟ׫W/ >qrē4lpԩ+LVVΝ;JX^8p`Ν7Ҙj@Ƙo||렠T^ A#155^ڥKۇae666&Mr劭ĉ>}ʫ}t>sk‹bȑ.]rww6mZvvBNNMϫW_ݹs筷ZjR4|yd^vttw/tڷo… g̘/(;(ѥKӧO:wC rۃ=ʕ+WTTdʪcNNNgNMMvZÆ 7l؀)*3ԩ~;w/G5dmmH:y]SN)))Æ }z.]\bڄɷX{رO?_~ڢaHHȅ |}}[lQPP(C뤂)R.\ӼyD}& MΒ7|sΝ ,/zy]}&Mz0%:ut̙Ν;mvƌU'd)_|W_mڴ5k0#*1kkiӦ6k֬*H#uyK7n|)S/_mT~0ƂϞ=۬Yf͚XJc|ܸq mTT.]]hڵko߾}֬Y1bD|X' `t9DQXXXr ,,,WZXOH^~}'Ϟ=GmBЮc^^^'N iݺuTTTaa PRYXXho{yOOύ7^q`h1ggϛ7oРAq}jGeGo7n|=zn~~ҥ CCCϟ?_TT{ny . hjj'''9r… &{0;; ر RτGDtܹsEEEM63:~u_RRҾ}n޼)cmб -[aÆO>d̘1UrZLRN={|' ,jEto@Ƙɓ'=<<5kVu։sppX|e?qĪ6U=Hrww?p@hhh-~WY !c̙3>>>F;4 clذaIII{ǎo߾E:KKٳgGGG;vԨQU'`ԩSrrrjjj+d;3 g}gϞ?JA6_lԩS̙SuX$W2ԩТE[ʲMdl@X֭\0X'r0cu޽~~~Ug1ӧH7͛W\ɀvٱc*rajj:y]vM>}ȑU16 caݺu]v]b[1P(Əwȏ>*LGۀjժ\r֬Y]v]n[&KN c->>M6-[ Ѳ7 cEFUXҷoߣGΟ?z:X'c;99޽{:t0\.O>ǎFew,1551cŋdFGGѣe˖}%?yǏ~m\b։v큁[6בc!y7k׮u͈Ǖobbbnnw3fό./ 믿^|yϞ=W\]Pv֭};t萞 X'zꆇO81 z:99ٳ~oիWڀ&M$%%;wG>W}app#G~1ce?F (cV^=`#ADs/aÆmڴ3l…ƍk۶mBBvċ%ޮ]u_\i Z] N<42X,1SLYle0`;?c۷?zٳ.\qasclĈ7n۷=0 hffhѢݻw%&?ccc333hd Ӏ >|x7 X?7@F믿;))35 c,222$$$((dž٣a vؑ;`caݺu9dɒQ:1X_߿DD͛ ;1 jwݘn6d2"##ufdl6.,,4 6iPRvGn۶mĉ۩ gjjeyxx޽{ܸqv2 }gXN-[rYT |c͜9SN;w6ǩT\b֭7 6d2jժo߾ʐX{X&Mbcc oa.aѣǢEtrECWO ߀ٳgt͵0555N-,,mV\\}̙3SNFE. |}}Ge]S -[\tnpՆNNNѓ'O>w. 0cm۶k֬ 3j{oȐ!|w-/.ܹs/^(s96ƍ'M$vx0cAsׯNBk0Kvyʔ)\.#^6m˗].ϟ?ՀVVVׯ7n5 y뭷"##xՠ;bߪU1c*@`=̙￟8qW؆VOdH[k׮СC1}>|xӦMŚGk1>aAWrIڵkףG/w! }cTTB*BF~}&cMMMxc3fkY%X{16nܸ۷ooٲw!FcQQQ]HiCBjժ.??w-C377ݻp*t%w!Bkȹ|Ǐnv֬Y"b^{WxR9t1흚ʻʡӃoȑ#X{D1'3Iի'ntbcׯ_]Ej@ooӧOrH5 c}]ڣ1WWWI&e[RLjnn.փMUsmVV**TtN"0pФ@Ƙɿ˻ G*?lmmE D@R~5UTpLkNA0X{#`9;;5.,,TT ?unL LeX{N0pC0P01־}CB#` `\֝pL-<\\\źZ'nݺO>8րL`AG0sp밨 ̙3 r=REX1u5 Mm6 M3E RaaaqqBaǼ!Z/ B&e`H=D ;M+\ A `j!20XKFoX;ᦠ XSEEEEEE Fݼy3;;w!L`-Q Gp0d݉D333kРsxD`-Q jժ*JޅT6. 懻͛7E9Ɏ&xJ P(֢L[I}u `++ի߽{w!!؀f q%j\M ]\\z#!s@Ժ%%j LmQZ5B!,Ԏ^^^/^,,,]ˑmC&e`X U*UNNX4}݉DvVZڵk_|w!/G Zz9kkiiijjʻ. S2erҿ ~XLs"г8L[i6DVTּ y!??dUXKbMAl@&:,m(4b\ jXWSUXK5 m k˻<n޼yjjJ]HE(7Y%!fx8h&&&oFZZB^r~8;;ݸqw!-V6NV 0P":,a )`$ϊ`- `F6M6?DlFB?%Ɖ`~?J!؀1gggl~~o@FkL3<Kҳ]H90-f͚`bu`#Dȳ{*4E,Pggg| L ,ÂޅPboo6B%`2jԨ#~H%)!cLPSUq"mH4%(MMM'y#>E|?+"T*ͽ_nP DYh>!BSH菀)Y,Bk O&ۀ!a00:BkV s(L%)!aLLƦw!Ckf5نL&~+07RB?7 cZjټ(X4L3m `#`Syyy0PByj A|ɟ:8Q@%`!ll(0Cm(fJnݺU\\̻Mw{ms@ɞDy!e5n߾ͻ"<0deeRvb?߀ ,gE6Ȇ箕$(/D?#K BtbƆl+;;ښړL$˅H{0| щZ|P{{{{{[nɾ v5u}...@ ,~ UdԌYQ l޼yZZZZZZ;t萓#^#;ed+;w KJ*((]H9db:uo.fLA,JxP`a %Bˁ mHVVVJw!/A cիWIqq1B^H| X ;-J2SJ#B<ޞlr0a GGǧO|dCdFGPSG YhQ}d xrl'\iCgP0 `Q`l<0CM6dX0͙|FodX6${VDWb ~~`!}d!yAp`:m( 16ÃceA6 ,P'l<u鏀7#`Y` ZwdX/l<j%7D SSӜޅ&J!@4AAB0 ͅI^^BJ$++Ύw/D0~oC Yhƒ $6&}B\܀,DJhh lUh l<0C899eee}@A3fTX${VDWb WWP8::fdd.|HdTX${VDW?MKP#Kd$Xx}VTyyy\#K b5 x=JPndoɱ41XGdB6$Z QFjպ>*!JJh^ i@ hnnN^jp盘.䅄+bnGK-V2mEWZʊw!foo]\\̻_ "txĉ"! O333 \kkk޵0_o цͻ }EޅhٳgNNNHMM=9֠5"ƻm `_"33ȑ#ݻw]H吚޿Ky "#%KիVZ _~%2CQJrf YQ"d;Ҷm:uD HZ|r_I(<pٲecǎ[.߉tÇsAF7oڵ+2x륧>|X[ˢkӦM5jڴ)2t}9n8"e=#""[_,˗/9s&88w!FaJz}JRF'O}?so}te Wvss XK` =<444**JuDF7o駟vͻ환ܿter{'w}7fZtQIRqEFF 0|*>hӦ͈#xע ׀srrz9a„f͚DG:,.|޽?pI8SSSwuU.{eNNg@.]ח+w}wݍ7.DKG*jСM6?~<2d2pnnn=FѳgO]^֭[ݻw_t./28%%%**СCޯlmm)Ѡ׀q%Kl۶M;gq̜9֭[˖-X\܉R >ydZCBB>scW;;;ïú~zHHҥK5jd]ˎ¼`)vƍoٲEWweǎ˖-;y=u\FSNMKK}Yb.,,ӧ_|aB?~888xĉ{6~S憆N6]vkщ!.tҨQbcc{W.\`=nٲeƍуa<xرfff/6N۽{>}ޅ!Ayyy }ס㐐e˖߻x|cܹSǏ!1s[1d#220{4.s3SGyyy+..ްaZd%Ӄ?p@Z y ܹs}]vah_~ժU'N3m|I~~ʕ+ 5`#`C;%++k׮666۷o߲ ]vm۶{9s!k'$$tq޼y[8qjaF*/LNN677 SК:ufddyxxFs6sSN5N #۷_/eVT'O7oѣG`nY&&&8p@ܧ׽XSM49|FFwt@??YW|ː!%%%uyΜ9G6 J0׬Y駟ٳC Gyyyz~QQȑ#|Ν;;v}#FصkǍuVBOwllld>NIIiӦG}?D`) Ɔ:,mV*3f9rmF]pɖϟmذ!11ј8z}mڴyC鎣Gɒ%n=ƍ1cȾqj]{R&MnܸQN7ggg''':z_p!444 `F󤈊ɾ+66vȑ&M;vL")ovҥ6l k999cǎ=~~۴0BСÁdfJJJ-5jg|SRRd8eʔKVe>,66/uѣw}WI_&}/^+((HNN" L7JRrs1ȠA֮]+G˸eZu퀀K.:u*Lݫ+Of͚Ž꫺oP2׬YӾ}ǯ[N$WFׯn߾=11o߾FߠA6o\XX(֎?ެYƍ˲MȲ_~֭Ν;6ӧOݻŋB7Z,OR8pܹs>p_|a_dРAׯe gϞmժϞ=ۣG .#hoooOO&M[@p|IlllvVgmmT*{ɓ'OF5nܸ 6,XתB=:vE+%K4mڴENGm􅅅}GmbQ(j|hܹ͚5JNNkyB5O;6$$dĉ111jEeBߺuO>'NܺuySЉz*`{{M;vL5~.]=U"G)^n?--gϞ&LXbƍq+eǏ۷?  76jԨ… 2pAAATTT͛4ir̙wyGߵ RѣÇGP`,J|Z5׹ձcǛ7o^rSƶhٳVirѣGÆ ߿ɓo6!hW\СÜ9s~ .|M'O>}qbUT*gOOO{{/8((q$''k.**jÆ WW+K155}^:5j4yd ʪx\XX8|OOO/6!4>}_m۶gϞ~~~M/yƍQFUMh2>y򤟟ߦM<8w\!s'$$ׯFZ}-[vÇۃիׇ~ܶm[wg|aÆNھ}˗ĸٳAAA'O^h[oqM666JJ&Mڵ˗/7g.,,\xq 222Ν;7uTc}^O>8qO\2h ]Tj„ JgΜW&J.\8l0炂ŋ+y.V2dH333gg'>{_]"֭[҆tB VZ+cbbb7nw^U d„ '111 6ԩә3gxU%f͚"aܹS=(e=mWmaaQ^xMTnٲãsΩ2X%ܿ)+++''g5k>|[x%dJq9;;O2ӧI .]RΞ=۽{w77UVKSN~kժמ={V%W ֭[XٳG[^^^?3VV͚5۴i#ݝժU .J0oߎXhр.\PV-E 199922СCͩUZ~zbb)Sn߾=cƌ})hRm۶pUVk׎[Az vJ $$$h_ZɌ36oެ> ̻Q 4ڵkkUΝf͚Ż!^A9-HM6ۿJA.k3B_DRh]r3ؽ{oȻQǟ?~ԨQ9Z˖-MVy/tڮ ]};wڵ?\aZW3f+\wve#` H$t%** 7T@`o޼W_}տJׁ0Cp9+RnffK]  œ#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|MB]J_R M_6z+V$%%cF@pnn׬Ycgg'<~}jJ- xǎ.\4iVQpy+(+<<*JV8777.4kxyt*_<ɼ lHV(J=1 PF 8@p 0` 8@p 0` 8@p 0` 8@p\iKJꔝ(R^)T*cLRKR*Jꔝ(R'gp 0T֡) %COAI%LAp 0` 8@p yfhh}hh[9#4IDATxWRRR>cGGr_A섄~ըQUV111Rnaaꫯo,%==7,u )UQ:cJrѢEVVV7޲eoZ= :cŋ/qtttpph޼ŋ z~ںz o֩y^IpVVV```Қ7oޡCu1ؠAj֬y"UÇcbbݻhѢ+W,uر{:W_}5sӧSSJ2dHDDJU:?g>{lڵk׮%XyۗZ?|ͻu֭[͛/|J߿#n޼yʕ^zS󼮕= oܹTd ,UOʶ'LT*Kx̙zT?4 1@ Ȥꌏ֭ۋ~KTuuMJJHN;;ׯru;;;g:kn͚5꟬Zjty^Ip@@}?ٷo_`` zU 岳-,,JHԴ4ggggu6lٳgJ Iٿ{跤JUcǎ֭[T5j(5k֔~SÇ?yAPP3:+{ױr\ftOݻʫrCm۶5o޼4K}ɑ#GZj5eju4iĉՏR2jժeff{]tWtss۶m[vmmm;tpرߒ*U]@@͛KHp??gϞ={ȑ#oZnTBʞuDRPP>e?~A %P+U"Hǎϩ9z興?J޽{BBBnntf͚үHiiizPZ5kkwyg˖-44ې<==Ϝ9ٳg5jī Q+ݻsСC_Q+U]-}W!:ܹӢE OZhqgRgee;vuүHYJŵX9֭ۺu?Yn]yգ!Re?xK.QQQeKRφ J?1RKٺu;#L^z޽[]vJ?*1VXXt>|7N:IRRRڵIZʒ%KF!LΊkӵr Gz3wwoV1szeee?ʶ7m)SN111/((}ի_{ݻwS\RݻWPPpڵoԩSTTov %HR6nرcDzsѢEnnn5_~"Xj׮]SRR ߑ#G=Wty^IJ~zϞ=zYGZ]nJݻ+YR_N"Kj^{mРA/_&Xݻtrrlݺu J۵kW"U֭[[je)u͍5hذ󋋋ԩy^/7kU 0` 8@p 0`HIENDB`gsl-2.6/doc/images/qrng.png0000644016036000116100000006446113373111455012573 00000000000000PNG  IHDRKbKGD IDATx}]y]8 f_xBAƉ %Fв%ec!K䏨ݼFTU] $J#D4@B$5]l89g<3s\}39s8aqK0 0L' aa< aa< aa< aa< aa< aa< aa< aa< aa< aa< aa< aae̎uaO`XLkmQ [XK6|ZB_eˁ#wYy}ռyOI|*Ig($i@129ύ&P"H_;iZkIYjr&.,yh/ v1EGxܗf(Ea~J2/&,v]FzUB_Kea%E붒c@1 ~ҲN~J\ԟ {j%sb"y ɏ'=>PF_Kea%`=h#o(J]čYDb(gQ5ڒ9xpT(`zTb68 Ј -FP ~zږƞ /*Rw0yu+c[ 8 Ј #~gٖS t%->! zkI> '` bJ#ݟe[sO i|+#"/ek(>FS XFtP%;"q.ucF/oCl h͗ X :֣wD\79Q_+W&!oz]cHZ lS%/JWWEBp(q%t!)x4 m0@N"ȣcML~~m<0mP\G cq4'` k%6IW07/: #r %I XDO!?ke& Q(n}t? Jؘ@yJ?T) T/@{+́BMJ<#7|sۯ<)A4 ':MZK*07˦J xǎǐv)o{dC)&*h AŰ8p# ڛHܠ-%\!W)znF;XBMCCC۷oO^]]=uaǞyf_ne=d\Q @Ű89HD/k,DO%\#W)znF;X@pssscccQcccGy]tQOOυ^s'N\B;:/c'd\!ņ%j A N rfE;ŴeK 8Z vΎ.M r@1@ڢf 8Zy| [R=.ux&I9yi7@@ty`,B;:ߥu+)lGQI9Ҹ@@tɻYVWy#L $K]+)lwOH)wIѥ`0{ѱ;} G>zXI%mRY"vh@pJv\=R+##nҀN;"QV(8u3',"_RAw\|mo+[XXibj= ^eI|XN" J w Tk;t)WJQ1(Ǘ4,Oq`VRP(C%<ŗ4y7jݾ^7,$:}f(C %{}T,N>:y`=/i2`,$:~:j}P|8A$Mb82 n q0%SO4^h8VVKwA/// m߾==cxxxuu3]wu|{{ג{y{WG&;. >۫qK&SOw4i VfK>Pa(ʱ#Goþo_uU6lذaÖ-[xKFGewhqERx%A L63Kz/f XYlKa!_ƀ)"O)}qq7Оw4 &+u,B5: b_xJD3\&$3i01K.'` SxJJ/sBL6.\&gTBy;,@5:yJgO)BHp Lƍ4AXLt8 PNb ~S3  ݹlΙ2U'\K!^qgUbM@߈O 8gAKs XUtBM@Ù?sIxj#a NЯ>1Fطo_Eߛ˦ 8p(8=0g6(]s>E: P.y) dCg"Fjnջ4&;N.)Sռ@`Iԙt(ҫ{iL,vXa}& ?R8X(L]Eh``K`b: \f=e]]]esXAGZƺ@o߾z^&Jd#8M,ɖb;K)^W`8t[ 2t%c>]e$S|Jq*2.Yܫ#KgX ԐtpQyu`kW@VwO;*E'E튾L,lDDQ=sPY|m/eTCxQ'Gh> $:^6sPY|8hF4hxQPrA4 '`Q Z }]UF3O7ZMA%E^Hڞ3Kc1ؐ,0:FxQMVDջ E@\#/ ()ːǔ XatTc$}.OQn@C z ]4Ȩ;/C^Lù Xat4t/3>zt̻D(*`<32FM>`DFHZ-#O h SB%&]*$U`pA"q۫"T}S@@)h$p3.P]b"s0X8Јi{Uϕ^^c;AJUy}(:yZNP%\]b'$NhSenUQcu.UfV 7v]'ulWҸuE&Fh4Ǐ=Zڔ"zKhD'n[ߪ(t}=qQ3ȻjǢ@D]v'N}ꩧ~S,}֗Xuio?Ou} fU*M###OfggGGGewݭ[|S#T"v(.F8h> f~W:ztbA;22r|S#T"B#N;(ERSa|,A`%\כff>wޛo)sAtЎPB#G]HJj$ m$J%[nk_UЊ/>O~#)41Eec nFrsjj**ͅ .A?~~W%"`MϣwBX;.1+O},!\7S% 4mš"U SϣzB@䍠Vv3K /7CM;v?sN?i6{_^tRB+3Eht3K\zk&wD%iDMCCC۷oO^]]=uv뮻N*PY ij-=K%Z@!X|tҨf/g&w. i :㹹(ʱ#G?l˖-.a):YyzОBh%~i[@ؙIk%D5dFkI(i1cVU)"fW,# IDATq1 #(,FtҲʡ)`h{V@e{c+zŻg 6Q጗D؈}w@$FAeyu1 6Qہ4'`6c!P+Ix%d鬅v{4Xlsl;E؈  6Vx-=]8n!ԍU\c1( e}K!7zbPgz້L a1${ BIYXcE$q34b,6b -Dư#2=YXlE> XDE R3@j2Ć?SMbHSM=r*s@騍l8 Hz0Bu ,6"B3ڶDN+[ez4.7!%1N"齿· ȼ_l(3E/)6 H-[Di4t1N"὿· 5 a~e"VAg,.h(prmb^ާH\zJV?7Ǚ. ED]AEp9a^AG ƥX++[C)XTOÈqt@g儛ܼ\ޗuSl'II*qE '`q~KˆC ɱd.=%QeijB4K X8:Ļ> ٍ*KPV;/'`>P;#g^&WAFNKP16З1'yj8,$: [IȫK.^ oab2A6Fikh8,B;:z [IΫ3I邳Hh^BiJ7uL ἒ@"L8pja! FRvAdY⼒ Ǐ]S *(3pz ӌu@ aBK XvtFN%|6#"A+k)XkZww.&vD '`A9 zS`(F=Q __zW # x L}$&`C)3Z֙(fd)MWpV X8 6PcFe]l3X%*feEe:.Cm M%Ju˖(:Y/aeEDNjt\񹗶҄&%;HXi|Fe%*ce'`)7P Y|S&IQ.zN҄gff&&&LLLڵˇ?qȏm̙bMR="7ITCM% BI&j4&'_'>#h\$:csX|&$HJS5PQڀ(4&' _ |kfݺu|;'|R*!qؙb!ףt@n / ȓډ3i46y%!& +p'q\כffSލ7޽رcǎ6nUdC&hNb:M*p]pf$҄ee~o0E={w}Ї^%*ajj*+*"Aú TPS m3~i2sڎKMZ<~xcǎh{ᘛ}ʪ4؞ I#%TTҠY&,&`MX^{ XbzX_Fc{2.{Łՠ=ErjޱcG1;w~޻woݻwl{X]_౜ S`+_ClOX lf_=iPӃ8WWWO]>{Ǐٳgƍj{^_*AxJUl'H\D= " r8K;r.?׿YgۻuG}T:)u.R$CB#Y>@KK]"NEu{-/zxJH.CjV)u6V9%,^tz=Dl]f { xĆxE7 QR?ĚK"͜q`/:Y-󳫁e, A{ +񾔝M/J@Cbp=hw3s]b i"NE'KR`&N46d)EɒQ ڭ\%Hv~ #M X@Yth=%ЎkMĆ( +.XVƼd. 7&,0:6<`IlL҆<ņh&:zg,6LF ,uK @&+b!뒠.q\iHcoF?z59d.A 0%ft&+,롧.gm0$MXYY^ZZZZZ޼yZikNhPp6@G0Y5!HK ZM, ڨRk7LLLd?صkWikS}(=& RK^E53at1sjI }iA7 xdddvv6hik0ϻ ײDQ6򾄋kV! Etuu1&A7 qq1`ikh``{ppo.|PkYKRb Vg Hij&zl64͞p ~7^|;Sg~a@[Aq۷,w41 "_+ޥ]7½|DDQ455_[nvjA:NlT-}3Ў,dà,aB"˓ [#GHp7q=yFGpZҌlm_BŊ|D뙘d&hVT*/p7q=yFq&?ز]v E.vAر#Ν;%- 7y~CrK{9p7 dZ%!4qyǺBb2 MCCC۷oO^]]=uy&g@57p;l{[{]Wh1фD&8ƒ(ƔJ&I9 g"|.n e$<.Y` EBiLRL_.1B9sMb]-d0P. ,\ʾ}(O6zMtޡ0G-y|1.fj5Kp.<%l^7I@%#!RG]b:i"N~O6z $A8:{(s_KG~V|,=6p1$wOiI6Y7q\]hOwQ@24)LHV-]]]iQƝ3"viV4!,Fh%ċ.)z|^N|N TNN𵏿ѻދ%,@2:$D J Q<GHTz7:A/4mq JMQ2_u"b={aTdFY((np!JM*fp."@#<.Pmq W Q4Lm8IW VT5*A{#Q'ڈ$2ը0t}t5 ^`uOX`ޞٜ:F8QE5jФίq!&_ .!4@ ᨁ֏8 %BqB $Ƕ4TR քJE؋<g;#dqݶ4fS'5z>'`loUc]n\-)xQo:@f؞.h+A;&ͥ8x7x\*{t$^X{)E<&_ x7?'Zś< VUy࢚Dc#o|LK'/uBQUշALc"Nx06{h4P~o IDATV>y:lU5(fu$4&, s >I0JR$)4uT *yLc"N"˻ k%1JR|@u]F%iL XvP7 0Lp_!V$/ HJ)N"&`s;r XITSY J=^ysTsʈܸ"'`Vpj8^$\i@t^W dU?*Qw93xh4G-[n%-z׻|PVp4wVJHDI+MzZx[AA7U*XcgWVV7o޼V+~~߾ꫳ77mb/:SK`jRNԠ.]>ۀХ!,X&,Zh~211k._bÆ mf/: OS6Y[dM^Kaۛ[Bkd, 4f?7nl5{ij$iV5v (J`(%\]Ύ!K[EdsIZYh_\\~0887y'/~m\vwJ|7hZ]B%)/y4$8Bjg-D XUtx/Y5 FO. .ˣUj5bY=|Z,EDM-EclC1Wyi,E. .qwC,v<]#@͂`upA7鸕L]]]K"(p@$lR5_&Y >>y@DQԙVcdVcoAwuuIV枤WNjpau^Ap #XN/i8{N;L2ǔ K $'u^{J `_t:^Fj`V`I¼ 4F:1nO[ b :-K4is=X;:ϽJ~5O{ N bǚBM###OfggGGGeZOO7сr3m[ a~ÌZmP/(7SE!q(߿daaappP>_~7ˢ& Ail/: phh:P-͔FAD&zl64My2W)$@s#͍sK@Gi(ĉQ 1M^~K.JW)N@';0%jJ!! XYǒ>T0cǎcH;w,+r%ۿU x ^kDdT+IAVSD CUB}KV&塡۷q |˾oi\Ft}^ EtUDTJRv' . P`E Z-t+klijhxnnnll,9rllȑ#o|+4^{%ȣR5F4A:%E(X%+IFIWK‚/-nV+#u.h7G'_rxߙbJ,Y ıˆ:~@Y;oSО6Ćݭ T؂:&@ y@ և萛vw ;ذû64u!/­b;*[EG ]Fwڜ) +1X!*hKC,ܪ(xѱ  X@-a!)uY ۰KіƊ1gaIse,"le89@%`w0IȺx;%+bu`},E#jBY##N WXdCIB~߁z-_1>X4"\52, T7C6$" 6m;>@SZM)kd X@ |-2IAF]~b]X`-j5'`Itp*,g`%2@ƥ#L.;n4P/SjK.heTXn<Jd@ƥ;Aq3@/w@aGQv)8V]sޙ^Mx,q #Ui8>ST]st EBgb)'ܪp6:wE9*A[IBUޥyp.Y6WEpU X]N"FPk%)ac,A-Ep'ܪDLO0(R}jA hs( 'yVˉ4E1n>yP &`c4>,mtpwW!ԡ2 {|?()z>"{ 5,B&:ȋKb u'dC1qU\ iEI5.'h[x,B;:&v0ܲEX-4<ȆbR!J,Jި3c)F˖~7aeeexxxzzziiiiiizzzkkke߿袋~)5qh तU@A>5H'@c)F˖~7afffbb"Į]C?<:AlƒYTsRRGF$JVIPyily)eK0222;;dvvvtt?TLB"|V sRRGF@{ȧUX(&"/ MOC?XT}.O(+ 4<6"= QbZ%,Xǻq ^7'f?T%LB"AL" 4Q.h*E)` R*=]"N/255U^Ee$ )JDKE2XM,A SSSQ FU9MRn^^^ھ}{z˗aJp˕`sKk%-ؾq]Tf ҶL[(Xrؑ#GvaQm/DeWJǚ a]dҐ|Cgeq}+<~}2} }'P ,%:Bm(UN &7ߥ|!P> v3N"Z8PUpe&sdLׅ_q{U=S#tMIb$)L Am$,, ⷪG`}] yhxu@{0]^^j5b78 Њb>>MS {] WsKA;I^~GIZg'7g9y6x=wFPTB[W*8= PWsYFX'@Mn*)y#H]PxDt8+ 7,5!Id3d'`CTSZ@;uy/jEsf;Ҩ+Mzzޢ K nե!!`8 *G ;l*)H]-U|D F@Y6$Q/SRD؋N\>J~^B:3`n!_œ=.qk-y]x=46 VɥP.ޝ,8pKB G8QcnBF*q CѾcÉM&hxo6r] FQ7r[|l: gB0Abˆ:PgIB2 MN" Sms$11)dun(,n$|tpm(`/~?71)dudĎEG.hS!6+D# ڝYy62#dQ$4&qPVP@FbXC8Q:ڒ!"91 f W{-߻4bCXϼǿy6rͻXAC+8 PR`(KK@tq}%[PAD"91WB^Z# "eURɀPq9X@f8 Hche'`J/q }߿|ipYbҽFCu\n}8PNU/ݧ 4eb%JTDq9X,uUtI8PN?JcJq _nq9X,uKrۈ?'` ׿,kw[B+ +AX$o8'F WA8i -I XatQʀz-ȓK3-^2F|I'`T6gQ6JQ|7q.\Bs,ʹBY°c=$ '`T3&1ث y݅K {QXЎBw3KpA=CLSSS$כ$!W߰a _VwِFVEᲄBN>h4ѣGeUt + $ü6nm7RV%6~8".K_#/ Z饥͛7T3tN07I"L8|-˞7j V|hܯuxgff&&&LLLڵ?$BۆboZ)Zmrr75J_K0"eo%nls'ilQ)-h_ eXGFFfggΎj[dҶF=xD˞% Hl5ߌx!pTPƋY8P_\\~088$nyjaxy#F"e/ŪER曑v$eXSכffw~SIls/U Whg=g1Ķ k~Ř02Kp yL00 X,u:kii)ɫzg6˜099YRm@Yip2 ?s7a1x_Db`iAɸ,<3 '}s[0 _|=鉉 -bWVV.[o3LE{={{M 0 .@ơC . ~ӟzuIDATM7tgq7tӋ/Jcy 6diÇ3ϼꪫ~aF'?[zzzwWfY\\ܼy3Yˁ“'Ou]_|駟<*52ZӃ'Ns=aÆ3?????_{zٶm[~#~<~?p]w}K_'F_e]#g?驩)q_Wͤ-բprrw޽{nj#y'/rw/wϟ筶P'>O}ѣ?322r72,Ӧ-333311dbbb׮]a5ƙJ-p?{97oh1ņ ,z-ܱcǶmbWr6ҽ(СCǝm'N}ꩧ4w(he?k4kfϞ=O{^$!#'`w(i7ƙkmmMj:??qF :F } /pyy9v%j#'`~xGm~[nӮS(/5/A֭;~xcǎ}>98߿daaapp08>p=_~v F7y'/~Z-|/[Q tww|?ϡZx<\sͺuw^{O>6NN/}K[l9|O,N {{{7nܸ{cǎ;v۸qC-Tmd{75w(ɓccc266ӄȫz޽Ovճpnz-\\\k:di+rw_򗭵.[_}ٚ3p~#ЮS(^ ~C׼za[Yk)Z衇z?T#ji0СCwvBG~-J-/Kؾ8ux>W_ٴߡM6=cO{챡!{KP ?>22~u}x4-#7ǐ.{.?Eqc Qm~333^{0^qǎЮS(MZuac!)/ݞj϶ٴߡ—_~+~rWEz?:thuu_'<̭[n{Oǿof?7y 7pc QjcooGGGw??/B :R u4N#|>`]Pj7 +b( o,7w(駳pu]gaz-뮻.}{Zr=yw 8?=3fmvn #7Xh4ccc-۠ӢH{lP߸qcwwn'? T 8yo1 瞻m۶^xq׿8묳z{{nl_[lm J-}UWmذaÆ [lyy_tE===^xΝ;O8ᦑ3Zٯ3 0 c3 0Lpfapfapfapfapfapfapfapfapfapfapfa? <@DIENDB`gsl-2.6/doc/images/rand-bernoulli.png0000644016036000116100000001520313373111455014527 00000000000000PNG  IHDRKbKGD8IDATx{lsrnTI:`إtҹȬFp*$8*J-Kt4NYlcqq^2u@šTX?5~U_ )OnO1NH @ 0` @ @ 0` @ @ e[ԩS߾};'zѣ,ꍃnv(s[r L&Ɓ/_>qUV749L&Ͷ|h%&j~aHC@'б8p`۶m .9r#.+&Luٳgqߚ?n:toru8nܸ={,\5kVӇ,Yr׎?~Æ ׯGtv*gnvk_۲es=WWW7y I#-{s۷ooQOs'[omye{nwヨ6mڈ#?7qV8W+3'~z}}iǂc0t--{ソ/뮻>+TTT4 /m~'kmy7bŊ/G+**/_~6IG}t_>l>}s6hN4@ijEK,ꪫ֭[dvhNq^^AwN:tQu}]6h޽皞j0ܹsjiOP37[nYv/3<3??>޽{ !VA}oVovUrS}T&շ­[u֓O>^z}-?~#*%q&O>39L&_= ԪUN9唦/s{.))7o^+KJJ>3?|-ӭ[wy|th7~t8?&Lp77].ݻwmɒ%sO˟T~򓟔K.d2 ,O7}t„ Ǐᇛ!Ϙ1|]m4|[nԩSMM͆ ѡ hAߕ{2d̙3[W_>|xϞ=w~/\s?v޽{smyiӦ?//_ɓۗ9ڧsm۶]}}իѣwǂc s@ @ 0` @ @ 0`#^bŸqzfgHGշoߗ_~9zhlccc GS6k_9)GVpl` 1|nK3֭[%q\;tTa9@` 0`pBGG@qr$Z 4` @ 6nXYYYPPPPPPYYiӦC2K.9m`Ν; VRRRWWWWWWRRRVV{WWW{ks_z˗/G\s5?~|{Ϝ94#],޽??|իW;7o^UUU+UUUsm>S9\T 01l̘1 ׿K/-++[nݧիW2hР5kִsLr7cB6o+~oYSS||z?t]tٵkW^^^=zݻjժ.lݺu'#T1-h\}pwN:nܸ6wҤI'ǤI>KV1!ٳ[nWSPP;),,\reaaawysٲea>;묳x>}+`/|ï n3pږwrq|+"*8=o~ݶlA7?gܤ0p;~39^6mL&3{綾^Tpuycǎd2ӧO_dɃ>|OΙ3g9<+`coگ|+v,Xpg|{ٳŋ.]ZTTTTTlٲESNj9m!,v p|L` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ =quԩ1z M $۷o_ΝHl6{ $ۿΝ%@}pM2HR%@2[А*YCH~0ǐ%@2[А*9` 0JdaAHJd!U $s R%@2+`H‚T 0!,HlACHJdV*9` CX*قT 0!,Hɬ!U $`HlACHf ` 0JdV* 0Jd!U $T 0̋1@Hf R%@2` !U $ ` 0JdNACHJd!U $s R%@2+`H‚T 0!,HlACHJdV*9` CX*قT 0!,Hɬ!U $`HU+]O<ŋWXuL&ӷoߒaÆ?ӧO  : x]w]~o|߲e˖-[ϟE=c3f͛s\XC޽{K/MO?x{Is!Xկ~u֬Y"WCGlٲC7 >|ٲe#GLc, 0R/0d238g=ӣH+f<@= Ё8j=&Mz8gΜ)S3!؂T?UUUuuuW^z饛o駟Ns0 cTC{uvd2k׮+̙3`T'۸qceeeAAAAAAeeMs':M n=z-[.xKu;w6l݇xp< j믢XZZ:hР':S&y衇 2q޽{{ĉ1cFڏ 4s RNW կ-Zx{L܏!A&wOϳ^AY0r'r)W_}ڵkӛ aA6HoWz8餓u'|rǎK.---袋7‚Tuн.]ڵ+//JCCC=ۖOΝ3f&M}׿/|Ȑ!zcԴRSSSQQO={矟\p>=ܫf2}6Z+NJi;v3fرLf z^:ni6l0a„-++2eJQQQG[,^{}o^XX8lذ'uYG ߶m[ x p [}`d|ͪ~ׯjݺuiLtaAZU.~/xg :t0!,H[+K/.馛Z^:u3|o=|k׮׻w~: / ik=#F={Ag͚UYYH@< 6uG۷oꪫo?cڌ3a> ‚TݖͱgL= ˗/-[=KCV6"x9`H &@[А6XCH m $b 6؂ 0!,H !m $p &@ m $ i` CX6XCHMaAH` &@ m $ 0!,H lACH4M 04MV60M!m $ 0 &@+`H &@[А6XCHՐ m $b 6؂ 0!,H !m $p &@ m $ i` CX6XCHMaAH` &@ m $ 0!,H ‚ 04MaAH` i` CH` ۺuk&fу@l6+lccc N6L&"؂ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ 0` @ @ H7nXYYYPPPPPPYYiӦpr!;w6lXIII]]]]]]IIIYYݻC666FYUWW/_Gmr5 }HӁ 8啕+W0 j0HyyyMMM+555Qt ;v(..3fرc3y CX9 gϞ/^tiQQQQQѲe-ZAoK X@ 0` @ @ 0` @ #F 8W^yO~\sB@SOp gϾ g\#@ӦM{g$@kҥ?|~~~,3H6rSN9%zYa}]6zYVfzjرO<\= +` YyyYF9gΜY 9СC,X0|͛7r-@N lA@ 0`E<IENDB`gsl-2.6/doc/images/rand-beta.png0000644016036000116100000005224513373111455013456 00000000000000PNG  IHDRKbKGD IDATxw\6"MYX (WE eY ]*vT7\T\łA"EE!UPBEId|&$3\' 2@dHF(`P@  @ 0(`P@  @ 0(`P@hf222:t8vq:vhmmq/_{'} }o Zfx{{9rӳ~xx]ZZjbb,NY[\.t d6ч PRR҂׶۷ok# 01LYYYftt!CO8L2ə/VUUYfMeee;p˗=(--]frvoܸ L&b-Ycǎ }$%%;88ٽ`?:ϓ'O~嗥K~Ç/={O`Xǎ۳gC&.BY۷ٳgڵc_ uuutgXJJJӶm[~&`0|}}4S[7n={v#GߚmN$ `V}o9::*))92""[ x=RPP0sL uus疖6R۲o1cdeeM؜ h 6lذf*,")))#)..YpAyV!3̲cdž)** 1H-hR[ kzkOAP (%KőNhPZw>>>PYYl$8Xn}~bbbڵkgnnȓޑ(v,(`ZkHHHvvivDq urrb '33ؘT$Zz;CW^M2Gc8L tDr̼'NXqLA =zD:\xΚ5k*++zΝ;N,gdd4 jjj8::&'' X#J .M0AlGާOt;;ߋ􈒢vƍ۶mJy3I4 4(==x|رcVVV d_OZZZ``(A\D&"0%4Op8L q^z))) ʶlW999#Fl9 #==#iii;wI5WFۤh;L{L''s{o޼ٺuJeeR &gff7nvvv}ڭ[7ffNgee9::ݻֶ#feeRtzрmr^`988l۶]TosԨQ"="4B  ===srrvGAnݺc _?p {Dh>[;yi ¥K޺u~~~MnpҸH]]ʖ-[v媪*++;wO̍D,gϞSCl?55ߟt޺u_OC )gbbrIA(jJJJ;wli(`G>~8hР:4L\ ZT\nYY V<==l_>pݻI)..$͜4u9 m_~ kzX42T_ll:[ `0+V \5{:<|P Ǣ7C444pdd$Ϟ={:v*c%''R}`0222...h_ŋY;?v؁|fEE… 555UTTQdr6lYvvvTTԧO6n(X,֜9sTUU|{>}X,ϟI=Ue筽}GJJJЈA6yw~K.ׯGL '---00P#ݡ5֭[Ξ=+ qٳ'11t >>>FFFL&SCCӧO6W^MNN^n]38szżux{{ik֬mHIH[3Bo޼ٺuJee@޽۳gO#Y,"VSSӲgӓ۷?gAnݺ6-6gB8==][[޷x/l3tuunjii tDIgϦRȨ7 L7x#3AAA6G%%ŋՠp-ZD:МgNNN^^ޮ]>~(CԾ~?777776lAFMMښt0tPi F߾}{ꕒRozu9zhBBB޽uuuCCC-ԧz_$f ]Ptv(jZ C}9X,֜9sTUUERzv@ݳ>x ͙Y~=@ou҅LA|tw$]ee;>b l/ۜNOO?nee\zuQQQSSۛ7[,00P7onjhhRYY?\)`b ݞ={6'aQȋ/RSSI|qQo9٨`7++KKKK#kkk{-9RVVF0@ˠ')@.Q-;bPPPQF toM֋ܹs<-F۩ϊ9s&ܵkL``ӧO/^()2LWWWsss- .\e˖_AmmmɦM&M$C` n F߾}{ꕒRoLOg 544>ѣ { oewQ---ѵHv(7ePjj*iҥKQpD]yyyF,Pɓ'MLLHmۊ(`a\UU CY(`$,h=@+(v aHx666:t $ mJ @?` v={N!u֭)S@[/_y7oHܽ{tzr˗/߼y,AۅRɹsv31_ N󍌌|\HpUUUuu5n@8 Zbl۶̙3Sa,dl6[NF ́ ,,keeeH D,JJJ۷oo۶- *--o߾UUU N*7nȑ#WZE6N)rʕ?.[tJ?y]GGM6]t5jԥKH7oN IX,ʕ+Ig!ҥKMLLn߾]VVf͚͛7{yyZt IflmmI-.4e/04ʒN T,☘gg~tIJJp8SUPL&TWWVUU&Hh|||HVs\.e˖&_l … SUPL(77ϟ?8 @p8j y$AN!|T@=#FHLL$D[=222"B޼ycooO::tHFFؘt<1c<<<,,,ڷowΝ;vѱe;tqqqvH߻wO>4@tmBڿtttqqիR.ggg}}uK XPpv驨H:KPx8qB^^~Μ9@cD&r)4ZEEt ֠$4~P$qݻwWTT&d*((@p<](05?~ڵVVV4 րΜ9annN:y(`JyUXXz#G˓B >|A)DkŊ...vkTpBɺ .E)00N’l6t 90ݻäSvVBkjjpr u` X`Z@)X:x4P]]M:u)jԩ/_$jkkmll?~L:Eɑ ڵ+-geee\vGhP5`RSS ===YZk 18ׯ_/+R(`J+//wuu$@0 ,Xx1FyZLAGDD1LA>,005`ZAK?:tt dPUUUPP  XLZ^>k@]޽355'D%۷o?N:p8555Ig$(` ;)Ν;wA$ mJ Ϟ=&E$p!Āywޤ X`/:@g8 ;uԋ/H0#`h,22208(`hѢ)@Z]~t :Bs\&I:H WW:ݻt1]ȉb Nh_K.ǿ|t:0QzF|%%%jjjSm}eРAfff΂& 6t%KHUmR8RPP H 0A555#@PtSXXhff8Jtaat5`Is` Zᐎ庸$&&B[(`铵5eٓnddD:mvS #++K.SILL,a Z -PQQ1}t___He˖Bs(`KLL2e  1-ZD:vk|ÇzzzH|X`(`h=@+(`)K777)Ta߿744$%;;bBE!C@=.\ Dꠀ5kH:(`i_~t /**ɓ22qB)ր`౲ڴi ԅ  $6-''G:$,>/A(`ŋ9sN Y;w.222666//`tECCC\9)`z"LAe]t  >{l.]ݿ|"X rrrh_"~XJJJ::: >֭[+We{SH#`gg/^} /E ...Sv@p`{۷MMMIg$P|,cHvrr\WQQ1 o\gGRJӿ3g 733t%-5t %K:tt YŹwyϞ= ݻs8p 22wɓ[CLAXFFFI—411y왍m~ݻ'e0_~ >~p̈́.Ed2۵kd2cժUw6lm&@IGfp\\СC޽5nܸtعsg^!@ FHXvmPPСCƏ`0"""ƌ3s̍7(֭[Esh 6mڐ@OM?~k_QF=<55UD IDAT 믽{hL#@K_S@.Ol߾sD(77>t萕Usl(I  @:4Z7nݻZ+| IX t} f̘1[l!&| iܹbܹŠ!RPPx9@"xzz*((Maᅢ %G^^ömlmmC"EEEY rypP"SSS:n8kkCy󦴴0aNrppXnرc7>`bHfibjׯAAAQQQqqq_~e0:t0551c'g҅庺_thG ,ݻk.]Ξ=Ǐ+++'e ` ZpsnGC@\6(dÚ5kHGΝGA:Ġ<-p-h$x Dsݏ BfG:p_~JSSt2b O>ٓt :Xn݃tM$5ѵ(v R NxǏѾDa"FTPXX&'y-"//o``@:T#y! ŋϤ X`(`*%1$Hh_A8ĐN@!(`>DGGN@il6 gR X »eHg5`:?߽{7|A@|P VUUU .,..&B|}}]vueeeY@|p+cǪ@III駟HgB)ր@R])eBCS_uu ApАω'H D\QQW*Pz:c'@󣢢HJ@y_|  @䊋ݻG:Pmi1 R^^`bbG: kCuX;vd0H?S=zѣGѾGa"Fӧ}m۶- [ ۷6ЩS|痕1 555UUU'.ѵ nԕסC)b%;;;??$//0//]vjjj򕕕MdjjjK\RRRRRd2yM,++־}{MM͟~IUUsݺu}K?0#`IK//7nB@yyϟ?~̼ZMMͮ]vEKKKUUWڵԩS۶mՅ&??ׯEEE_~-,,,---))رcݻw޵kW]]]]]=zt k 0-00 l99O~:555===---=====G=zٳg׮]{ѹs;R9cHOO/_?###mmm2---USS#,00PзoRRR޼yVZZڻwo}}}^?uؑtR!|=߼yW===>}o4;9ÇIg!@ L'rpp!D0\.qqq)))߾}0`׫W/==nݺuؤwޥz*...//w755555߿ [|'OܹC h>Ptrّ#Gv҅t=y$..Wڵ311ՉqϞ=n4%%%..LIIٳɐ!C̔IglŠ+߿.5x ,00Gyy/=z'O(**ZXX'FMMMJJ _zէO sssKKKmmmKKKswwrJIgA LWeee/ӑѣ蘘[XXXXXtڕl6|ӧOyow8U~pciPݻs>x@;w"##cbb ,,,ڴi#<DGG?x ##Ԕgru+$c߻w/<<޽{?9rM޽K)EEEydȐ!&M¼%TTTܹs'444,,M6'N矇 ⊊I&yxx T rׯ_?~ҤIG`WJzڵk/_ə4iĉ:d„ zzzǎ״ X6iii999'O4iȑ#qJOOKII0aӨQ}(((ptt|+.}A >|Acc˗3dC ,q|}}o޼9k֬K@={/_>k,\F` h円N4]~?צM9s_zU[[;??t.  ֞;wnϟzjuuu}"=HJ1YYYzZ|yFF *++>lhhxС[ƺc***'OÁ@"ڵk޼y,^z=z411QVVv{؎*--ݱcnhhh```LLرcI+"jjj-Zt̙Ǐ]tٵkWZZΈ#M 1gP &%%%[lOHH}ׇ F6Rbb{fR&Oynݺо}׿jԩǏǵۤ mOYQRR~z6K\Rɓ[n5662dD_8 $ok``@ʶoAA&̌:`0ڴihѢwލ? ai@?2ބ۷oykhhH:Tcvqy)@ڵi~ԩSǍKҡ@Th;O)hR>uV;; 6Pw8C'NزeŦMH'R P[[{)CCÈ3gHJ2[@GC vwwiBᡮ˥J.{ʕ]vCܴiӞ={F:GjjGHi!%%իWvdŊmPgϞݡC177ߴiӮ]---I'j#G }2..t"*`nCH"iii񞞞IuSSQQٸq T7` ;vٲeŤQ)SXȑ#Νҥ D)**CL&sܹɕ}=wD`PcHB!5ٿM.]f҉@\~=ڷjjj<==H!܃OX_xamm=x;vԐN$PҨs{TT!D4!##3d|dK &Ol2ACNN?xittǏI'R(`sMccd777+D\pEFF80 t ]~iӖ.]ZZZJ:AKYf-]ĉvssikCaAMnnĉ}}}¼pIg ={vtt4Tqƍ~q89!C|RGGg/_&h;O+S!!! PUVV袢"OOG}|8}tqr 6++H&&&^M6Dbeu),,lĈ $PԒ4x` GH\\ܒ%KZOO˧Nԩ@}^^^gip^pLIIXgΜYbݻgϞM: H .K|-eff:;;khh:uJCCt$,cXwdd$o_.FjF]v244433{)8T&Ϟ=bL&ͭsmEEţGOB7qC (`nܸaii믿9sm۶d>ܚ:uJ'>zgϮ 001ʕ+/&ӧwmCBB?\pѣB RNOOѣG$yg*5O*))5kVqqqpppHowmll: X`b._~˗/W\qHILL466@:iӦK.faLiyyyvvvL&3"" br###oܸA*@mmoH)o8qbϟ'E8PիC+w,T YYٻwoߞYPPG* HGGLj?WB۷yW\ZQQÇ9D:NR_~O<9sfUU85;z$@ǝjhhh``@:ﴛ̫W&X ϻv>ĉ`0rss%}hx9 ÇtX`ׯ_)W t?Zy+ꨭ'v"+bL߾}3fLyyydd$ĉ666fffyyyC !H8jkkKw@ҥK80nܸk׮"09$IFFرcG{nX+//˗/wttlӦ 8BӦMiӦ7o޼yҥ'O43iҤ]N4);;{…S͕8n8OO+VqRO7oOLKOOwtttvvgR0Mؽ{F}v/Ͽ~J:1L&߾ ͛="hCOOɓ'QQQKMM 8͂p.]o9sfB!H./*))y򤴴t〘ǯ\ݻ,INNͼE&րEܹs , EJaÆihhxxx{Ȉt"m btEEǗ ##cǎܾ}o߾ITrcbb B: WRR¿hCX,B{-JNNyf{޽zzzbKV\\ѩS'ҡ@bVTTtؑyf}}3fMrW\֡CFX?2// .׽#jkkMMMMLLLMM'++K:H\ &;l*"oo7(`GrWX}~:))iĈt),,WUUm3ҒYPPPV )|}}l(N?{,22+Yo߮ݹsg蒒҉@hhhۗ`\~}ͩS&''7>|bĚZdŊuCF555g.(( 7TSUUÇnݺ 0'3Lmmmzȑ#ݻwdS˗/~NNZYYy />}Z[[]v'Nܿw|.$Epp0} FYYY6mx_s8KKK6Oĝ׌3=:nܸy ~޽ݻwogaXSLQSS;s .6޽szzǏ.\rss{[ p8 &&&C&%%6Y,֮]pq"g͚ukkkښ~ӧOvvvsyy 455оUUUihh8pֱcG]]]/H~2 ~2v7322LMM%%%AAA)ϟ??}tPP;s̺̜9s߾}-!VZZ:bĈyֶ6n[SSM6:::+Vs0:''gÆ ׯ_7~z9&p8 I'<С͛7y+Jȑ#>fkk2R+++wwwo]_~l[VVV{RPPϿ499977W1i555O>m߾ŋ!C7߽{XbJ'Otؑ+`wիW 0dZYYȑ#4>s%%%l6m۶NNN?-11q„ %%%߾}SWWrO+..RSSt`ooLII ܶmo޽{[n m&$$\xqӦMϟ??|ŅYTT˗~6y'l!ӧ'N|0k֬R]]| ˫.??ʧVYt!LIFA$2i BvQ7QPH$%]EP Y7&EO&)+(-hr<s盜LKKKOOj%+[xׯf͛7ȑ#'OZ699y* Œ.<+*FcaaxaaaIIϟ?EץLvQQׯ_;;;]fZoܸh∠ Q a._|%INTMM={&ol6CGf+WDգlɓ't:CWPKQ&"="BGoٲ #4H]QWݵ#]]]Qf)6NNNO#BXZ`333 4A|hpÆ III7n4cccq+TŢ]X'N,AJzk֬ tGT=l{:rԩ*Q k8333˗.+33Stip Nkmm~ҥK/x\jtἼ@ S.@`@nwIIɷon*@`@?^\\<===22rUj3`@uzzz޽{WQQQWW7<<#"@ Ǐgggk4Ѳ ѥ0.l6WCY,U*0p 0@  0 Uh>IENDB`gsl-2.6/doc/images/rand-binomial.png0000644016036000116100000002725013373111455014333 00000000000000PNG  IHDRKbKGD IDATx}\eaAnT=BArA[@KbY캩mniGM܇XZ-,äoȻRrq`\󝙏\\k-x` @` @` @` @` @`=z :tɓ7nh6x>o 6mڊ+.\P}*y5_[\r#oޫ(%%h4Ɣ{>`kkE"##_b=QQQO=TGG3t/>䓡#G|q<̚5k;vlHHȠAf̘glڞzh+ϭ?Fczzzyy?{Ugq\.=DpoMgg?O8?:nѢE/S?QFm۶O>$22wީ|爈O?zߟg[lihh8uTJJիm޼kW_^R\\͛Ν;C ݏqϱUQQ1zhcxgy믿6LEEE{t/((zjt<Ⱥujjjjjj֭[}̙z}U{^FqF6!!39{4iR׳fڰayyy>|X,6#;NCCèQz>x[[[pp1MӞGӭYa:M+V7o^U=D/#?[n??t֖KCCCDDD7tmo޷zիW=c[[ۊ+nw~~~vϱjii ;fĉ .p+Ν;/ӧ CUpj?GΙ3ٳtq0`û]z500z uVכfSGOO?]YY/|FobxEEſ:usWF2k֬LIY&`08|3AAA֛>lz3\|U{^&,~/^>n7ۊ~}#RٹsMƍg4u:]{npȑvom6y  vkҥKv2osιRvj??|ذan%99v/Krr'e[l)--]nݯ~+&%%-Zh߾}۷o 2Ln=KAAݷӧOoOloݼy?^Ux}PoM}}}9`#Sگ[WW;DFF0bbΜ9sέ|ի\xGGGCCáC}!Cݏ:u_|1==름]vuttP]syjkkkkk_{SNuݺu1cƔ>}^Xh= ?_577?c!!!w_YYyyycǎ5 Ç_bEׇ]y.^^8 0@  0@  0@  0@ |jgG=zt#G >}{Rpܜ\UUUUU%K7>hnn/+W._5:b]k׮=qomyG'NdW~̙766[xD(;;v$;;Ż ??~ !i'%%َ$&&VTTzǫW̞='K---:>pׯ;^~=cƌ}e`0L#&) ;^| 66vŊlVPP ixH8::,:::R[[;nܸWG?==^/KI'$$ڎǻxC] I8###??v$???33Ż9r[o퇺… 9jժܮ]Yru}յ_xq˖-=/,p\"i;v,.....0~CBB&Lw{/==5:v9&,@ۄ@  0x糲²{8XMwŋ;|.G`䪪䴴bw p޼yC=|pnx8mcHڵkO8o[G}щ'.YgOnǐ@<^