diff --git a/Makefile b/Makefile index 73dc6909..ea34b8ef 100644 --- a/Makefile +++ b/Makefile @@ -5,32 +5,37 @@ # Configuration of make process in ecos.mk include ecos.mk -CFLAGS += -Iinclude -Iexternal/ldl/include -Iexternal/amd/include -Iexternal/SuiteSparse_config +CFLAGS += -Iinclude -Iexternal/ldl/Include -Iexternal/amd/Include -Iexternal/SuiteSparse_config TEST_INCLUDES = -Itest -Itest/generated # Compile all C code, including the C-callable routine .PHONY: all all: libecos.a libecos_bb.a runecos runecosexp +# build Tim Davis' SuiteSparse_config package +$(SuiteSparse_config): + ( cd external/SuiteSparse_config ; $(MAKE) static ) + $(AR) -x external/SuiteSparse_config/libsuitesparseconfig.a + # build Tim Davis' sparse LDL package $(LDL): - ( cd external/ldl ; $(MAKE) ) - $(AR) -x external/ldl/libldl.a + ( cd external/ldl ; $(MAKE) static ) + $(AR) -x external/ldl/Lib/libldl.a # build Tim Davis' AMD package $(AMD): - ( cd external/amd ; $(MAKE) ) - $(AR) -x external/amd/libamd.a + ( cd external/amd ; $(MAKE) static ) + $(AR) -x external/amd/Lib/libamd.a # build ECOS ECOS_OBJS = ecos.o kkt.o cone.o spla.o ctrlc.o timer.o preproc.o splamm.o equil.o expcone.o wright_omega.o -libecos.a: $(ECOS_OBJS) $(LDL) $(AMD) +libecos.a: $(ECOS_OBJS) $(SuiteSparse_config) $(LDL) $(AMD) $(ARCHIVE) $@ $^ - $(RANLIB) $@ # build ECOS branch-and-bound ECOS_BB_OBJS = $(ECOS_OBJS) ecos_bb_preproc.o ecos_bb.o -libecos_bb.a: $(ECOS_BB_OBJS) $(LDL) $(AMD) +libecos_bb.a: $(ECOS_BB_OBJS) $(SuiteSparse_config) $(LDL) $(AMD) $(ARCHIVE) $@ $^ - $(RANLIB) $@ @@ -69,7 +74,7 @@ runecosexp: src/runecos_exp.c libecos.a # Shared library .PHONY: shared shared: $(SHAREDNAME) -$(SHAREDNAME): $(LDL) $(AMD) $(ECOS_OBJS) +$(SHAREDNAME): $(SuiteSparse_config) $(LDL) $(AMD) $(ECOS_OBJS) $(CC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS) # ECOS tester @@ -92,6 +97,7 @@ ecos_bb_test: test/bb_test.c libecos_bb.a # remove object files, but keep the compiled programs and library archives .PHONY: clean clean: + ( cd external/SuiteSparse_config ; $(MAKE) clean ) ( cd external/ldl ; $(MAKE) clean ) ( cd external/amd ; $(MAKE) clean ) - $(RM) $(CLEAN) @@ -99,6 +105,7 @@ clean: # clean, and then remove compiled programs and library archives .PHONY: purge purge: clean + ( cd external/SuiteSparse_config ; $(MAKE) purge ) ( cd external/ldl ; $(MAKE) purge ) ( cd external/amd ; $(MAKE) purge ) - $(RM) libecos.a libecos_bb.a runecos runecosexp diff --git a/ecos.mk b/ecos.mk index a3b82077..8ee95b12 100644 --- a/ecos.mk +++ b/ecos.mk @@ -15,10 +15,12 @@ USE_LONG = 1 CFLAGS += -O2 -Wall -DCTRLC=1 -Wextra -fPIC #-ansi -Werror #-ipo ifdef USE_LONG CFLAGS += -DLDL_LONG -DDLONG +SuiteSparse_config = SuiteSparse_config.o LDL = ldll.o AMD = amd_l*.o amd_global.o else CFLAGS += +SuiteSparse_config = SuiteSparse_config.o LDL = ldl.o AMD = amd_i*.o amd_global.o endif diff --git a/external/SuiteSparse_config/Makefile b/external/SuiteSparse_config/Makefile new file mode 100644 index 00000000..c4fd13c9 --- /dev/null +++ b/external/SuiteSparse_config/Makefile @@ -0,0 +1,70 @@ +#------------------------------------------------------------------------------- +# SuiteSparse_config Makefile +#------------------------------------------------------------------------------- + +SUITESPARSE ?= $(realpath $(CURDIR)/..) +export SUITESPARSE + +# version of SuiteSparse_config is also version of SuiteSparse meta-package +LIBRARY = libsuitesparseconfig +VERSION = 4.5.5 +SO_VERSION = 4 + +default: library + +include SuiteSparse_config.mk + +ccode: all + +all: library + +# compile and install in SuiteSparse/lib +library: $(AR_TARGET) + $(MAKE) install INSTALL=$(SUITESPARSE) + +OBJ = SuiteSparse_config.o + +SuiteSparse_config.o: SuiteSparse_config.c SuiteSparse_config.h + $(CC) $(CF) -c SuiteSparse_config.c + +static: $(AR_TARGET) + +$(AR_TARGET): $(OBJ) + $(ARCHIVE) $(AR_TARGET) SuiteSparse_config.o + $(RANLIB) $(AR_TARGET) + +distclean: purge + +purge: clean + - $(RM) -r $(PURGE) + +clean: + - $(RM) -r $(CLEAN) + +# install SuiteSparse_config +install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET) + +$(INSTALL_LIB)/$(SO_TARGET): $(OBJ) + @mkdir -p $(INSTALL_LIB) + @mkdir -p $(INSTALL_INCLUDE) + @mkdir -p $(INSTALL_DOC) + $(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS) + ( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) ) + ( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) ) + $(CP) SuiteSparse_config.h $(INSTALL_INCLUDE) + $(CP) README.txt $(INSTALL_DOC)/SUITESPARSECONFIG_README.txt + chmod 755 $(INSTALL_LIB)/$(SO_TARGET) + chmod 755 $(INSTALL_LIB)/$(SO_PLAIN) + chmod 644 $(INSTALL_INCLUDE)/SuiteSparse_config.h + chmod 644 $(INSTALL_DOC)/SUITESPARSECONFIG_README.txt + +# uninstall SuiteSparse_config +uninstall: + $(RM) $(INSTALL_LIB)/$(SO_TARGET) + $(RM) $(INSTALL_LIB)/$(SO_PLAIN) + $(RM) $(INSTALL_LIB)/$(SO_MAIN) + $(RM) $(INSTALL_INCLUDE)/SuiteSparse_config.h + $(RM) $(INSTALL_DOC)/SUITESPARSECONFIG_README.txt + ( cd xerbla ; $(MAKE) uninstall ) + + diff --git a/external/SuiteSparse_config/README.txt b/external/SuiteSparse_config/README.txt new file mode 100644 index 00000000..8129f5a0 --- /dev/null +++ b/external/SuiteSparse_config/README.txt @@ -0,0 +1,51 @@ +SuiteSparse_config, 2017, Timothy A. Davis, http://www.suitesparse.com +(formerly the UFconfig package) + +This directory contains a default SuiteSparse_config.mk file. It tries to +detect your system (Linux, SunOS, or Mac), which compiler to use (icc or cc), +which BLAS and LAPACK library to use (OpenBLAS or MKL), and whether or not to +compile with CUDA. + +For alternatives, see the comments in the SuiteSparse_config.mk file. + +License: No licensing restrictions apply to this file or to the +SuiteSparse_config directory. + +-------------------------------------------------------------------------------- + +SuiteSparse_config contains configuration settings for all many of the software +packages that I develop or co-author. Note that older versions of some of +these packages do not require SuiteSparse_config. + + Package Description + ------- ----------- + AMD approximate minimum degree ordering + CAMD constrained AMD + COLAMD column approximate minimum degree ordering + CCOLAMD constrained approximate minimum degree ordering + UMFPACK sparse LU factorization, with the BLAS + CXSparse int/long/real/complex version of CSparse + CHOLMOD sparse Cholesky factorization, update/downdate + KLU sparse LU factorization, BLAS-free + BTF permutation to block triangular form + LDL concise sparse LDL' + LPDASA LP Dual Active Set Algorithm + RBio read/write files in Rutherford/Boeing format + SPQR sparse QR factorization (full name: SuiteSparseQR) + +SuiteSparse_config is not required by these packages: + + CSparse a Concise Sparse matrix package + MATLAB_Tools toolboxes for use in MATLAB + +In addition, the xerbla/ directory contains Fortan and C versions of the +BLAS/LAPACK xerbla routine, which is called when an invalid input is passed to +the BLAS or LAPACK. The xerbla provided here does not print any message, so +the entire Fortran I/O library does not need to be linked into a C application. +Most versions of the BLAS contain xerbla, but those from K. Goto do not. Use +this if you need too. + +If you edit this directory (SuiteSparse_config.mk in particular) then you +must do "make purge ; make" in the parent directory to recompile all of +SuiteSparse. Otherwise, the changes will not necessarily be applied. + diff --git a/external/SuiteSparse_config/SuiteSparse_config.c b/external/SuiteSparse_config/SuiteSparse_config.c new file mode 100644 index 00000000..b491539f --- /dev/null +++ b/external/SuiteSparse_config/SuiteSparse_config.c @@ -0,0 +1,531 @@ +/* ========================================================================== */ +/* === SuiteSparse_config =================================================== */ +/* ========================================================================== */ + +/* SuiteSparse configuration : memory manager and printf functions. */ + +/* Copyright (c) 2013, Timothy A. Davis. No licensing restrictions + * apply to this file or to the SuiteSparse_config directory. + * Author: Timothy A. Davis. + */ + +#include +#include + +#ifndef NPRINT +#include +#endif + +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#include "matrix.h" +#endif + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#include "SuiteSparse_config.h" + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_config : a global extern struct */ +/* -------------------------------------------------------------------------- */ + +/* The SuiteSparse_config struct is available to all SuiteSparse functions and + to all applications that use those functions. It must be modified with + care, particularly in a multithreaded context. Normally, the application + will initialize this object once, via SuiteSparse_start, possibily followed + by application-specific modifications if the applications wants to use + alternative memory manager functions. + + The user can redefine these global pointers at run-time to change the + memory manager and printf function used by SuiteSparse. + + If -DNMALLOC is defined at compile-time, then no memory-manager is + specified. You must define them at run-time, after calling + SuiteSparse_start. + + If -DPRINT is defined a compile time, then printf is disabled, and + SuiteSparse will not use printf. + */ + +struct SuiteSparse_config_struct SuiteSparse_config = +{ + + /* memory management functions */ + #ifndef NMALLOC + #ifdef MATLAB_MEX_FILE + /* MATLAB mexFunction: */ + mxMalloc, mxCalloc, mxRealloc, mxFree, + #else + /* standard ANSI C: */ + malloc, calloc, realloc, free, + #endif + #else + /* no memory manager defined; you must define one at run-time: */ + NULL, NULL, NULL, NULL, + #endif + + /* printf function */ + #ifndef NPRINT + #ifdef MATLAB_MEX_FILE + /* MATLAB mexFunction: */ + mexPrintf, + #else + /* standard ANSI C: */ + printf, + #endif + #else + /* printf is disabled */ + NULL, + #endif + + SuiteSparse_hypot, + SuiteSparse_divcomplex + +} ; + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_start */ +/* -------------------------------------------------------------------------- */ + +/* All applications that use SuiteSparse should call SuiteSparse_start prior + to using any SuiteSparse function. Only a single thread should call this + function, in a multithreaded application. Currently, this function is + optional, since all this function currently does is to set the four memory + function pointers to NULL (which tells SuiteSparse to use the default + functions). In a multi- threaded application, only a single thread should + call this function. + + Future releases of SuiteSparse might enforce a requirement that + SuiteSparse_start be called prior to calling any SuiteSparse function. + */ + +void SuiteSparse_start ( void ) +{ + + /* memory management functions */ + #ifndef NMALLOC + #ifdef MATLAB_MEX_FILE + /* MATLAB mexFunction: */ + SuiteSparse_config.malloc_func = mxMalloc ; + SuiteSparse_config.calloc_func = mxCalloc ; + SuiteSparse_config.realloc_func = mxRealloc ; + SuiteSparse_config.free_func = mxFree ; + #else + /* standard ANSI C: */ + SuiteSparse_config.malloc_func = malloc ; + SuiteSparse_config.calloc_func = calloc ; + SuiteSparse_config.realloc_func = realloc ; + SuiteSparse_config.free_func = free ; + #endif + #else + /* no memory manager defined; you must define one after calling + SuiteSparse_start */ + SuiteSparse_config.malloc_func = NULL ; + SuiteSparse_config.calloc_func = NULL ; + SuiteSparse_config.realloc_func = NULL ; + SuiteSparse_config.free_func = NULL ; + #endif + + /* printf function */ + #ifndef NPRINT + #ifdef MATLAB_MEX_FILE + /* MATLAB mexFunction: */ + SuiteSparse_config.printf_func = mexPrintf ; + #else + /* standard ANSI C: */ + SuiteSparse_config.printf_func = printf ; + #endif + #else + /* printf is disabled */ + SuiteSparse_config.printf_func = NULL ; + #endif + + /* math functions */ + SuiteSparse_config.hypot_func = SuiteSparse_hypot ; + SuiteSparse_config.divcomplex_func = SuiteSparse_divcomplex ; +} + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_finish */ +/* -------------------------------------------------------------------------- */ + +/* This currently does nothing, but in the future, applications should call + SuiteSparse_start before calling any SuiteSparse function, and then + SuiteSparse_finish after calling the last SuiteSparse function, just before + exiting. In a multithreaded application, only a single thread should call + this function. + + Future releases of SuiteSparse might use this function for any + SuiteSparse-wide cleanup operations or finalization of statistics. + */ + +void SuiteSparse_finish ( void ) +{ + /* do nothing */ ; +} + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_malloc: malloc wrapper */ +/* -------------------------------------------------------------------------- */ + +void *SuiteSparse_malloc /* pointer to allocated block of memory */ +( + size_t nitems, /* number of items to malloc */ + size_t size_of_item /* sizeof each item */ +) +{ + void *p ; + size_t size ; + if (nitems < 1) nitems = 1 ; + if (size_of_item < 1) size_of_item = 1 ; + size = nitems * size_of_item ; + + if (size != ((double) nitems) * size_of_item) + { + /* size_t overflow */ + p = NULL ; + } + else + { + p = (void *) (SuiteSparse_config.malloc_func) (size) ; + } + return (p) ; +} + + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_calloc: calloc wrapper */ +/* -------------------------------------------------------------------------- */ + +void *SuiteSparse_calloc /* pointer to allocated block of memory */ +( + size_t nitems, /* number of items to calloc */ + size_t size_of_item /* sizeof each item */ +) +{ + void *p ; + size_t size ; + if (nitems < 1) nitems = 1 ; + if (size_of_item < 1) size_of_item = 1 ; + size = nitems * size_of_item ; + + if (size != ((double) nitems) * size_of_item) + { + /* size_t overflow */ + p = NULL ; + } + else + { + p = (void *) (SuiteSparse_config.calloc_func) (nitems, size_of_item) ; + } + return (p) ; +} + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_realloc: realloc wrapper */ +/* -------------------------------------------------------------------------- */ + +/* If p is non-NULL on input, it points to a previously allocated object of + size nitems_old * size_of_item. The object is reallocated to be of size + nitems_new * size_of_item. If p is NULL on input, then a new object of that + size is allocated. On success, a pointer to the new object is returned, + and ok is returned as 1. If the allocation fails, ok is set to 0 and a + pointer to the old (unmodified) object is returned. + */ + +void *SuiteSparse_realloc /* pointer to reallocated block of memory, or + to original block if the realloc failed. */ +( + size_t nitems_new, /* new number of items in the object */ + size_t nitems_old, /* old number of items in the object */ + size_t size_of_item, /* sizeof each item */ + void *p, /* old object to reallocate */ + int *ok /* 1 if successful, 0 otherwise */ +) +{ + size_t size ; + if (nitems_old < 1) nitems_old = 1 ; + if (nitems_new < 1) nitems_new = 1 ; + if (size_of_item < 1) size_of_item = 1 ; + size = nitems_new * size_of_item ; + + if (size != ((double) nitems_new) * size_of_item) + { + /* size_t overflow */ + (*ok) = 0 ; + } + else if (p == NULL) + { + /* a fresh object is being allocated */ + p = SuiteSparse_malloc (nitems_new, size_of_item) ; + (*ok) = (p != NULL) ; + } + else if (nitems_old == nitems_new) + { + /* the object does not change; do nothing */ + (*ok) = 1 ; + } + else + { + /* change the size of the object from nitems_old to nitems_new */ + void *pnew ; + pnew = (void *) (SuiteSparse_config.realloc_func) (p, size) ; + if (pnew == NULL) + { + if (nitems_new < nitems_old) + { + /* the attempt to reduce the size of the block failed, but + the old block is unchanged. So pretend to succeed. */ + (*ok) = 1 ; + } + else + { + /* out of memory */ + (*ok) = 0 ; + } + } + else + { + /* success */ + p = pnew ; + (*ok) = 1 ; + } + } + return (p) ; +} + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_free: free wrapper */ +/* -------------------------------------------------------------------------- */ + +void *SuiteSparse_free /* always returns NULL */ +( + void *p /* block to free */ +) +{ + if (p) + { + (SuiteSparse_config.free_func) (p) ; + } + return (NULL) ; +} + + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_tic: return current wall clock time */ +/* -------------------------------------------------------------------------- */ + +/* Returns the number of seconds (tic [0]) and nanoseconds (tic [1]) since some + * unspecified but fixed time in the past. If no timer is installed, zero is + * returned. A scalar double precision value for 'tic' could be used, but this + * might cause loss of precision because clock_getttime returns the time from + * some distant time in the past. Thus, an array of size 2 is used. + * + * The timer is enabled by default. To disable the timer, compile with + * -DNTIMER. If enabled on a POSIX C 1993 system, the timer requires linking + * with the -lrt library. + * + * example: + * + * double tic [2], r, s, t ; + * SuiteSparse_tic (tic) ; // start the timer + * // do some work A + * t = SuiteSparse_toc (tic) ; // t is time for work A, in seconds + * // do some work B + * s = SuiteSparse_toc (tic) ; // s is time for work A and B, in seconds + * SuiteSparse_tic (tic) ; // restart the timer + * // do some work C + * r = SuiteSparse_toc (tic) ; // s is time for work C, in seconds + * + * A double array of size 2 is used so that this routine can be more easily + * ported to non-POSIX systems. The caller does not rely on the POSIX + * include file. + */ + +#ifdef SUITESPARSE_TIMER_ENABLED + +#include + +void SuiteSparse_tic +( + double tic [2] /* output, contents undefined on input */ +) +{ + /* POSIX C 1993 timer, requires -librt */ + struct timespec t ; + clock_gettime (CLOCK_MONOTONIC, &t) ; + tic [0] = (double) (t.tv_sec) ; + tic [1] = (double) (t.tv_nsec) ; +} + +#else + +void SuiteSparse_tic +( + double tic [2] /* output, contents undefined on input */ +) +{ + /* no timer installed */ + tic [0] = 0 ; + tic [1] = 0 ; +} + +#endif + + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_toc: return time since last tic */ +/* -------------------------------------------------------------------------- */ + +/* Assuming SuiteSparse_tic is accurate to the nanosecond, this function is + * accurate down to the nanosecond for 2^53 nanoseconds since the last call to + * SuiteSparse_tic, which is sufficient for SuiteSparse (about 104 days). If + * additional accuracy is required, the caller can use two calls to + * SuiteSparse_tic and do the calculations differently. + */ + +double SuiteSparse_toc /* returns time in seconds since last tic */ +( + double tic [2] /* input, not modified from last call to SuiteSparse_tic */ +) +{ + double toc [2] ; + SuiteSparse_tic (toc) ; + return ((toc [0] - tic [0]) + 1e-9 * (toc [1] - tic [1])) ; +} + + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_time: return current wallclock time in seconds */ +/* -------------------------------------------------------------------------- */ + +/* This function might not be accurate down to the nanosecond. */ + +double SuiteSparse_time /* returns current wall clock time in seconds */ +( + void +) +{ + double toc [2] ; + SuiteSparse_tic (toc) ; + return (toc [0] + 1e-9 * toc [1]) ; +} + + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_version: return the current version of SuiteSparse */ +/* -------------------------------------------------------------------------- */ + +int SuiteSparse_version +( + int version [3] +) +{ + if (version != NULL) + { + version [0] = SUITESPARSE_MAIN_VERSION ; + version [1] = SUITESPARSE_SUB_VERSION ; + version [2] = SUITESPARSE_SUBSUB_VERSION ; + } + return (SUITESPARSE_VERSION) ; +} + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_hypot */ +/* -------------------------------------------------------------------------- */ + +/* There is an equivalent routine called hypot in , which conforms + * to ANSI C99. However, SuiteSparse does not assume that ANSI C99 is + * available. You can use the ANSI C99 hypot routine with: + * + * #include + *i SuiteSparse_config.hypot_func = hypot ; + * + * Default value of the SuiteSparse_config.hypot_func pointer is + * SuiteSparse_hypot, defined below. + * + * s = hypot (x,y) computes s = sqrt (x*x + y*y) but does so more accurately. + * The NaN cases for the double relops x >= y and x+y == x are safely ignored. + * + * Source: Algorithm 312, "Absolute value and square root of a complex number," + * P. Friedland, Comm. ACM, vol 10, no 10, October 1967, page 665. + */ + +double SuiteSparse_hypot (double x, double y) +{ + double s, r ; + x = fabs (x) ; + y = fabs (y) ; + if (x >= y) + { + if (x + y == x) + { + s = x ; + } + else + { + r = y / x ; + s = x * sqrt (1.0 + r*r) ; + } + } + else + { + if (y + x == y) + { + s = y ; + } + else + { + r = x / y ; + s = y * sqrt (1.0 + r*r) ; + } + } + return (s) ; +} + +/* -------------------------------------------------------------------------- */ +/* SuiteSparse_divcomplex */ +/* -------------------------------------------------------------------------- */ + +/* c = a/b where c, a, and b are complex. The real and imaginary parts are + * passed as separate arguments to this routine. The NaN case is ignored + * for the double relop br >= bi. Returns 1 if the denominator is zero, + * 0 otherwise. + * + * This uses ACM Algo 116, by R. L. Smith, 1962, which tries to avoid + * underflow and overflow. + * + * c can be the same variable as a or b. + * + * Default value of the SuiteSparse_config.divcomplex_func pointer is + * SuiteSparse_divcomplex. + */ + +int SuiteSparse_divcomplex +( + double ar, double ai, /* real and imaginary parts of a */ + double br, double bi, /* real and imaginary parts of b */ + double *cr, double *ci /* real and imaginary parts of c */ +) +{ + double tr, ti, r, den ; + if (fabs (br) >= fabs (bi)) + { + r = bi / br ; + den = br + r * bi ; + tr = (ar + ai * r) / den ; + ti = (ai - ar * r) / den ; + } + else + { + r = br / bi ; + den = r * br + bi ; + tr = (ar * r + ai) / den ; + ti = (ai * r - ar) / den ; + } + *cr = tr ; + *ci = ti ; + return (den == 0.) ; +} diff --git a/external/SuiteSparse_config/SuiteSparse_config.mk b/external/SuiteSparse_config/SuiteSparse_config.mk new file mode 100644 index 00000000..5ca26c99 --- /dev/null +++ b/external/SuiteSparse_config/SuiteSparse_config.mk @@ -0,0 +1,601 @@ +#=============================================================================== +# SuiteSparse_config.mk: common configuration file for the SuiteSparse +#=============================================================================== + +# This file contains all configuration settings for all packages in SuiteSparse, +# except for CSparse (which is stand-alone) and the packages in MATLAB_Tools. + +SUITESPARSE_VERSION = 4.5.5 + +#=============================================================================== +# Options you can change without editing this file: +#=============================================================================== + + # To list the options you can modify at the 'make' command line, type + # 'make config', which also lists their default values. You can then + # change them with 'make OPTION=value'. For example, to use an INSTALL + # path of /my/path, and to use your own BLAS and LAPACK libraries, do: + # + # make install INSTALL=/my/path BLAS=-lmyblas LAPACK=-lmylapackgoeshere + # + # which will install the package into /my/path/lib and /my/path/include, + # and use -lmyblas -lmylapackgoes here when building the demo program. + +#=============================================================================== +# Defaults for any system +#=============================================================================== + + #--------------------------------------------------------------------------- + # SuiteSparse root directory + #--------------------------------------------------------------------------- + + # Most Makefiles are in SuiteSparse/Pkg/Lib or SuiteSparse/Pkg/Demo, so + # the top-level of SuiteSparse is in ../.. unless otherwise specified. + # This is true for all but the SuiteSparse_config package. + SUITESPARSE ?= $(realpath $(CURDIR)/../..) + + #--------------------------------------------------------------------------- + # installation location + #--------------------------------------------------------------------------- + + # For "make install" and "make uninstall", the default location is + # SuiteSparse/lib, SuiteSparse/include, and + # SuiteSparse/share/doc/suitesparse-x.y.z + # If you do this: + # make install INSTALL=/usr/local + # then the libraries are installed in /usr/local/lib, include files in + # /usr/local/include, and documentation in + # /usr/local/share/doc/suitesparse-x.y.z. + # You can instead specify the install location of each of these 3 components + # separately, via (for example): + # make install INSTALL_LIB=/yada/mylibs INSTALL_INCLUDE=/yoda/myinc \ + # INSTALL_DOC=/solo/mydox + # which puts the libraries in /yada/mylibs, include files in /yoda/myinc, + # and documentation in /solo/mydox. + INSTALL ?= $(SUITESPARSE) + INSTALL_LIB ?= $(INSTALL)/lib + INSTALL_INCLUDE ?= $(INSTALL)/include + INSTALL_DOC ?= $(INSTALL)/share/doc/suitesparse-$(SUITESPARSE_VERSION) + + #--------------------------------------------------------------------------- + # optimization level + #--------------------------------------------------------------------------- + + OPTIMIZATION ?= -O3 + + #--------------------------------------------------------------------------- + # statement coverage for */Tcov + #--------------------------------------------------------------------------- + + ifeq ($(TCOV),yes) + # Each package has a */Tcov directory for extensive testing, including + # statement coverage. The Tcov tests require Linux and gcc, and use + # the vanilla BLAS. For those tests, the packages use 'make TCOV=yes', + # which overrides the following settings: + MKLROOT = + AUTOCC = no + CC = gcc + CXX = g++ + BLAS = -lrefblas -lgfortran -lstdc++ + LAPACK = -llapack + CFLAGS += --coverage + OPTIMIZATION = -g + LDFLAGS += --coverage + endif + + #--------------------------------------------------------------------------- + # CFLAGS for the C/C++ compiler + #--------------------------------------------------------------------------- + + # The CF macro is used by SuiteSparse Makefiles as a combination of + # CFLAGS, CPPFLAGS, TARGET_ARCH, and system-dependent settings. + CF ?= $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $(OPTIMIZATION) -fexceptions -fPIC + + #--------------------------------------------------------------------------- + # OpenMP is used in CHOLMOD + #--------------------------------------------------------------------------- + + # with gcc, enable OpenMP directives via -fopenmp + # This is not supported on Darwin, so this string is cleared, below. + CFOPENMP ?= -fopenmp + + #--------------------------------------------------------------------------- + # compiler + #--------------------------------------------------------------------------- + + # By default, look for the Intel compilers. If present, they are used + # instead of $(CC), $(CXX), and $(F77). To disable this feature and + # use the $(CC), $(CXX), and $(F77) compilers, use 'make AUTOCC=no' + + AUTOCC ?= yes + + ifneq ($(AUTOCC),no) + ifneq ($(shell which icc 2>/dev/null),) + # use the Intel icc compiler for C codes, and -qopenmp for OpenMP + CC = icc -D_GNU_SOURCE + CXX = $(CC) + CFOPENMP = -qopenmp -I$(MKLROOT)/include + LDFLAGS += -openmp + endif + ifneq ($(shell which ifort 2>/dev/null),) + # use the Intel ifort compiler for Fortran codes + F77 = ifort + endif + endif + + #--------------------------------------------------------------------------- + # code formatting (for Tcov on Linux only) + #--------------------------------------------------------------------------- + + PRETTY ?= grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120 + + #--------------------------------------------------------------------------- + # required libraries + #--------------------------------------------------------------------------- + + # SuiteSparse requires the BLAS, LAPACK, and -lm (Math) libraries. + # It places its shared *.so libraries in SuiteSparse/lib. + # Linux also requires the -lrt library (see below) + LDLIBS ?= -lm + LDFLAGS += -L$(INSTALL_LIB) + + # See http://www.openblas.net for a recent and freely available optimzed + # BLAS. LAPACK is at http://www.netlib.org/lapack/ . You can use the + # standard Fortran LAPACK along with OpenBLAS to obtain very good + # performance. This script can also detect if the Intel MKL BLAS is + # installed. + + LAPACK ?= -llapack + + ifndef BLAS + ifdef MKLROOT + # use the Intel MKL for BLAS and LAPACK + # using static linking: + # BLAS = -Wl,--start-group \ + # $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a \ + # $(MKLROOT)/lib/intel64/libmkl_core.a \ + # $(MKLROOT)/lib/intel64/libmkl_intel_thread.a \ + # -Wl,--end-group -lpthread -lm + # using dynamic linking: + BLAS = -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -lpthread -lm + LAPACK = + else + # use the OpenBLAS at http://www.openblas.net + BLAS = -lopenblas + endif + endif + + # For ACML, use this instead: + # make BLAS='-lacml -lgfortran' + + #--------------------------------------------------------------------------- + # shell commands + #--------------------------------------------------------------------------- + + # ranlib, and ar, for generating libraries. If you don't need ranlib, + # just change it to RANLAB = echo + RANLIB ?= ranlib + ARCHIVE ?= $(AR) $(ARFLAGS) + CP ?= cp -f + MV ?= mv -f + + #--------------------------------------------------------------------------- + # Fortran compiler (not required for 'make' or 'make library') + #--------------------------------------------------------------------------- + + # A Fortran compiler is optional. Only required for the optional Fortran + # interfaces to AMD and UMFPACK. Not needed by 'make' or 'make install' + F77 ?= gfortran + F77FLAGS ?= $(FFLAGS) $(OPTIMIZATION) + + #--------------------------------------------------------------------------- + # NVIDIA CUDA configuration for CHOLMOD and SPQR + #--------------------------------------------------------------------------- + + # CUDA is detected automatically, and used if found. To disable CUDA, + # use CUDA=no + + ifneq ($(CUDA),no) + CUDA_PATH = $(shell which nvcc 2>/dev/null | sed "s/\/bin\/nvcc//") + endif + + ifeq ($(wildcard $(CUDA_PATH)),) + # CUDA is not present + CUDA_PATH = + GPU_BLAS_PATH = + GPU_CONFIG = + CUDART_LIB = + CUBLAS_LIB = + CUDA_INC_PATH = + CUDA_INC = + NVCC = echo + NVCCFLAGS = + else + # with CUDA for CHOLMOD and SPQR + GPU_BLAS_PATH = $(CUDA_PATH) + # GPU_CONFIG must include -DGPU_BLAS to compile SuiteSparse for the + # GPU. You can add additional GPU-related flags to it as well. + # with 4 cores (default): + GPU_CONFIG = -DGPU_BLAS + # For example, to compile CHOLMOD for 10 CPU cores when using the GPU: + # GPU_CONFIG = -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10 + CUDART_LIB = $(CUDA_PATH)/lib64/libcudart.so + CUBLAS_LIB = $(CUDA_PATH)/lib64/libcublas.so + CUDA_INC_PATH = $(CUDA_PATH)/include/ + CUDA_INC = -I$(CUDA_INC_PATH) + NVCC = $(CUDA_PATH)/bin/nvcc + NVCCFLAGS = -Xcompiler -fPIC -O3 \ + -gencode=arch=compute_30,code=sm_30 \ + -gencode=arch=compute_35,code=sm_35 \ + -gencode=arch=compute_50,code=sm_50 \ + -gencode=arch=compute_50,code=compute_50 + endif + + #--------------------------------------------------------------------------- + # UMFPACK configuration: + #--------------------------------------------------------------------------- + + # Configuration for UMFPACK. See UMFPACK/Source/umf_config.h for details. + # + # -DNBLAS do not use the BLAS. UMFPACK will be very slow. + # -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by + # LAPACK and the BLAS (defaults to 'int') + # -DNSUNPERF do not use the Sun Perf. Library on Solaris + # -DNRECIPROCAL do not multiply by the reciprocal + # -DNO_DIVIDE_BY_ZERO do not divide by zero + # -DNCHOLMOD do not use CHOLMOD as a ordering method. If -DNCHOLMOD is + # included in UMFPACK_CONFIG, then UMFPACK does not rely on + # CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS. + + UMFPACK_CONFIG ?= + + # For example, uncomment this line to compile UMFPACK without CHOLMOD: + # UMFPACK_CONFIG = -DNCHOLMOD + # or use 'make UMFPACK_CONFIG=-DNCHOLMOD' + + #--------------------------------------------------------------------------- + # CHOLMOD configuration + #--------------------------------------------------------------------------- + + # CHOLMOD Library Modules, which appear in -lcholmod + # Core requires: none + # Check requires: Core + # Cholesky requires: Core, AMD, COLAMD. optional: Partition, Supernodal + # MatrixOps requires: Core + # Modify requires: Core + # Partition requires: Core, CCOLAMD, METIS. optional: Cholesky + # Supernodal requires: Core, BLAS, LAPACK + # + # CHOLMOD test/demo Modules (these do not appear in -lcholmod): + # Tcov requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal + # optional: Partition + # Valgrind same as Tcov + # Demo requires: Core, Check, Cholesky, MatrixOps, Supernodal + # optional: Partition + # + # Configuration flags: + # -DNCHECK do not include the Check module. + # -DNCHOLESKY do not include the Cholesky module. + # -DNPARTITION do not include the Partition module. + # also do not include METIS. + # -DNCAMD do not use CAMD & CCOLAMD in Parition Module. + # -DNMATRIXOPS do not include the MatrixOps module. + # -DNMODIFY do not include the Modify module. + # -DNSUPERNODAL do not include the Supernodal module. + # + # -DNPRINT do not print anything. + # -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by + # LAPACK and the BLAS (defaults to 'int') + # -DNSUNPERF for Solaris only. If defined, do not use the Sun + # Performance Library + # -DGPU_BLAS enable the use of the CUDA BLAS + + CHOLMOD_CONFIG ?= $(GPU_CONFIG) + + #--------------------------------------------------------------------------- + # SuiteSparseQR configuration: + #--------------------------------------------------------------------------- + + # The SuiteSparseQR library can be compiled with the following options: + # + # -DNPARTITION do not include the CHOLMOD partition module + # -DNEXPERT do not include the functions in SuiteSparseQR_expert.cpp + # -DHAVE_TBB enable the use of Intel's Threading Building Blocks + # -DGPU_BLAS enable the use of the CUDA BLAS + + SPQR_CONFIG ?= $(GPU_CONFIG) + + # to compile with Intel's TBB, use TBB=-ltbb -DSPQR_CONFIG=-DHAVE_TBB + TBB ?= + # TBB = -ltbb -DSPQR_CONFIG=-DHAVE_TBB + + # TODO: this *mk file should auto-detect the presence of Intel's TBB, + # and set the compiler flags accordingly. + +#=============================================================================== +# System-dependent configurations +#=============================================================================== + + #--------------------------------------------------------------------------- + # determine what system we are on + #--------------------------------------------------------------------------- + + # To disable these auto configurations, use 'make UNAME=custom' + + ifndef UNAME + # ifeq ($(OS),Windows_NT) + # Cygwin Make on Windows has an $(OS) variable, but not uname. + # Note that this option is untested. + UNAME = Windows + # else + # Linux and Darwin (Mac OSX) have been tested. + UNAME := $(shell uname) + # endif + endif + + #--------------------------------------------------------------------------- + # Linux + #--------------------------------------------------------------------------- + + ifeq ($(UNAME),Linux) + # add the realtime library, librt, and SuiteSparse/lib + LDLIBS += -lrt -Wl,-rpath=$(INSTALL_LIB) + endif + + #--------------------------------------------------------------------------- + # Mac + #--------------------------------------------------------------------------- + + ifeq ($(UNAME), Darwin) + # To compile on the Mac, you must install Xcode. Then do this at the + # command line in the Terminal, before doing 'make': + # xcode-select --install + CF += -fno-common + BLAS = -framework Accelerate + LAPACK = -framework Accelerate + # OpenMP is not yet supported by default in clang + CFOPENMP = + endif + + #--------------------------------------------------------------------------- + # Solaris + #--------------------------------------------------------------------------- + + ifeq ($(UNAME), SunOS) + # Using the Sun compiler and the Sun Performance Library + # This hasn't been tested recently. + # I leave it here in case you need it. It likely needs updating. + CF += -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc + F77FLAGS = -O -fast -KPIC -dalign -xlibmil -m64 + BLAS = -xlic_lib=sunperf + LAPACK = + # Using the GCC compiler and the reference BLAS + ## CC = gcc + ## CXX = g++ + ## MAKE = gmake + ## BLAS = -lrefblas -lgfortran + ## LAPACK = -llapack + endif + + #--------------------------------------------------------------------------- + # IBM AIX + #--------------------------------------------------------------------------- + + ifeq ($(UNAME), AIX) + # hasn't been tested for a very long time... + # I leave it here in case you need it. It likely needs updating. + CF += -O4 -qipa -qmaxmem=16384 -q64 -qproto -DBLAS_NO_UNDERSCORE + F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64 + BLAS = -lessl + LAPACK = + endif + +#=============================================================================== +# finalize the CF compiler flags +#=============================================================================== + + CF += $(CFOPENMP) + +#=============================================================================== +# internal configuration +#=============================================================================== + + # The user should not have to change these definitions, and they are + # not displayed by 'make config' + + #--------------------------------------------------------------------------- + # for removing files not in the distribution + #--------------------------------------------------------------------------- + + # remove object files, but keep compiled libraries via 'make clean' + CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d \ + *.gcda *.gcno *.aux *.bbl *.blg *.log *.toc *.dvi *.lof *.lot + + # also remove compiled libraries, via 'make distclean' + PURGE = *.so* *.a *.dll *.dylib *.dSYM + + # location of TCOV test output + TCOV_TMP ?= /tmp + +#=============================================================================== +# Building the shared and static libraries +#=============================================================================== + +# How to build/install shared and static libraries for Mac and Linux/Unix. +# This assumes that LIBRARY and VERSION have already been defined by the +# Makefile that includes this file. + +SO_OPTS = $(LDFLAGS) + +# ifeq ($(UNAME),Windows) +# # Cygwin Make on Windows (untested) +# AR_TARGET = $(LIBRARY).lib +# SO_PLAIN = $(LIBRARY).dll +# SO_MAIN = $(LIBRARY).$(SO_VERSION).dll +# SO_TARGET = $(LIBRARY).$(VERSION).dll +# SO_INSTALL_NAME = echo +# else + # Mac or Linux/Unix + AR_TARGET = $(LIBRARY).a + ifeq ($(UNAME),Darwin) + # Mac + SO_PLAIN = $(LIBRARY).dylib + SO_MAIN = $(LIBRARY).$(SO_VERSION).dylib + SO_TARGET = $(LIBRARY).$(VERSION).dylib + SO_OPTS += -dynamiclib -compatibility_version $(SO_VERSION) \ + -current_version $(VERSION) \ + -shared -undefined dynamic_lookup + # When a Mac *.dylib file is moved, this command is required + # to change its internal name to match its location in the filesystem: + SO_INSTALL_NAME = install_name_tool -id + else + # Linux and other variants of Unix + SO_PLAIN = $(LIBRARY).so + SO_MAIN = $(LIBRARY).so.$(SO_VERSION) + SO_TARGET = $(LIBRARY).so.$(VERSION) + SO_OPTS += -shared -Wl,-soname -Wl,$(SO_MAIN) -Wl,--no-undefined + # Linux/Unix *.so files can be moved without modification: + SO_INSTALL_NAME = echo + endif +# endif + +#=============================================================================== +# Configure CHOLMOD/Partition module with METIS, CAMD, and CCOLAMD +#=============================================================================== + +# By default, SuiteSparse uses METIS 5.1.0 in the SuiteSparse/metis-5.1.0 +# directory. SuiteSparse's interface to METIS is only through the +# SuiteSparse/CHOLMOD/Partition module, which also requires SuiteSparse/CAMD +# and SuiteSparse/CCOLAMD. +# +# If you wish to use your own pre-installed copy of METIS, use the MY_METIS_LIB +# and MY_METIS_INC options passed to 'make'. For example: +# make MY_METIS_LIB=-lmetis +# make MY_METIS_LIB=/home/myself/mylibraries/libmetis.so +# make MY_METIS_LIB='-L/home/myself/mylibraries -lmetis' +# If you need to tell the compiler where to find the metis.h include file, +# then add MY_METIS_INC=/home/myself/metis-5.1.0/include as well, which points +# to the directory containing metis.h. If metis.h is already installed in +# a location known to the compiler (/usr/local/include/metis.h for example) +# then you do not need to add MY_METIS_INC. + +I_WITH_PARTITION = +LIB_WITH_PARTITION = +CONFIG_PARTITION = -DNPARTITION -DNCAMD +# check if CAMD/CCOLAMD and METIS are requested and available +ifeq (,$(findstring -DNCAMD, $(CHOLMOD_CONFIG))) + # CAMD and CCOLAMD are requested. See if they are available in + # SuiteSparse/CAMD and SuiteSparse/CCOLAMD + ifneq (, $(wildcard $(SUITESPARSE)/CAMD)) + ifneq (, $(wildcard $(SUITESPARSE)/CCOLAMD)) + # CAMD and CCOLAMD are requested and available + LIB_WITH_PARTITION = -lccolamd -lcamd + I_WITH_PARTITION = -I$(SUITESPARSE)/CCOLAMD/Include -I$(SUITESPARSE)/CAMD/Include + CONFIG_PARTITION = -DNPARTITION + # check if METIS is requested and available + ifeq (,$(findstring -DNPARTITION, $(CHOLMOD_CONFIG))) + # METIS is requested. See if it is available. + ifneq (,$(MY_METIS_LIB)) + # METIS 5.1.0 is provided elsewhere, and we are not using + # SuiteSparse/metis-5.1.0. To do so, we link with + # $(MY_METIS_LIB) and add the -I$(MY_METIS_INC) option for + # the compiler. The latter can be empty if you have METIS + # installed in a place where the compiler can find the + # metis.h include file by itself without any -I option + # (/usr/local/include/metis.h for example). + LIB_WITH_PARTITION += $(MY_METIS_LIB) + ifneq (,$(MY_METIS_INC)) + I_WITH_PARTITION += -I$(MY_METIS_INC) + endif + CONFIG_PARTITION = + else + # see if METIS is in SuiteSparse/metis-5.1.0 + ifneq (, $(wildcard $(SUITESPARSE)/metis-5.1.0)) + # SuiteSparse/metis5.1.0 is available + ifeq ($(UNAME), Darwin) + LIB_WITH_PARTITION += $(SUITESPARSE)/lib/libmetis.dylib + else + LIB_WITH_PARTITION += -lmetis + endif + I_WITH_PARTITION += -I$(SUITESPARSE)/metis-5.1.0/include + CONFIG_PARTITION = + endif + endif + endif + endif + endif +endif + +#=============================================================================== +# display configuration +#=============================================================================== + +ifeq ($(LIBRARY),) + # placeholders, for 'make config' in the top-level SuiteSparse + LIBRARY=PackageNameWillGoHere + VERSION=x.y.z + SO_VERSION=x +endif + +# 'make config' lists the primary installation options +config: + @echo ' ' + @echo '----------------------------------------------------------------' + @echo 'SuiteSparse package compilation options:' + @echo '----------------------------------------------------------------' + @echo ' ' + @echo 'SuiteSparse Version: ' '$(SUITESPARSE_VERSION)' + @echo 'SuiteSparse top folder: ' '$(SUITESPARSE)' + @echo 'Package: LIBRARY= ' '$(LIBRARY)' + @echo 'Version: VERSION= ' '$(VERSION)' + @echo 'SO version: SO_VERSION= ' '$(SO_VERSION)' + @echo 'System: UNAME= ' '$(UNAME)' + @echo 'Install directory: INSTALL= ' '$(INSTALL)' + @echo 'Install libraries in: INSTALL_LIB= ' '$(INSTALL_LIB)' + @echo 'Install include files in: INSTALL_INCLUDE=' '$(INSTALL_INCLUDE)' + @echo 'Install documentation in: INSTALL_DOC= ' '$(INSTALL_DOC)' + @echo 'Optimization level: OPTIMIZATION= ' '$(OPTIMIZATION)' + @echo 'BLAS library: BLAS= ' '$(BLAS)' + @echo 'LAPACK library: LAPACK= ' '$(LAPACK)' + @echo 'Intel TBB library: TBB= ' '$(TBB)' + @echo 'Other libraries: LDLIBS= ' '$(LDLIBS)' + @echo 'static library: AR_TARGET= ' '$(AR_TARGET)' + @echo 'shared library (full): SO_TARGET= ' '$(SO_TARGET)' + @echo 'shared library (main): SO_MAIN= ' '$(SO_MAIN)' + @echo 'shared library (short): SO_PLAIN= ' '$(SO_PLAIN)' + @echo 'shared library options: SO_OPTS= ' '$(SO_OPTS)' + @echo 'shared library name tool: SO_INSTALL_NAME=' '$(SO_INSTALL_NAME)' + @echo 'ranlib, for static libs: RANLIB= ' '$(RANLIB)' + @echo 'static library command: ARCHIVE= ' '$(ARCHIVE)' + @echo 'copy file: CP= ' '$(CP)' + @echo 'move file: MV= ' '$(MV)' + @echo 'remove file: RM= ' '$(RM)' + @echo 'pretty (for Tcov tests): PRETTY= ' '$(PRETTY)' + @echo 'C compiler: CC= ' '$(CC)' + @echo 'C++ compiler: CXX= ' '$(CXX)' + @echo 'CUDA compiler: NVCC= ' '$(NVCC)' + @echo 'CUDA root directory: CUDA_PATH= ' '$(CUDA_PATH)' + @echo 'OpenMP flags: CFOPENMP= ' '$(CFOPENMP)' + @echo 'C/C++ compiler flags: CF= ' '$(CF)' + @echo 'LD flags: LDFLAGS= ' '$(LDFLAGS)' + @echo 'Fortran compiler: F77= ' '$(F77)' + @echo 'Fortran flags: F77FLAGS= ' '$(F77FLAGS)' + @echo 'Intel MKL root: MKLROOT= ' '$(MKLROOT)' + @echo 'Auto detect Intel icc: AUTOCC= ' '$(AUTOCC)' + @echo 'UMFPACK config: UMFPACK_CONFIG= ' '$(UMFPACK_CONFIG)' + @echo 'CHOLMOD config: CHOLMOD_CONFIG= ' '$(CHOLMOD_CONFIG)' + @echo 'SuiteSparseQR config: SPQR_CONFIG= ' '$(SPQR_CONFIG)' + @echo 'CUDA library: CUDART_LIB= ' '$(CUDART_LIB)' + @echo 'CUBLAS library: CUBLAS_LIB= ' '$(CUBLAS_LIB)' + @echo 'METIS and CHOLMOD/Partition configuration:' + @echo 'Your METIS library: MY_METIS_LIB= ' '$(MY_METIS_LIB)' + @echo 'Your metis.h is in: MY_METIS_INC= ' '$(MY_METIS_INC)' + @echo 'METIS is used via the CHOLMOD/Partition module, configured as follows.' + @echo 'If the next line has -DNPARTITION then METIS will not be used:' + @echo 'CHOLMOD Partition config: ' '$(CONFIG_PARTITION)' + @echo 'CHOLMOD Partition libs: ' '$(LIB_WITH_PARTITION)' + @echo 'CHOLMOD Partition include:' '$(I_WITH_PARTITION)' +ifeq ($(TCOV),yes) + @echo 'TCOV=yes, for extensive testing only (gcc, g++, vanilla BLAS)' +endif + diff --git a/external/amd/Demo/Makefile b/external/amd/Demo/Makefile new file mode 100644 index 00000000..452e0e34 --- /dev/null +++ b/external/amd/Demo/Makefile @@ -0,0 +1,97 @@ +#----------------------------------------------------------------------------- +# compile the AMD demo +#----------------------------------------------------------------------------- + +default: amd_simple amd_demo amd_demo2 amd_l_demo + +gak: + echo $(SUITESPARSE) + +include ../../SuiteSparse_config/SuiteSparse_config.mk + +C = $(CC) $(CF) -I../../include + +LIB2 = $(LDFLAGS) -L../../lib -lamd -lsuitesparseconfig $(LDLIBS) + +library: + ( cd ../../SuiteSparse_config ; $(MAKE) ) + ( cd ../Lib ; $(MAKE) ) + +f77lib: + ( cd ../Lib ; $(MAKE) fortran ) + +#------------------------------------------------------------------------------ +# Create the demo program, run it, and compare the output +#------------------------------------------------------------------------------ + +dist: + +amd_demo: amd_demo.c library + $(C) -o amd_demo amd_demo.c $(LIB2) + ./amd_demo > my_amd_demo.out + - diff amd_demo.out my_amd_demo.out + +amd_l_demo: amd_l_demo.c library + $(C) -o amd_l_demo amd_l_demo.c $(LIB2) + ./amd_l_demo > my_amd_l_demo.out + - diff amd_l_demo.out my_amd_l_demo.out + +amd_demo2: amd_demo2.c library + $(C) -o amd_demo2 amd_demo2.c $(LIB2) + ./amd_demo2 > my_amd_demo2.out + - diff amd_demo2.out my_amd_demo2.out + +amd_simple: amd_simple.c library + echo $(LD_LIBRARY_PATH) + $(C) -o amd_simple amd_simple.c $(LIB2) + ./amd_simple > my_amd_simple.out + - diff amd_simple.out my_amd_simple.out + +#------------------------------------------------------------------------------ +# compile the Fortran demo +#------------------------------------------------------------------------------ + +fortran: amd_f77demo amd_f77simple + +cross: amd_f77cross + +amd_f77demo: amd_f77demo.f f77lib + $(F77) $(F77FLAGS) -o amd_f77demo amd_f77demo.f ../Lib/libamdf77.a \ + $(F77LIB) + ./amd_f77demo > my_amd_f77demo.out + - diff amd_f77demo.out my_amd_f77demo.out + +amd_f77simple: amd_f77simple.f f77lib + $(F77) $(F77FLAGS) -o amd_f77simple amd_f77simple.f \ + ../Lib/libamdf77.a $(F77LIB) + ./amd_f77simple > my_amd_f77simple.out + - diff amd_f77simple.out my_amd_f77simple.out + +amd_f77wrapper.o: amd_f77wrapper.c + $(C) -DDINT -c amd_f77wrapper.c + +amd_f77cross: amd_f77cross.f amd_f77wrapper.o ../Lib/libamd.a + $(F77) $(F77FLAGS) -o amd_f77cross amd_f77cross.f amd_f77wrapper.o \ + ../Lib/libamd.a $(F77LIB) + ./amd_f77cross > my_amd_f77cross.out + - diff amd_f77cross.out my_amd_f77cross.out + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +clean: + - $(RM) -r $(CLEAN) + +purge: distclean + +distclean: clean + - $(RM) amd_demo my_amd_demo.out + - $(RM) amd_l_demo my_amd_l_demo.out + - $(RM) amd_demo2 my_amd_demo2.out + - $(RM) amd_simple my_amd_simple.out + - $(RM) amd_f77demo my_amd_f77demo.out + - $(RM) amd_f77simple my_amd_f77simple.out + - $(RM) amd_f77cross my_amd_f77cross.out + - $(RM) -r $(PURGE) + diff --git a/external/amd/Demo/amd_demo.c b/external/amd/Demo/amd_demo.c new file mode 100644 index 00000000..70d90070 --- /dev/null +++ b/external/amd/Demo/amd_demo.c @@ -0,0 +1,177 @@ +/* ========================================================================= */ +/* === AMD demo main program =============================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Copyright (c) by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* DrTimothyAldenDavis@gmail.com, http://www.suitesparse.com */ +/* ------------------------------------------------------------------------- */ + +/* A simple C main program that illustrates the use of the ANSI C interface + * to AMD. + */ + +#include "amd.h" +#include +#include + +int main (void) +{ + /* The symmetric can_24 Harwell/Boeing matrix, including upper and lower + * triangular parts, and the diagonal entries. Note that this matrix is + * 0-based, with row and column indices in the range 0 to n-1. */ + int n = 24, nz, + Ap [ ] = { 0, 9, 15, 21, 27, 33, 39, 48, 57, 61, 70, 76, 82, 88, 94, 100, + 106, 110, 119, 128, 137, 143, 152, 156, 160 }, + Ai [ ] = { + /* column 0: */ 0, 5, 6, 12, 13, 17, 18, 19, 21, + /* column 1: */ 1, 8, 9, 13, 14, 17, + /* column 2: */ 2, 6, 11, 20, 21, 22, + /* column 3: */ 3, 7, 10, 15, 18, 19, + /* column 4: */ 4, 7, 9, 14, 15, 16, + /* column 5: */ 0, 5, 6, 12, 13, 17, + /* column 6: */ 0, 2, 5, 6, 11, 12, 19, 21, 23, + /* column 7: */ 3, 4, 7, 9, 14, 15, 16, 17, 18, + /* column 8: */ 1, 8, 9, 14, + /* column 9: */ 1, 4, 7, 8, 9, 13, 14, 17, 18, + /* column 10: */ 3, 10, 18, 19, 20, 21, + /* column 11: */ 2, 6, 11, 12, 21, 23, + /* column 12: */ 0, 5, 6, 11, 12, 23, + /* column 13: */ 0, 1, 5, 9, 13, 17, + /* column 14: */ 1, 4, 7, 8, 9, 14, + /* column 15: */ 3, 4, 7, 15, 16, 18, + /* column 16: */ 4, 7, 15, 16, + /* column 17: */ 0, 1, 5, 7, 9, 13, 17, 18, 19, + /* column 18: */ 0, 3, 7, 9, 10, 15, 17, 18, 19, + /* column 19: */ 0, 3, 6, 10, 17, 18, 19, 20, 21, + /* column 20: */ 2, 10, 19, 20, 21, 22, + /* column 21: */ 0, 2, 6, 10, 11, 19, 20, 21, 22, + /* column 22: */ 2, 20, 21, 22, + /* column 23: */ 6, 11, 12, 23 } ; + + int P [24], Pinv [24], i, j, k, jnew, p, inew, result ; + double Control [AMD_CONTROL], Info [AMD_INFO] ; + char A [24][24] ; + + /* here is an example of how to use AMD_VERSION. This code will work in + * any version of AMD. */ +#if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE(1,2)) + printf ("AMD version %d.%d.%d, date: %s\n", + AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE) ; +#else + printf ("AMD version: 1.1 or earlier\n") ; +#endif + + printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ; + + /* get the default parameters, and print them */ + amd_defaults (Control) ; + amd_control (Control) ; + + /* print the input matrix */ + nz = Ap [n] ; + printf ("\nInput matrix: %d-by-%d, with %d entries.\n" + " Note that for a symmetric matrix such as this one, only the\n" + " strictly lower or upper triangular parts would need to be\n" + " passed to AMD, since AMD computes the ordering of A+A'. The\n" + " diagonal entries are also not needed, since AMD ignores them.\n" + , n, n, nz) ; + for (j = 0 ; j < n ; j++) + { + printf ("\nColumn: %d, number of entries: %d, with row indices in" + " Ai [%d ... %d]:\n row indices:", + j, Ap [j+1] - Ap [j], Ap [j], Ap [j+1]-1) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + printf (" %d", i) ; + } + printf ("\n") ; + } + + /* print a character plot of the input matrix. This is only reasonable + * because the matrix is small. */ + printf ("\nPlot of input matrix pattern:\n") ; + for (j = 0 ; j < n ; j++) + { + for (i = 0 ; i < n ; i++) A [i][j] = '.' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + A [i][j] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2d: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + /* order the matrix */ + result = amd_order (n, Ap, Ai, P, Control, Info) ; + printf ("return value from amd_order: %d (should be %d)\n", + result, AMD_OK) ; + + /* print the statistics */ + amd_info (Info) ; + + if (result != AMD_OK) + { + printf ("AMD failed\n") ; + exit (1) ; + } + + /* print the permutation vector, P, and compute the inverse permutation */ + printf ("Permutation vector:\n") ; + for (k = 0 ; k < n ; k++) + { + /* row/column j is the kth row/column in the permuted matrix */ + j = P [k] ; + Pinv [j] = k ; + printf (" %2d", j) ; + } + printf ("\n\n") ; + + printf ("Inverse permutation vector:\n") ; + for (j = 0 ; j < n ; j++) + { + k = Pinv [j] ; + printf (" %2d", k) ; + } + printf ("\n\n") ; + + /* print a character plot of the permuted matrix. */ + printf ("\nPlot of permuted matrix pattern:\n") ; + for (jnew = 0 ; jnew < n ; jnew++) + { + j = P [jnew] ; + for (inew = 0 ; inew < n ; inew++) A [inew][jnew] = '.' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + inew = Pinv [Ai [p]] ; + A [inew][jnew] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2d: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + return (0) ; +} diff --git a/external/amd/Demo/amd_demo2.c b/external/amd/Demo/amd_demo2.c new file mode 100644 index 00000000..68c1e9e8 --- /dev/null +++ b/external/amd/Demo/amd_demo2.c @@ -0,0 +1,208 @@ +/* ========================================================================= */ +/* === AMD demo main program (jumbled matrix version) ====================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Copyright (c) by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* DrTimothyAldenDavis@gmail.com, http://www.suitesparse.com */ +/* ------------------------------------------------------------------------- */ + +/* A simple C main program that illustrates the use of the ANSI C interface + * to AMD. + * + * Identical to amd_demo.c, except that it operates on an input matrix that has + * unsorted columns and duplicate entries. + */ + +#include "amd.h" +#include +#include + +int main (void) +{ + /* The symmetric can_24 Harwell/Boeing matrix (jumbled, and not symmetric). + * Since AMD operates on A+A', only A(i,j) or A(j,i) need to be specified, + * or both. The diagonal entries are optional (some are missing). + * There are many duplicate entries, which must be removed. */ + int n = 24, nz, + Ap [ ] = { 0, 9, 14, 20, 28, 33, 37, 44, 53, 58, 63, 63, 66, 69, 72, 75, + 78, 82, 86, 91, 97, 101, 112, 112, 116 }, + Ai [ ] = { + /* column 0: */ 0, 17, 18, 21, 5, 12, 5, 0, 13, + /* column 1: */ 14, 1, 8, 13, 17, + /* column 2: */ 2, 20, 11, 6, 11, 22, + /* column 3: */ 3, 3, 10, 7, 18, 18, 15, 19, + /* column 4: */ 7, 9, 15, 14, 16, + /* column 5: */ 5, 13, 6, 17, + /* column 6: */ 5, 0, 11, 6, 12, 6, 23, + /* column 7: */ 3, 4, 9, 7, 14, 16, 15, 17, 18, + /* column 8: */ 1, 9, 14, 14, 14, + /* column 9: */ 7, 13, 8, 1, 17, + /* column 10: */ + /* column 11: */ 2, 12, 23, + /* column 12: */ 5, 11, 12, + /* column 13: */ 0, 13, 17, + /* column 14: */ 1, 9, 14, + /* column 15: */ 3, 15, 16, + /* column 16: */ 16, 4, 4, 15, + /* column 17: */ 13, 17, 19, 17, + /* column 18: */ 15, 17, 19, 9, 10, + /* column 19: */ 17, 19, 20, 0, 6, 10, + /* column 20: */ 22, 10, 20, 21, + /* column 21: */ 6, 2, 10, 19, 20, 11, 21, 22, 22, 22, 22, + /* column 22: */ + /* column 23: */ 12, 11, 12, 23 } ; + + int P [24], Pinv [24], i, j, k, jnew, p, inew, result ; + double Control [AMD_CONTROL], Info [AMD_INFO] ; + char A [24][24] ; + + printf ("AMD demo, with a jumbled version of the 24-by-24\n") ; + printf ("Harwell/Boeing matrix, can_24:\n") ; + + /* get the default parameters, and print them */ + amd_defaults (Control) ; + amd_control (Control) ; + + /* print the input matrix */ + nz = Ap [n] ; + printf ("\nJumbled input matrix: %d-by-%d, with %d entries.\n" + " Note that for a symmetric matrix such as this one, only the\n" + " strictly lower or upper triangular parts would need to be\n" + " passed to AMD, since AMD computes the ordering of A+A'. The\n" + " diagonal entries are also not needed, since AMD ignores them.\n" + " This version of the matrix has jumbled columns and duplicate\n" + " row indices.\n", n, n, nz) ; + for (j = 0 ; j < n ; j++) + { + printf ("\nColumn: %d, number of entries: %d, with row indices in" + " Ai [%d ... %d]:\n row indices:", + j, Ap [j+1] - Ap [j], Ap [j], Ap [j+1]-1) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + printf (" %d", i) ; + } + printf ("\n") ; + } + + /* print a character plot of the input matrix. This is only reasonable + * because the matrix is small. */ + printf ("\nPlot of (jumbled) input matrix pattern:\n") ; + for (j = 0 ; j < n ; j++) + { + for (i = 0 ; i < n ; i++) A [i][j] = '.' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + A [i][j] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2d: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + /* print a character plot of the matrix A+A'. */ + printf ("\nPlot of symmetric matrix to be ordered by amd_order:\n") ; + for (j = 0 ; j < n ; j++) + { + for (i = 0 ; i < n ; i++) A [i][j] = '.' ; + } + for (j = 0 ; j < n ; j++) + { + A [j][j] = 'X' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + A [i][j] = 'X' ; + A [j][i] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2d: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + /* order the matrix */ + result = amd_order (n, Ap, Ai, P, Control, Info) ; + printf ("return value from amd_order: %d (should be %d)\n", + result, AMD_OK_BUT_JUMBLED) ; + + /* print the statistics */ + amd_info (Info) ; + + if (result != AMD_OK_BUT_JUMBLED) + { + printf ("AMD failed\n") ; + exit (1) ; + } + + /* print the permutation vector, P, and compute the inverse permutation */ + printf ("Permutation vector:\n") ; + for (k = 0 ; k < n ; k++) + { + /* row/column j is the kth row/column in the permuted matrix */ + j = P [k] ; + Pinv [j] = k ; + printf (" %2d", j) ; + } + printf ("\n\n") ; + + printf ("Inverse permutation vector:\n") ; + for (j = 0 ; j < n ; j++) + { + k = Pinv [j] ; + printf (" %2d", k) ; + } + printf ("\n\n") ; + + /* print a character plot of the permuted matrix. */ + printf ("\nPlot of (symmetrized) permuted matrix pattern:\n") ; + for (j = 0 ; j < n ; j++) + { + for (i = 0 ; i < n ; i++) A [i][j] = '.' ; + } + for (jnew = 0 ; jnew < n ; jnew++) + { + j = P [jnew] ; + A [jnew][jnew] = 'X' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + inew = Pinv [Ai [p]] ; + A [inew][jnew] = 'X' ; + A [jnew][inew] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1d", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2d: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + return (0) ; +} diff --git a/external/amd/Demo/amd_f77cross.f b/external/amd/Demo/amd_f77cross.f new file mode 100644 index 00000000..b79920d8 --- /dev/null +++ b/external/amd/Demo/amd_f77cross.f @@ -0,0 +1,50 @@ +C ====================================================================== +C === AMD_cross ======================================================== +C ====================================================================== + +C ---------------------------------------------------------------------- +C AMD, Copyright (c) by Timothy A. Davis, Patrick R. +C Amestoy, and Iain S. Duff. See ../README.txt for License. +C email: DrTimothyAldenDavis@gmail.com +C ---------------------------------------------------------------------- + +C This program provides an example of how to call the C version of AMD +C from a Fortran program. It is HIGHLY non-portable. + +C The amd_order routine returns PERM (1) < 0 if an error occurs. +C (-1: out of memory, -2: invalid matrix) + +C Note that the input matrix is 0-based. From Fortran, column j of the +C matrix is in AI (AP (I)+1 ... AP (I+1)). The row indices in this +C set are in the range 0 to N-1. To demonstrate this translation, +C the input matrix is printed in 1-based form. This program uses +C the same 5-by-5 test matrix as amd_simple.c. + + INTEGER N, NZ, K, P + PARAMETER (N = 5, NZ = 14) + INTEGER AP (N+1), AI (NZ), PERM (N) + DATA AP / 0, 2, 6, 10, 12, 14 / + DATA AI / 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4 / + DOUBLE PRECISION CONTROL (5), INFO (20) + +C print the input matrix + PRINT 10, N, N, NZ +10 FORMAT ('Input matrix:', I2, '-by-', I2, ' with',I3,' entries') + DO 40 J = 1, N + PRINT 20, J, AP (J+1) - AP (J), AP (J)+1, AP (J+1) +20 FORMAT ( /, 'Column: ', I2, ' number of entries: ', I2, + $ ' with row indices in AI (', I3, ' ... ', I3, ')') + PRINT 30, ((AI (P) + 1), P = AP (J) + 1, AP (J+1)) +30 FORMAT (' row indices: ', 24I3) +40 CONTINUE + + CALL AMDDEFAULTS (CONTROL) + CALL AMDORDER (N, AP, AI, PERM, CONTROL, INFO) + CALL AMDINFO (INFO) + + DO 60 K = 1, N + PRINT 50, K, PERM (K) + 1 +50 FORMAT ('PERM (',I2,') = ', I2) +60 CONTINUE + END + diff --git a/external/amd/Demo/amd_f77demo.f b/external/amd/Demo/amd_f77demo.f new file mode 100644 index 00000000..6aa6296a --- /dev/null +++ b/external/amd/Demo/amd_f77demo.f @@ -0,0 +1,160 @@ +C ====================================================================== +C === Fortran AMD demo main program ==================================== +C ====================================================================== + +C ---------------------------------------------------------------------- +C AMD, Copyright (c) by Timothy A. Davis, Patrick R. +C Amestoy, and Iain S. Duff. See ../README.txt for License. +C email: DrTimothyAldenDavis@gmail.com +C ---------------------------------------------------------------------- + +C A simple Fortran 77 main program that illustrates the use of the +C Fortran version of AMD (both the AMD and AMDBAR routines). Note +C that aggressive absorption has no effect on this particular matrix. + +C AP and AI contain the symmetric can_24 Harwell/Boeing matrix, +C including upper and lower triangular parts, but excluding the +C diagonal entries. Note that this matrix is 1-based, with row +C and column indices in the range 1 to N. + + INTEGER N, NZ, IWLEN, PFREE, I, J, K, JNEW, P, INEW, + $ METHOD, NCMPA + PARAMETER (N = 24, NZ = 136, IWLEN = 200) + INTEGER PE (N), DEGREE (N), NV (N), NEXT (N), PERM (N), W (N), + $ HEAD (N), PINV (N), LEN (N), AP (N+1), AI (NZ), IW (IWLEN) + CHARACTER A (24,24) + + DATA AP + $ / 1, 9, 14, 19, 24, 29, 34, 42, 50, 53, 61, 66, 71, + $ 76, 81, 86, 91, 94, 102, 110, 118, 123, 131, 134, 137 / + DATA AI / + $ 6, 7, 13, 14, 18, 19, 20, 22, + $ 9, 10, 14, 15, 18, + $ 7, 12, 21, 22, 23, + $ 8, 11, 16, 19, 20, + $ 8, 10, 15, 16, 17, + $ 1, 7, 13, 14, 18, + $ 1, 3, 6, 12, 13, 20, 22, 24, + $ 4, 5, 10, 15, 16, 17, 18, 19, + $ 2, 10, 15, + $ 2, 5, 8, 9, 14, 15, 18, 19, + $ 4, 19, 20, 21, 22, + $ 3, 7, 13, 22, 24, + $ 1, 6, 7, 12, 24, + $ 1, 2, 6, 10, 18, + $ 2, 5, 8, 9, 10, + $ 4, 5, 8, 17, 19, + $ 5, 8, 16, + $ 1, 2, 6, 8, 10, 14, 19, 20, + $ 1, 4, 8, 10, 11, 16, 18, 20, + $ 1, 4, 7, 11, 18, 19, 21, 22, + $ 3, 11, 20, 22, 23, + $ 1, 3, 7, 11, 12, 20, 21, 23, + $ 3, 21, 22, + $ 7, 12, 13 / + +C print the input matrix + PRINT 11, N, N, NZ +11 FORMAT ('AMD Fortran 77 demo, with the 24-by-24', + $ ' Harwell/Boeing matrix, can_24:' + $ /, 'Input matrix: ', I2, '-by-', I2,' with ',I3,' entries', + $ /, 'Note that the Fortran version of AMD requires that' + $ /, 'no diagonal entries be present.') + DO 20 J = 1, N + PRINT 21, J, AP (J+1) - AP (J), AP (J), AP (J+1)-1 +21 FORMAT ( /, 'Column: ', I2, ' number of entries: ', I2, + $ ' with row indices in AI (', I3, ' ... ', I3, ')') + PRINT 10, ((AI (P)), P = AP (J), AP (J+1) - 1) +10 FORMAT (' row indices: ', 24I3) +20 CONTINUE + +C print a character plot of the input matrix. This is only +C reasonable because the matrix is small. + PRINT 31 +31 FORMAT ('Plot of input matrix pattern:') + DO 50 J = 1,N + DO 30 I = 1,N + A (I, J) = '.' +30 CONTINUE +C add the diagonal entry to the plot + A (J, J) = 'X' + DO 40 P = AP (J), AP (J+1) - 1 + I = AI (P) + A (I, J) = 'X' +40 CONTINUE +50 CONTINUE + PRINT 60, ((MOD (J, 10)), J = 1,N) +60 FORMAT (' ', 24I2) + DO 80 I = 1,N + PRINT 70, I, (A (I, J), J = 1,N) +70 FORMAT (' ', I2, ': ', 24A2) +80 CONTINUE + + DO 190 METHOD = 1,2 + +C load the matrix into AMD's workspace + DO 90 J = 1,N + PE (J) = AP (J) + LEN (J) = AP (J+1) - AP (J) +90 CONTINUE + DO 100 P = 1,NZ + IW (P) = AI (P) +100 CONTINUE + PFREE = NZ + 1 + +C order the matrix using AMD or AMDBAR + IF (METHOD .EQ. 1) THEN + PRINT 101 +101 FORMAT (/, '------------------------------------------', + $ /, 'ordering the matrix with AMD', + $ /, '------------------------------------------') + CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, + $ PERM, HEAD, PINV, DEGREE, NCMPA, W) + ELSE + PRINT 102 +102 FORMAT (/, '------------------------------------------', + $ /, 'ordering the matrix with AMDBAR', + $ /, '------------------------------------------') + CALL AMDBAR (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, + $ PERM, HEAD, PINV, DEGREE, NCMPA, W) + ENDIF + +C print the permutation vector, PERM, and its inverse, PINV. +C row/column J = PERM (K) is the Kth row/column in the +C permuted matrix. + PRINT 110, (PERM (K), K = 1,N) +110 FORMAT (/, 'Permutation vector: ', /, 24I3) + PRINT 120, (PINV (J), J = 1,N) +120 FORMAT (/, 'Inverse permutation vector: ', /, 24I3) + +C print a character plot of the permuted matrix. + PRINT 121 +121 FORMAT ('Plot of permuted matrix pattern:') + DO 150 JNEW = 1,N + J = PERM (JNEW) + DO 130 INEW = 1,N + A (INEW, JNEW) = '.' +130 CONTINUE +C add the diagonal entry to the plot + A (JNEW, JNEW) = 'X' + DO 140 P = AP (J), AP (J+1) - 1 + INEW = PINV (AI (P)) + A (INEW, JNEW) = 'X' +140 CONTINUE +150 CONTINUE + PRINT 60, ((MOD (J, 10)), J = 1,N) + DO 160 I = 1,N + PRINT 70, I, (A (I, J), J = 1,N) +160 CONTINUE + +C print the permuted matrix, PERM*A*PERM' + DO 180 JNEW = 1,N + J = PERM (JNEW) + PRINT 171, JNEW, J, AP (J+1) - AP (J) +171 FORMAT (/, 'New column: ', I2, ' old column: ', I2, + $ ' number of entries: ', I2) + PRINT 170, (PINV (AI (P)), P = AP (J), AP (J+1) - 1) +170 FORMAT (' new row indices: ', 24I3) +180 CONTINUE +190 CONTINUE + END diff --git a/external/amd/Demo/amd_f77simple.f b/external/amd/Demo/amd_f77simple.f new file mode 100644 index 00000000..8f39606e --- /dev/null +++ b/external/amd/Demo/amd_f77simple.f @@ -0,0 +1,37 @@ +C ---------------------------------------------------------------------- +C AMD, Copyright (c) by Timothy A. Davis, Patrick R. +C Amestoy, and Iain S. Duff. See ../README.txt for License. +C email: DrTimothyAldenDavis@gmail.com +C ---------------------------------------------------------------------- + +C This program provides an example of how to call the Fortran version +C of AMD. It uses the same matrix as the amd_simple.c demo (in C). +C Note that the diagonal entries are not present, and the matrix is +C symmetric. + + INTEGER N, NZ, J, K, P, IWLEN, PFREE, NCMPA + PARAMETER (N = 5, NZ = 10, IWLEN = 17) + INTEGER AP (N+1), AI (NZ), LAST (N), PE (N), LEN (N), ELEN (N), + $ IW (IWLEN), DEGREE (N), NV (N), NEXT (N), HEAD (N), W (N) + DATA AP / 1, 2, 5, 8, 9, 11/ + DATA AI / 2, 1,3,5, 2,4,5, 3, 2,3 / + +C load the matrix into the AMD workspace + DO 10 J = 1,N + PE (J) = AP (J) + LEN (J) = AP (J+1) - AP (J) +10 CONTINUE + DO 20 P = 1,NZ + IW (P) = AI (P) +20 CONTINUE + PFREE = NZ + 1 + +C order the matrix (destroys the copy of A in IW, PE, and LEN) + CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, LAST, HEAD, + $ ELEN, DEGREE, NCMPA, W) + + DO 60 K = 1, N + PRINT 50, K, LAST (K) +50 FORMAT ('P (',I2,') = ', I2) +60 CONTINUE + END diff --git a/external/amd/Demo/amd_f77wrapper.c b/external/amd/Demo/amd_f77wrapper.c new file mode 100644 index 00000000..d918845a --- /dev/null +++ b/external/amd/Demo/amd_f77wrapper.c @@ -0,0 +1,87 @@ +/* ========================================================================= */ +/* === amd_f77wrapper ====================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Copyright (c) by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* Fortran interface for the C-callable AMD library (int version only). This + * is HIGHLY non-portable. You will need to modify this depending on how your + * Fortran and C compilers behave. Two examples are provided. + * + * To avoid using I/O, and to avoid the extra porting step of a Fortran + * function, the status code is returned as the first entry in P (P [0] in C + * and P (1) in Fortran) if an error occurs. The error codes are negative + * (-1: out of memory, -2: invalid matrix). + * + * For some C and Fortran compilers, the Fortran compiler appends a single "_" + * after each routine name. C doesn't do this, so the translation is made + * here. Some Fortran compilers don't append an underscore (xlf on IBM AIX, + * for * example). + */ + +#include "amd.h" +#include + +/* ------------------------------------------------------------------------- */ +/* Linux, Solaris, SGI */ +/* ------------------------------------------------------------------------- */ + +void amdorder_ (int *n, const int *Ap, const int *Ai, int *P, + double *Control, double *Info) +{ + int result = amd_order (*n, Ap, Ai, P, Control, Info) ; + if (result != AMD_OK && P) P [0] = result ; +} + +void amddefaults_ (double *Control) +{ + amd_defaults (Control) ; +} + +void amdcontrol_ (double *Control) +{ + fflush (stdout) ; + amd_control (Control) ; + fflush (stdout) ; +} + +void amdinfo_ (double *Info) +{ + fflush (stdout) ; + amd_info (Info) ; + fflush (stdout) ; +} + +/* ------------------------------------------------------------------------- */ +/* IBM AIX. Probably Windows, Compaq Alpha, and HP Unix as well. */ +/* ------------------------------------------------------------------------- */ + +void amdorder (int *n, const int *Ap, const int *Ai, int *P, + double *Control, double *Info) +{ + int result = amd_order (*n, Ap, Ai, P, Control, Info) ; + if (result != AMD_OK && P) P [0] = result ; +} + +void amddefaults (double *Control) +{ + amd_defaults (Control) ; +} + +void amdcontrol (double *Control) +{ + fflush (stdout) ; + amd_control (Control) ; + fflush (stdout) ; +} + +void amdinfo (double *Info) +{ + fflush (stdout) ; + amd_info (Info) ; + fflush (stdout) ; +} diff --git a/external/amd/Demo/amd_l_demo.c b/external/amd/Demo/amd_l_demo.c new file mode 100644 index 00000000..62a05913 --- /dev/null +++ b/external/amd/Demo/amd_l_demo.c @@ -0,0 +1,178 @@ +/* ========================================================================= */ +/* === AMD demo main program (long integer version) ======================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD Copyright (c) by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* A simple C main program that illustrates the use of the ANSI C interface + * to AMD. + */ + +#include "amd.h" +#include +#include +#define Long SuiteSparse_long + +int main (void) +{ + /* The symmetric can_24 Harwell/Boeing matrix, including upper and lower + * triangular parts, and the diagonal entries. Note that this matrix is + * 0-based, with row and column indices in the range 0 to n-1. */ + Long n = 24, nz, + Ap [ ] = { 0, 9, 15, 21, 27, 33, 39, 48, 57, 61, 70, 76, 82, 88, 94, 100, + 106, 110, 119, 128, 137, 143, 152, 156, 160 }, + Ai [ ] = { + /* column 0: */ 0, 5, 6, 12, 13, 17, 18, 19, 21, + /* column 1: */ 1, 8, 9, 13, 14, 17, + /* column 2: */ 2, 6, 11, 20, 21, 22, + /* column 3: */ 3, 7, 10, 15, 18, 19, + /* column 4: */ 4, 7, 9, 14, 15, 16, + /* column 5: */ 0, 5, 6, 12, 13, 17, + /* column 6: */ 0, 2, 5, 6, 11, 12, 19, 21, 23, + /* column 7: */ 3, 4, 7, 9, 14, 15, 16, 17, 18, + /* column 8: */ 1, 8, 9, 14, + /* column 9: */ 1, 4, 7, 8, 9, 13, 14, 17, 18, + /* column 10: */ 3, 10, 18, 19, 20, 21, + /* column 11: */ 2, 6, 11, 12, 21, 23, + /* column 12: */ 0, 5, 6, 11, 12, 23, + /* column 13: */ 0, 1, 5, 9, 13, 17, + /* column 14: */ 1, 4, 7, 8, 9, 14, + /* column 15: */ 3, 4, 7, 15, 16, 18, + /* column 16: */ 4, 7, 15, 16, + /* column 17: */ 0, 1, 5, 7, 9, 13, 17, 18, 19, + /* column 18: */ 0, 3, 7, 9, 10, 15, 17, 18, 19, + /* column 19: */ 0, 3, 6, 10, 17, 18, 19, 20, 21, + /* column 20: */ 2, 10, 19, 20, 21, 22, + /* column 21: */ 0, 2, 6, 10, 11, 19, 20, 21, 22, + /* column 22: */ 2, 20, 21, 22, + /* column 23: */ 6, 11, 12, 23 } ; + + Long P [24], Pinv [24], i, j, k, jnew, p, inew, result ; + double Control [AMD_CONTROL], Info [AMD_INFO] ; + char A [24][24] ; + + /* here is an example of how to use AMD_VERSION. This code will work in + * any version of AMD. */ +#if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE(1,2)) + printf ("AMD version %d.%d.%d, date: %s\n", + AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE) ; +#else + printf ("AMD version: 1.1 or earlier\n") ; +#endif + + printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ; + + /* get the default parameters, and print them */ + amd_l_defaults (Control) ; + amd_l_control (Control) ; + + /* print the input matrix */ + nz = Ap [n] ; + printf ("\nInput matrix: %ld-by-%ld, with %ld entries.\n" + " Note that for a symmetric matrix such as this one, only the\n" + " strictly lower or upper triangular parts would need to be\n" + " passed to AMD, since AMD computes the ordering of A+A'. The\n" + " diagonal entries are also not needed, since AMD ignores them.\n" + , n, n, nz) ; + for (j = 0 ; j < n ; j++) + { + printf ("\nColumn: %ld, number of entries: %ld, with row indices in" + " Ai [%ld ... %ld]:\n row indices:", + j, Ap [j+1] - Ap [j], Ap [j], Ap [j+1]-1) ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + printf (" %ld", i) ; + } + printf ("\n") ; + } + + /* print a character plot of the input matrix. This is only reasonable + * because the matrix is small. */ + printf ("\nPlot of input matrix pattern:\n") ; + for (j = 0 ; j < n ; j++) + { + for (i = 0 ; i < n ; i++) A [i][j] = '.' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + i = Ai [p] ; + A [i][j] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1ld", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2ld: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + /* order the matrix */ + result = amd_l_order (n, Ap, Ai, P, Control, Info) ; + printf ("return value from amd_l_order: %ld (should be %d)\n", + result, AMD_OK) ; + + /* print the statistics */ + amd_l_info (Info) ; + + if (result != AMD_OK) + { + printf ("AMD failed\n") ; + exit (1) ; + } + + /* print the permutation vector, P, and compute the inverse permutation */ + printf ("Permutation vector:\n") ; + for (k = 0 ; k < n ; k++) + { + /* row/column j is the kth row/column in the permuted matrix */ + j = P [k] ; + Pinv [j] = k ; + printf (" %2ld", j) ; + } + printf ("\n\n") ; + + printf ("Inverse permutation vector:\n") ; + for (j = 0 ; j < n ; j++) + { + k = Pinv [j] ; + printf (" %2ld", k) ; + } + printf ("\n\n") ; + + /* print a character plot of the permuted matrix. */ + printf ("\nPlot of permuted matrix pattern:\n") ; + for (jnew = 0 ; jnew < n ; jnew++) + { + j = P [jnew] ; + for (inew = 0 ; inew < n ; inew++) A [inew][jnew] = '.' ; + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + inew = Pinv [Ai [p]] ; + A [inew][jnew] = 'X' ; + } + } + printf (" ") ; + for (j = 0 ; j < n ; j++) printf (" %1ld", j % 10) ; + printf ("\n") ; + for (i = 0 ; i < n ; i++) + { + printf ("%2ld: ", i) ; + for (j = 0 ; j < n ; j++) + { + printf (" %c", A [i][j]) ; + } + printf ("\n") ; + } + + return (0) ; +} diff --git a/external/amd/Demo/amd_simple.c b/external/amd/Demo/amd_simple.c new file mode 100644 index 00000000..5241fb15 --- /dev/null +++ b/external/amd/Demo/amd_simple.c @@ -0,0 +1,22 @@ +/* ------------------------------------------------------------------------- */ +/* AMD Copyright (c) by Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +#include +#include "amd.h" + +int n = 5 ; +int Ap [ ] = { 0, 2, 6, 10, 12, 14} ; +int Ai [ ] = { 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4 } ; +int P [5] ; + +int main (void) +{ + int k ; + (void) amd_order (n, Ap, Ai, P, (double *) NULL, (double *) NULL) ; + for (k = 0 ; k < n ; k++) printf ("P [%d] = %d\n", k, P [k]) ; + return (0) ; +} + diff --git a/external/amd/Doc/AMD_UserGuide.bib b/external/amd/Doc/AMD_UserGuide.bib new file mode 100644 index 00000000..03fbfa8f --- /dev/null +++ b/external/amd/Doc/AMD_UserGuide.bib @@ -0,0 +1,98 @@ +@string{SIREV = "{SIAM} Review"} +@string{SIMAX = "{SIAM} J. Matrix Anal. Applic."} +@string{SIAMJSC = "{SIAM} J. Sci. Comput."} +@string{TOMS = "{ACM} Trans. Math. Softw."} + +@article{schu:01, + author = {J. Schulze}, + title = {Towards a tighter coupling of bottom-up and top-down sparse matrix ordering methods}, + journal = {BIT}, + volume = {41}, + number = {4}, + pages = "800--841", + year = {2001} + } + +@article{GeorgeLiu89, + author={George, A. and Liu, J. W. H.}, + year={1989}, + title={The Evolution of the Minimum Degree Ordering Algorithm}, + journal=SIREV, + volume={31}, + number={1}, + pages={1--19}} + +@article{AmestoyDavisDuff96, + author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.}, + title={An approximate minimum degree ordering algorithm}, + journal=SIMAX, + year={1996} + ,volume={17} + ,number={4} + ,pages={886-905} + } + +@article{AmestoyDavisDuff04, + author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.}, + title={Algorithm 837: An approximate minimum degree ordering algorithm}, + journal=TOMS, + year={2004} + ,volume={30} + ,number={3} + ,pages={381-388} + } + +@misc{hsl:2002, + author = {HSL}, + title = "{HSL} 2002: {A} collection of {F}ortran codes for large + scale scientific computation", + note = {{\tt www.cse.clrc.ac.uk/nag/hsl}}, + year = 2002} + + +@article{RothbergEisenstat98, + author={Rothberg, E. and Eisenstat, S. C.}, + title={Node selection strategies for bottom-up sparse matrix orderings}, + journal=SIMAX, + year={1998} + ,volume={19} + ,number={3} + ,pages={682-695} + } + +@article{KarypisKumar98e, + author={Karypis, G. and Kumar, V.}, + title={A fast and high quality multilevel scheme for partitioning irregular graphs}, + journal=SIAMJSC, + year={1998} + ,volume={20} + ,pages={359-392} + } + +@article{Chaco, + author={B. Hendrickson and E. Rothberg}, + title={Improving the runtime and quality of nested dissection ordering}, + journal=SIAMJSC, + year={1999} + ,volume={20} + ,pages={468--489} + } + +@article{PellegriniRomanAmestoy00, + author={Pellegrini, F. and Roman, J. and Amestoy, P.}, + title={Hybridizing nested dissection and halo approximate minimum degree for efficient sparse matrix ordering}, + journal={Concurrency: Practice and Experience}, + year={2000} + ,volume={12} + ,pages={68-84} + } + +@article{DavisGilbertLarimoreNg04, + author={Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.}, + title={A column approximate minimum degree ordering algorithm}, + journal=TOMS, + year={2004} + ,volume={30} + ,pages={353-376} + } + diff --git a/external/amd/Doc/AMD_UserGuide.pdf b/external/amd/Doc/AMD_UserGuide.pdf new file mode 100644 index 00000000..a0e7a6c6 Binary files /dev/null and b/external/amd/Doc/AMD_UserGuide.pdf differ diff --git a/external/amd/Doc/AMD_UserGuide.tex b/external/amd/Doc/AMD_UserGuide.tex new file mode 100644 index 00000000..862ad69c --- /dev/null +++ b/external/amd/Doc/AMD_UserGuide.tex @@ -0,0 +1,769 @@ +\documentclass[11pt]{article} + +\newcommand{\m}[1]{{\bf{#1}}} % for matrices and vectors +\newcommand{\tr}{^{\sf T}} % transpose + +\topmargin 0in +\textheight 9in +\oddsidemargin 0pt +\evensidemargin 0pt +\textwidth 6.5in + +%------------------------------------------------------------------------------ +\begin{document} +%------------------------------------------------------------------------------ + +\title{AMD User Guide} +\author{Patrick R. Amestoy\thanks{ENSEEIHT-IRIT, +2 rue Camichel 31017 Toulouse, France. +email: amestoy@enseeiht.fr. http://www.enseeiht.fr/$\sim$amestoy.} +\and Timothy A. Davis\thanks{ +email: DrTimothyAldenDavis@gmail.com, +http://www.suitesparse.com. +This work was supported by the National +Science Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270. +Portions of the work were done while on sabbatical at Stanford University +and Lawrence Berkeley National Laboratory (with funding from Stanford +University and the SciDAC program). +} +\and Iain S. Duff\thanks{Rutherford Appleton Laboratory, Chilton, Didcot, +Oxon OX11 0QX, England. email: i.s.duff@rl.ac.uk. +http://www.numerical.rl.ac.uk/people/isd/isd.html. +This work was supported by the EPSRC under grant GR/R46441. +}} + +\date{VERSION 2.4.6, May 4, 2016} +\maketitle + +%------------------------------------------------------------------------------ +\begin{abstract} +AMD is a set of routines that implements the approximate minimum degree ordering +algorithm to permute sparse matrices prior to +numerical factorization. +There are versions written in both C and Fortran 77. +A MATLAB interface is included. +\end{abstract} +%------------------------------------------------------------------------------ + +AMD Copyright\copyright 2013 by Timothy A. +Davis, Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. +AMD is available under alternate licences; contact T. Davis for details. + +{\bf AMD License:} Refer to the AMD/Doc/License.txt file for the license +for your particular copy of AMD. + +{\bf Availability:} + http://www.suitesparse.com + +{\bf Acknowledgments:} + + This work was supported by the National Science Foundation, under + grants ASC-9111263 and DMS-9223088 and CCR-0203270. + The conversion to C, the addition of the elimination tree + post-ordering, and the handling of dense rows and columns + were done while Davis was on sabbatical at + Stanford University and Lawrence Berkeley National Laboratory. + +%------------------------------------------------------------------------------ +\newpage +\section{Overview} +%------------------------------------------------------------------------------ + +AMD is a set of routines for preordering a sparse matrix prior to +numerical factorization. It uses an approximate minimum degree ordering +algorithm \cite{AmestoyDavisDuff96,AmestoyDavisDuff04} +to find a permutation matrix $\m{P}$ +so that the Cholesky factorization $\m{PAP}\tr=\m{LL}\tr$ has fewer +(often much fewer) nonzero entries than the Cholesky factorization of $\m{A}$. +The algorithm is typically much faster than other ordering methods +and minimum degree ordering +algorithms that compute an exact degree \cite{GeorgeLiu89}. +Some methods, such as approximate deficiency +\cite{RothbergEisenstat98} and graph-partitioning based methods +\cite{Chaco,KarypisKumar98e,PellegriniRomanAmestoy00,schu:01} +can produce better orderings, depending on the matrix. + +The algorithm starts with an undirected graph representation of a +symmetric sparse matrix $\m{A}$. Node $i$ in the graph corresponds to row +and column $i$ of the matrix, and there is an edge $(i,j)$ in the graph if +$a_{ij}$ is nonzero. +The degree of a node is initialized to the number of off-diagonal nonzeros +in row $i$, which is the size of the set of nodes +adjacent to $i$ in the graph. + +The selection of a pivot $a_{ii}$ from the diagonal of $\m{A}$ and the first +step of Gaussian elimination corresponds to one step of graph elimination. +Numerical fill-in causes new nonzero entries in the matrix +(fill-in refers to +nonzeros in $\m{L}$ that are not in $\m{A}$). +Node $i$ is eliminated and edges are added to its neighbors +so that they form a clique (or {\em element}). To reduce fill-in, +node $i$ is selected as the node of least degree in the graph. +This process repeats until the graph is eliminated. + +The clique is represented implicitly. Rather than listing all the +new edges in the graph, a single list of nodes is kept which represents +the clique. This list corresponds to the nonzero pattern of the first +column of $\m{L}$. As the elimination proceeds, some of these cliques +become subsets of subsequent cliques, and are removed. This graph +can be stored in place, that is +using the same amount of memory as the original graph. + +The most costly part of the minimum degree algorithm is the recomputation +of the degrees of nodes adjacent to the current pivot element. +Rather than keep track of the exact degree, the approximate minimum degree +algorithm finds an upper bound on the degree that is easier to compute. +For nodes of least degree, this bound tends to be tight. Using the +approximate degree instead of the exact degree leads to a substantial savings +in run time, particularly for very irregularly structured matrices. +It has no effect on the quality of the ordering. + +In the C version of AMD, the elimination phase is followed by an +elimination tree post-ordering. This has no effect on fill-in, but +reorganizes the ordering so that the subsequent numerical factorization is +more efficient. It also includes a pre-processing phase in which nodes of +very high degree are removed (without causing fill-in), and placed last in the +permutation $\m{P}$. This reduces the run time substantially if the matrix +has a few rows with many nonzero entries, and has little effect on the quality +of the ordering. +The C version operates on the +symmetric nonzero pattern of $\m{A}+\m{A}\tr$, so it can be given +an unsymmetric matrix, or either the lower or upper triangular part of +a symmetric matrix. + +The two Fortran versions of AMD are essentially identical to two versions of +the AMD algorithm discussed in an earlier paper \cite{AmestoyDavisDuff96} +(approximate minimum external degree, both with and without aggressive +absorption). +For a discussion of the long history of the minimum degree algorithm, +see \cite{GeorgeLiu89}. + +%------------------------------------------------------------------------------ +\section{Availability} +%------------------------------------------------------------------------------ + +In addition to appearing as a Collected Algorithm of the ACM, \newline +AMD is available at http://www.suitesparse.com. +The Fortran version is available as the routine {\tt MC47} in HSL +(formerly the Harwell Subroutine Library) \cite{hsl:2002}. + +%------------------------------------------------------------------------------ +\section{Using AMD in MATLAB} +%------------------------------------------------------------------------------ + +The MATLAB function {\tt amd} is now a built-in function in MATLAB 7.3 +(R2006b). The built-in {\tt amd} and the {\tt amd2} function provided here +differ in how the optional parameters are passed +(the 2nd input parameter). + +To use AMD2 in MATLAB, you must first compile the AMD2 mexFunction. +Just type {\tt make} in the Unix system shell, while in the {\tt AMD/MATLAB} +directory. You can also type {\tt amd\_make} in MATLAB, while in the +{\tt AMD/MATLAB} directory. Place the {\tt AMD/MATLAB} directory in your +MATLAB path. This can be done on any system with MATLAB, including Windows. +See Section~\ref{Install} for more details on how to install AMD. + +The MATLAB statement {\tt p=amd(A)} finds a permutation vector {\tt p} such +that the Cholesky factorization {\tt chol(A(p,p))} is typically sparser than +{\tt chol(A)}. +If {\tt A} is unsymmetric, {\tt amd(A)} is identical to {\tt amd(A+A')} +(ignoring numerical cancellation). +If {\tt A} is not symmetric positive definite, +but has substantial diagonal entries and a mostly symmetric nonzero pattern, +then this ordering is also suitable for LU factorization. A partial pivoting +threshold may be required to prevent pivots from being selected off the +diagonal, such as the statement {\tt [L,U,P] = lu (A (p,p), 0.1)}. +Type {\tt help lu} for more details. +The statement {\tt [L,U,P,Q] = lu (A (p,p))} in MATLAB 6.5 is +not suitable, however, because it uses UMFPACK Version 4.0 and thus +does not attempt to select pivots from the diagonal. +UMFPACK Version 4.1 in MATLAB 7.0 and later +uses several strategies, including a symmetric pivoting strategy, and +will give you better results if you want to factorize an unsymmetric matrix +of this type. Refer to the UMFPACK User Guide for more details, at +http://www.suitesparse.com. + +The AMD mexFunction is much faster than the built-in MATLAB symmetric minimum +degree ordering methods, SYMAMD and SYMMMD. Its ordering quality is +comparable to SYMAMD, and better than SYMMMD +\cite{DavisGilbertLarimoreNg04}. + +An optional input argument can be used to modify the control parameters for +AMD (aggressive absorption, dense row/column handling, and printing of +statistics). An optional output +argument provides statistics on the ordering, including an analysis of the +fill-in and the floating-point operation count for a subsequent factorization. +For more details (once AMD is installed), +type {\tt help amd} in the MATLAB command window. + +%------------------------------------------------------------------------------ +\section{Using AMD in a C program} +\label{Cversion} +%------------------------------------------------------------------------------ + +The C-callable AMD library consists of seven user-callable routines and one +include file. There are two versions of each of the routines, with +{\tt int} and {\tt long} integers. +The routines with prefix +{\tt amd\_l\_} use {\tt long} integer arguments; the others use +{\tt int} integer arguments. If you compile AMD in the standard +ILP32 mode (32-bit {\tt int}'s, {\tt long}'s, and pointers) then the versions +are essentially identical. You will be able to solve problems using up to 2GB +of memory. If you compile AMD in the standard LP64 mode, the size of an +{\tt int} remains 32-bits, but the size of a {\tt long} and a pointer both get +promoted to 64-bits. + +The following routines are fully described in Section~\ref{Primary}: + +\begin{itemize} +\item {\tt amd\_order} +({\tt long} version: {\tt amd\_l\_order}) + {\footnotesize + \begin{verbatim} + #include "amd.h" + int n, Ap [n+1], Ai [nz], P [n] ; + double Control [AMD_CONTROL], Info [AMD_INFO] ; + int result = amd_order (n, Ap, Ai, P, Control, Info) ; + \end{verbatim} + } + Computes the approximate minimum degree ordering of an $n$-by-$n$ matrix + $\m{A}$. Returns a permutation vector {\tt P} of size {\tt n}, where + {\tt P[k] = i} if row and column {\tt i} are the {\tt k}th row and + column in the permuted matrix. + This routine allocates its own memory of size $1.2e+9n$ integers, + where $e$ is the number of nonzeros in $\m{A}+\m{A}\tr$. + It computes statistics about the matrix $\m{A}$, such as the symmetry of + its nonzero pattern, the number of nonzeros in $\m{L}$, + and the number of floating-point operations required for Cholesky and LU + factorizations (which are returned in the {\tt Info} array). + The user's input matrix is not modified. + It returns {\tt AMD\_OK} if successful, + {\tt AMD\_OK\_BUT\_JUMBLED} if successful (but the matrix had unsorted + and/or duplicate row indices), + {\tt AMD\_INVALID} if the matrix is invalid, + {\tt AMD\_OUT\_OF\_MEMORY} if out of memory. + +\item {\tt amd\_defaults} +({\tt long} version: {\tt amd\_l\_defaults}) + {\footnotesize + \begin{verbatim} + #include "amd.h" + double Control [AMD_CONTROL] ; + amd_defaults (Control) ; + \end{verbatim} + } + Sets the default control parameters in the {\tt Control} array. These can + then be modified as desired before passing the array to the other AMD + routines. + +\item {\tt amd\_control} +({\tt long} version: {\tt amd\_l\_control}) + {\footnotesize + \begin{verbatim} + #include "amd.h" + double Control [AMD_CONTROL] ; + amd_control (Control) ; + \end{verbatim} + } + Prints a description of the control parameters, and their values. + +\item {\tt amd\_info} +({\tt long} version: {\tt amd\_l\_info}) + {\footnotesize + \begin{verbatim} + #include "amd.h" + double Info [AMD_INFO] ; + amd_info (Info) ; + \end{verbatim} + } + Prints a description of the statistics computed by AMD, and their values. + +\item {\tt amd\_valid} +({\tt long} version: {\tt amd\_valid}) + {\footnotesize + \begin{verbatim} + #include "amd.h" + int n, Ap [n+1], Ai [nz] ; + int result = amd_valid (n, n, Ap, Ai) ; + \end{verbatim} + } + Returns {\tt AMD\_OK} or {\tt AMD\_OK\_BUT\_JUMBLED} + if the matrix is valid as input to {\tt amd\_order}; + the latter is returned if the matrix has unsorted and/or duplicate + row indices in one or more columns. + Returns {\tt AMD\_INVALID} if the matrix cannot be passed to + {\tt amd\_order}. + For {\tt amd\_order}, the matrix must + also be square. The first two arguments are the number of rows and the + number of columns of the matrix. For its use in AMD, these must both + equal {\tt n}. + +\item {\tt amd\_2} +({\tt long} version: {\tt amd\_l2}) + AMD ordering kernel. It is faster than {\tt amd\_order}, and + can be called by the user, but it is difficult to use. + It does not check its inputs for errors. + It does not require the columns of its input matrix to be sorted, + but it destroys the matrix on output. Additional workspace must be passed. + Refer to the source file {\tt AMD/Source/amd\_2.c} for a description. + +\end{itemize} + +The nonzero pattern of the matrix $\m{A}$ is represented in compressed column +form. +For an $n$-by-$n$ matrix $\m{A}$ with {\tt nz} nonzero entries, the +representation consists of two arrays: {\tt Ap} of size {\tt n+1} and {\tt Ai} +of size {\tt nz}. The row indices of entries in column {\tt j} are stored in + {\tt Ai[Ap[j]} $\ldots$ {\tt Ap[j+1]-1]}. +For {\tt amd\_order}, +if duplicate row indices are present, or if the row indices in any given +column are not sorted in ascending order, then {\tt amd\_order} creates +an internal copy of the matrix with sorted rows and no duplicate entries, +and orders the copy. This adds slightly to the time and memory usage of +{\tt amd\_order}, but is not an error condition. + +The matrix is 0-based, and thus +row indices must be in the range {\tt 0} to {\tt n-1}. +The first entry {\tt Ap[0]} must be zero. +The total number of entries in the matrix is thus {\tt nz = Ap[n]}. + +The matrix must be square, but it does not need to be symmetric. +The {\tt amd\_order} routine constructs the nonzero pattern of +$\m{B} = \m{A}+\m{A}\tr$ (without forming $\m{A}\tr$ explicitly if +$\m{A}$ has sorted columns and no duplicate entries), +and then orders the matrix $\m{B}$. Thus, either the +lower triangular part of $\m{A}$, the upper triangular part, +or any combination may be passed. The transpose $\m{A}\tr$ may also be +passed to {\tt amd\_order}. +The diagonal entries may be present, but are ignored. + +%------------------------------------------------------------------------------ +\subsection{Control parameters} +\label{control_param} +%------------------------------------------------------------------------------ + +Control parameters are set in an optional {\tt Control} array. +It is optional in the sense that if +a {\tt NULL} pointer is passed for the {\tt Control} input argument, +then default control parameters are used. +% +\begin{itemize} +\item {\tt Control[AMD\_DENSE]} (or {\tt Control(1)} in MATLAB): +controls the threshold for ``dense'' +rows/columns. A dense row/column in $\m{A}+\m{A}\tr$ +can cause AMD to spend significant time +in ordering the matrix. If {\tt Control[AMD\_DENSE]} $\ge 0$, +rows/columns with +more than {\tt Control[AMD\_DENSE]} $\sqrt{n}$ entries are ignored during +the ordering, and placed last in the output order. The default +value of {\tt Control[AMD\_DENSE]} is 10. If negative, no rows/columns +are treated as ``dense.'' Rows/columns with 16 or fewer off-diagonal +entries are never considered ``dense.'' +% +\item {\tt Control[AMD\_AGGRESSIVE]} (or {\tt Control(2)} in MATLAB): +controls whether or not to use +aggressive absorption, in which a prior element is absorbed into the current +element if it is a subset of the current element, even if it is not +adjacent to the current pivot element (refer +to \cite{AmestoyDavisDuff96,AmestoyDavisDuff04} +for more details). The default value is nonzero, +which means that aggressive absorption will be performed. This nearly always +leads to a better ordering (because the approximate degrees are more +accurate) and a lower execution time. There are cases where it can +lead to a slightly worse ordering, however. To turn it off, set +{\tt Control[AMD\_AGGRESSIVE]} to 0. +% +\end{itemize} + +Statistics are returned in the {\tt Info} array +(if {\tt Info} is {\tt NULL}, then no statistics are returned). +Refer to {\tt amd.h} file, for more details +(14 different statistics are returned, so the list is not included here). + +%------------------------------------------------------------------------------ +\subsection{Sample C program} +%------------------------------------------------------------------------------ + +The following program, {\tt amd\_demo.c}, illustrates the basic use of AMD. +See Section~\ref{Synopsis} for a short description +of each calling sequence. + +{\footnotesize +\begin{verbatim} +#include +#include "amd.h" + +int n = 5 ; +int Ap [ ] = { 0, 2, 6, 10, 12, 14} ; +int Ai [ ] = { 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4 } ; +int P [5] ; + +int main (void) +{ + int k ; + (void) amd_order (n, Ap, Ai, P, (double *) NULL, (double *) NULL) ; + for (k = 0 ; k < n ; k++) printf ("P [%d] = %d\n", k, P [k]) ; + return (0) ; +} +\end{verbatim} +} + +The {\tt Ap} and {\tt Ai} arrays represent the binary matrix +\[ +\m{A} = \left[ +\begin{array}{rrrrr} + 1 & 1 & 0 & 0 & 0 \\ + 1 & 1 & 1 & 0 & 1 \\ + 0 & 1 & 1 & 1 & 0 \\ + 0 & 0 & 1 & 1 & 0 \\ + 0 & 1 & 1 & 0 & 1 \\ +\end{array} +\right]. +\] +The diagonal entries are ignored. +% +AMD constructs the pattern of $\m{A}+\m{A}\tr$, +and returns a permutation vector of $(0, 3, 1, 4, 2)$. +% +Since the matrix is unsymmetric but with a mostly symmetric nonzero +pattern, this would be a suitable permutation for an LU factorization of a +matrix with this nonzero pattern and whose diagonal entries are not too small. +The program uses default control settings and does not return any statistics +about the ordering, factorization, or solution ({\tt Control} and {\tt Info} +are both {\tt (double *) NULL}). It also ignores the status value returned by +{\tt amd\_order}. + +More example programs are included with the AMD package. +The {\tt amd\_demo.c} program provides a more detailed demo of AMD. +Another example is the AMD mexFunction, {\tt amd\_mex.c}. + +%------------------------------------------------------------------------------ +\subsection{A note about zero-sized arrays} +%------------------------------------------------------------------------------ + +AMD uses several user-provided arrays of size {\tt n} or {\tt nz}. +Either {\tt n} or {\tt nz} can be zero. +If you attempt to {\tt malloc} an array of size zero, +however, {\tt malloc} will return a null pointer which AMD will report +as invalid. If you {\tt malloc} an array of +size {\tt n} or {\tt nz} to pass to AMD, make sure that you handle the +{\tt n} = 0 and {\tt nz = 0} cases correctly. + +%------------------------------------------------------------------------------ +\section{Synopsis of C-callable routines} +\label{Synopsis} +%------------------------------------------------------------------------------ + +The matrix $\m{A}$ is {\tt n}-by-{\tt n} with {\tt nz} entries. + +{\footnotesize +\begin{verbatim} +#include "amd.h" +int n, status, Ap [n+1], Ai [nz], P [n] ; +double Control [AMD_CONTROL], Info [AMD_INFO] ; +amd_defaults (Control) ; +status = amd_order (n, Ap, Ai, P, Control, Info) ; +amd_control (Control) ; +amd_info (Info) ; +status = amd_valid (n, n, Ap, Ai) ; +\end{verbatim} +} + +The {\tt amd\_l\_*} routines are identical, except that all {\tt int} +arguments become {\tt long}: + +{\footnotesize +\begin{verbatim} +#include "amd.h" +long n, status, Ap [n+1], Ai [nz], P [n] ; +double Control [AMD_CONTROL], Info [AMD_INFO] ; +amd_l_defaults (Control) ; +status = amd_l_order (n, Ap, Ai, P, Control, Info) ; +amd_l_control (Control) ; +amd_l_info (Info) ; +status = amd_l_valid (n, n, Ap, Ai) ; +\end{verbatim} +} + +%------------------------------------------------------------------------------ +\section{Using AMD in a Fortran program} +%------------------------------------------------------------------------------ + +Two Fortran versions of AMD are provided. The {\tt AMD} routine computes the +approximate minimum degree ordering, using aggressive absorption. The +{\tt AMDBAR} routine is identical, except that it does not perform aggressive +absorption. The {\tt AMD} routine is essentially identical to the HSL +routine {\tt MC47B/BD}. +Note that earlier versions of the Fortran +{\tt AMD} and {\tt AMDBAR} routines included an {\tt IOVFLO} argument, +which is no longer present. + +In contrast to the C version, the Fortran routines require a symmetric +nonzero pattern, with no diagonal entries present although the {\tt MC47A/AD} +wrapper in HSL allows duplicates, ignores out-of-range entries, and only +uses entries from the upper triangular part of the matrix. Although we +have an experimental Fortran code for treating ``dense'' rows, the Fortran +codes in this release do not treat +``dense'' rows and columns of $\m{A}$ differently, and thus their run time +can be high if there are a few dense rows and columns in the matrix. +They do not perform a post-ordering of the elimination tree, +compute statistics on the ordering, or check the validity of their input +arguments. These facilities are provided by {\tt MC47A/AD} and other +subroutines from HSL. +Only one {\tt integer} +version of each Fortran routine is provided. +Both Fortran routines overwrite the user's input +matrix, in contrast to the C version. +% +The C version does not return the elimination or assembly tree. +The Fortran version returns an assembly tree; +refer to the User Guide for details. +The following is the syntax of the {\tt AMD} Fortran routine. +The {\tt AMDBAR} routine is identical except for the routine name. + +{\footnotesize +\begin{verbatim} + INTEGER N, IWLEN, PFREE, NCMPA, IW (IWLEN), PE (N), DEGREE (N), NV (N), + $ NEXT (N), LAST (N), HEAD (N), ELEN (N), W (N), LEN (N) + CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, + $ LAST, HEAD, ELEN, DEGREE, NCMPA, W) + CALL AMDBAR (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, + $ LAST, HEAD, ELEN, DEGREE, NCMPA, W) +\end{verbatim} +} + +The input matrix is provided to {\tt AMD} and {\tt AMDBAR} +in three arrays, {\tt PE}, of size {\tt N}, +{\tt LEN}, of size {\tt N}, and {\tt IW}, of size {\tt IWLEN}. The size of +{\tt IW} must be at least {\tt NZ+N}. The recommended size is +{\tt 1.2*NZ + N}. +On input, the indices of nonzero entries in row {\tt I} are stored in {\tt IW}. +{\tt PE(I)} is the index in {\tt IW} of the start of row {\tt I}. +{\tt LEN(I)} is the number of entries in row {\tt I}. +The matrix is 1-based, with row and column indices in the range 1 to {\tt N}. +Row {\tt I} is contained in +{\tt IW (PE(I)} $\ldots \:$ {\tt PE(I) + LEN(I) - 1)}. +The diagonal entries must not be present. The indices within each row must +not contain any duplicates, but they need not be sorted. The rows +themselves need not be in any particular order, and there may be empty space +between the rows. If {\tt LEN(I)} is zero, then there are no off-diagonal +entries in row {\tt I}, and {\tt PE(I)} is ignored. The integer +{\tt PFREE} defines what part of {\tt IW} contains the user's input matrix, +which is held in {\tt IW(1}~$\ldots~\:${\tt PFREE-1)}. +The contents of {\tt IW} and {\tt LEN} are undefined on output, +and {\tt PE} is modified to contain information about the ordering. + +As the algorithm proceeds, it modifies the {\tt IW} array, placing the +pattern of the partially eliminated matrix in +{\tt IW(PFREE} $\ldots \:${\tt IWLEN)}. +If this space is exhausted, the space is compressed. +The number of compressions performed on the {\tt IW} array is +returned in the scalar {\tt NCMPA}. The value of {\tt PFREE} on output is the +length of {\tt IW} required for no compressions to be needed. + +The output permutation is returned in the array {\tt LAST}, of size {\tt N}. +If {\tt I=LAST(K)}, then {\tt I} is the {\tt K}th row in the permuted +matrix. The inverse permutation is returned in the array {\tt ELEN}, where +{\tt K=ELEN(I)} if {\tt I} is the {\tt K}th row in the permuted matrix. +On output, the {\tt PE} and {\tt NV} arrays hold the assembly tree, +a supernodal elimination tree that represents the relationship between +columns of the Cholesky factor $\m{L}$. +If {\tt NV(I)} $> 0$, then {\tt I} is a node in the assembly +tree, and the parent of {\tt I} is {\tt -PE(I)}. If {\tt I} is a root of +the tree, then {\tt PE(I)} is zero. The value of {\tt NV(I)} is the +number of entries in the corresponding column of $\m{L}$, including the +diagonal. +If {\tt NV(I)} is zero, then {\tt I} is a non-principal node that is +not in the assembly tree. Node {\tt -PE(I)} is the parent of node {\tt I} +in a subtree, the root of which is a node in the assembly tree. All nodes +in one subtree belong to the same supernode in the assembly tree. +The other size {\tt N} arrays +({\tt DEGREE}, {\tt HEAD}, {\tt NEXT}, and {\tt W}) are used as workspace, +and are not defined on input or output. + +If you want to use a simpler user-interface and compute the elimination +tree post-ordering, you should be able to call the C routines {\tt amd\_order} +or {\tt amd\_l\_order} from a Fortran program. Just be sure to take into +account the 0-based indexing in the {\tt P}, {\tt Ap}, and {\tt Ai} arguments +to {\tt amd\_order} and {\tt amd\_l\_order}. A sample interface is provided +in the files {\tt AMD/Demo/amd\_f77cross.f} and +{\tt AMD/Demo/amd\_f77wrapper.c}. To compile the {\tt amd\_f77cross} program, +type {\tt make cross} in the {\tt AMD/Demo} directory. The +Fortran-to-C calling conventions are highly non-portable, so this example +is not guaranteed to work with your compiler C and Fortran compilers. +The output of {\tt amd\_f77cross} is in {\tt amd\_f77cross.out}. + +%------------------------------------------------------------------------------ +\section{Sample Fortran main program} +%------------------------------------------------------------------------------ + +The following program illustrates the basic usage of the Fortran version of AMD. +The {\tt AP} and {\tt AI} arrays represent the binary matrix +\[ +\m{A} = \left[ +\begin{array}{rrrrr} + 1 & 1 & 0 & 0 & 0 \\ + 1 & 1 & 1 & 0 & 1 \\ + 0 & 1 & 1 & 1 & 1 \\ + 0 & 0 & 1 & 1 & 0 \\ + 0 & 1 & 1 & 0 & 1 \\ +\end{array} +\right] +\] +in a conventional 1-based column-oriented form, +except that the diagonal entries are not present. +The matrix has the same as nonzero pattern of $\m{A}+\m{A}\tr$ in the C +program, in Section~\ref{Cversion}. +The output permutation is $(4, 1, 3, 5, 2)$. +It differs from the permutation returned by the C routine {\tt amd\_order} +because a post-order of the elimination tree has not yet been performed. + +{\footnotesize +\begin{verbatim} + INTEGER N, NZ, J, K, P, IWLEN, PFREE, NCMPA + PARAMETER (N = 5, NZ = 10, IWLEN = 17) + INTEGER AP (N+1), AI (NZ), LAST (N), PE (N), LEN (N), ELEN (N), + $ IW (IWLEN), DEGREE (N), NV (N), NEXT (N), HEAD (N), W (N) + DATA AP / 1, 2, 5, 8, 9, 11/ + DATA AI / 2, 1,3,5, 2,4,5, 3, 2,3 / +C load the matrix into the AMD workspace + DO 10 J = 1,N + PE (J) = AP (J) + LEN (J) = AP (J+1) - AP (J) +10 CONTINUE + DO 20 P = 1,NZ + IW (P) = AI (P) +20 CONTINUE + PFREE = NZ + 1 +C order the matrix (destroys the copy of A in IW, PE, and LEN) + CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, LAST, HEAD, + $ ELEN, DEGREE, NCMPA, W) + DO 60 K = 1, N + PRINT 50, K, LAST (K) +50 FORMAT ('P (',I2,') = ', I2) +60 CONTINUE + END +\end{verbatim} +} + +The {\tt Demo} directory contains an example of how the C version +may be called from a Fortran program, but this is highly non-portable. +For this reason, it is placed in the {\tt Demo} directory, not in the +primary {\tt Source} directory. + +%------------------------------------------------------------------------------ +\section{Installation} +\label{Install} +%------------------------------------------------------------------------------ + +The following discussion assumes you have the {\tt make} program, either in +Unix, or in Windows with Cygwin. + +System-dependent configurations are in the +{\tt ../SuiteSparse\_config/SuiteSparse\_config.mk} +file. You can edit that file to customize the compilation. The default +settings will work on most systems. +Sample configuration files are provided +for Mac, Linux, Sun Solaris, and IBM AIX. +The system you are on is detected automatically. + +To compile and install the C-callable AMD library, +go to the {\tt AMD} directory and type {\tt make}. +A dynamic library is placed in +in {\tt AMD/Lib/libamd.so.*}, ({\tt *.dylib} for the Mac). +Three demo programs of the AMD ordering routine will be compiled and tested in +the {\tt AMD/Demo} directory. +The outputs of these demo programs will then be compared with output +files in the distribution. + +To compile and install the Fortran-callable AMD library, +go to the {\tt AMD} directory and type {\tt make fortran}. +The library will be placed in {\tt AMD/Lib/libamdf77.a}. +A demo program will be compiled and tested in the {\tt AMD/Demo} directory. +The output will be compared with an output file in the distribution. + +Typing {\tt make clean} will remove all but the final compiled libraries +and demo programs. Typing {\tt make purge} or {\tt make distclean} +removes all files not in the original distribution. +If you compile AMD and then later change the +{\tt ../SuiteSparse\_config/SuiteSparse\_config.mk} file +then you should type {\tt make purge} and then {\tt make} to recompile. + +When you compile your program that uses the C-callable AMD library, +you need to add the {\tt AMD/Lib/libamd.*} library +and you need to tell your compiler to look in the +{\tt AMD/Include} directory for include +files. To compile a Fortran program that calls the Fortran AMD library, +you need to add the {\tt AMD/Lib/libamdf77.a} library. +See {\tt AMD/Demo/Makefile} for an example. + +By doing {\tt make}, all compiled dynamic libraries are also copied into {\tt +SuiteSparse/lib} the include files are coped into {\tt SuiteSparse/include}, +and documentation is copied into {\tt SuiteSparse/doc}. + +Alternatively, you can install the shared library +and include files in /usr/local/lib and /usr/local/include, and +the documenation in /usr/local/doc. +Just do {\tt make} then {\tt make install}. +Now you can simply use {\tt -lamd} when you compile your own program. + +If all you want to use is the AMD2 mexFunction in MATLAB, you can skip +the use of the {\tt make} command entirely. Simply type +{\tt amd\_make} in MATLAB while in the {\tt AMD/MATLAB} directory. +This works on any system with MATLAB, including Windows. +Alternately, type {\tt make} in the {\tt AMD/MATLAB} directory, +or just use the built-in {\tt amd} in MATLAB 7.3 or later. + +If you are including AMD as a subset of a larger library and do not want +to link the C standard I/O library, or if you simply do not need to use +them, you can safely remove the {\tt amd\_control.c} and {\tt amd\_info.c} +files. Similarly, if you use default parameters (or define your +own {\tt Control} array), then you can exclude the {\tt amd\_defaults.c} +file. +Each of these files contains the user-callable routines of the same +name. None of these auxiliary routines are directly called by +{\tt amd\_order}. +The {\tt amd\_dump.c} file contains debugging routines +that are neither used nor compiled unless debugging is enabled. +The {\tt amd\_internal.h} file must be edited to enable debugging; +refer to the instructions in that file. +The bare minimum files required to use just {\tt amd\_order} are +{\tt amd.h} and {\tt amd\_internal.h} +in the {\tt Include} directory, +and +{\tt amd\_1.c}, +{\tt amd\_2.c}, +{\tt amd\_aat.c}, +{\tt amd\_global.c}, +{\tt and\_order.c}, +{\tt amd\_postorder.c}, +{\tt amd\_post\_tree.c}, +{\tt amd\_preprocess.c}, +and +{\tt amd\_valid.c} +in the {\tt Source} directory. + +%------------------------------------------------------------------------------ +\newpage +\section{The AMD routines} +\label{Primary} +%------------------------------------------------------------------------------ + +The file {\tt AMD/Include/amd.h} listed below +describes each user-callable routine in the C version of AMD, +and gives details on their use. + +{\footnotesize +\input{amd_h.tex} +} + + +%------------------------------------------------------------------------------ +\newpage +% References +%------------------------------------------------------------------------------ + +\bibliographystyle{plain} +\bibliography{AMD_UserGuide} + +\end{document} diff --git a/external/amd/Doc/ChangeLog b/external/amd/Doc/ChangeLog new file mode 100644 index 00000000..27868a7b --- /dev/null +++ b/external/amd/Doc/ChangeLog @@ -0,0 +1,180 @@ +May 4, 2016: version 2.4.6 + + * minor changes to Makefile + +Apr 1, 2016: version 2.4.5 + + * licensing simplified (no other change); refer to AMD/Doc/License.txt + +Feb 1, 2016: version 2.4.4 + + * update to Makefiles + +Jan 30, 2016: version 2.4.3 + + * modifications to Makefiles + +Jan 1, 2016: version 2.4.2 + + * modified Makefile to create shared libraries + No change to C code except version number + +Oct 10, 2014: version 2.4.1 + + modified MATLAB/amd_make.m. No change to C code except version number. + +July 31, 2013: version 2.4.0 + + * changed malloc and printf pointers to use SuiteSparse_config + +Jun 20, 2012: verison 2.3.1 + + * minor update for Windows (removed filesep) + +Jun 1, 2012: version 2.3.0 + + * changed from UFconfig to SuiteSparse_config + +May 15, 2012: version 2.2.4 + + * minor fix to SIZE_T_MAX definition (finicky compiler workaround) + +Dec 7, 2011: version 2.2.3 + + * fixed the Makefile to better align with CFLAGS and other standards + +Jan 25, 2011: version 2.2.2 + + * minor fix to "make install" + +Nov 30, 2009: version 2.2.1 + + * added "make install" and "make uninstall" + +May 31, 2007: version 2.2.0 + + * port to 64-bit MATLAB + + * Makefile moved from Source/ to Lib/ + + * minor changes to printing routines (amd_control.c, amd_info.c) + +Dec 12, 2006, version 2.0.4 + + * minor MATLAB code cleanup + +Nov 29, 2006, version 2.0.3 + + * changed MATLAB function name to amd2, so as not to conflict with + the now built-in version of AMD in MATLAB (which is the same thing + as the AMD here...). + +Sept 28, 2006, version 2.0.2 + + * #define SIZE_T_MAX not done if already defined (Mac OSX). + +Aug 31, 2006: + + * trivial change to comments in amd.m + +Apr 30, 2006: AMD Version 2.0: + + * long integer redefined as UF_long, controlled by UFconfig.h. + + * amd_order no longer requires its input to have sorted columns. It can + also tolerate duplicate entries in each column. If these conditions + hold, but the matrix is otherwise valid, amd_order returns + AMD_OK_BUT_JUMBLED (a warning, not an error). + + * amd_preprocess no longer deemed user-callable, since it is no longer + needed (it was used to ensure the input matrix had sorted columns with + no duplicate entries). It still exists, with additional parameters, + and is called by amd_order if necessary. amd_wpreprocess and + amd_preprocess_valid removed. Fortran interface routine amdpreproc + removed. + + * Integer overflow computations modified, to extend the size of problem + that the "int" version can solve when used in an LP64 compilation. + + * amd_demo2.c simplified (it tests AMD with a jumbled matrix). + + * amd_valid returned TRUE/FALSE in v1.2. It now returns AMD_OK, + AMD_OK_BUT_JUMBLED, or AMD_INVALID. Only in the latter case is the + matrix unsuitable as input to amd_order. + + * amd_internal.h include file moved from AMD/Source to AMD/Include. + +Nov 15, 2005: + + * minor editting of comments; version number (1.2) unchanged. + +Aug. 30, 2005: AMD Version 1.2 + + * AMD v1.2 is upward compatible with v1.1 and v1.0, except that v1.2 no + longer includes the compile-time redefinition of malloc and free. + + * Makefile modified to use UFconfig.mk. "Make" directory removed. + + * Easier inclusion in C++ programs. + + * option to allow compile-time redefinition of malloc and free + (added to v1.1) removed for v1.2. Replaced with a run-time + redefinition. AMD includes function pointers for malloc, free, + calloc, realloc, and printf, so that all those routines can be + redefined at compile time. These function pointers are global + variables, and so are not technically thread-safe, unless you + use defaults and don't need to change them (the common case) + or if you change them in one thread before using them in other + threads. + + * added #define'd version number + + * minor modification to AMD_2 to ensure all lines can be tested, without + conditional compilation. + + * moved the prototype for AMD_2 from amd_internal.h to amd.h + + * moved the prototype for AMD_valid from amd_internal.h to amd.h + + * MATLAB mexFunction uses libamd.a (compiled with cc) instead of compiling + each AMD source file with the mex command + + * long demo (amd_l_demo.c) added. + +Jan. 21, 2004: AMD Version 1.1 + + * No bugs found or fixed - new features added, only + * amd_preprocess added, to allow for more general input of the matrix A. + * ME=0 added to amd*.f, unused DEXT variable removed from amdbar.f, + to avoid spurious compiler warnings (this was not a bug). + * amd_demo2.c and amd_demo2.out added, to test/demo amd_preprocess. + * option to allow compile-time redefinition of malloc, free, printf added + * amd_demo.c shortened slightly (removed printing of PAP') + * User Guide modified (more details added) + * linewidth reduced from 80 to 79 columns + +Oct. 7, 2003: AMD version 1.0.1. + + * MATLAB mexFunction modified, to remove call to mexCallMATLAB function. + This function can take a long time to call, particularly if you are + ordering many small matrices. + +May 6, 2003: AMD Version 1.0 released. + + * converted to C (compare amd.f and amdbar.f with amd_2.c) + * dense rows/column removed prior to ordering + * elimination tree post-ordering added + * demos, user guide written + * statistics added (nz in L, flop count, symmetry of A) + * computes the pattern of A+A' if A is unsymmetric + * user's input matrix no longer overwritten + * degree lists initialized differently + * IOVFLO argument removed from Fortran versions (amd.f and amdbar.f) + * parameters added (dense row/column detection, aggressive absorption) + * MATLAB mexFunction added + +Jan, 1996: + + * amdbar.f posted at http://www.netlib.org (with a restricted License) + * amd.f appears as MC47B/BD in the Harwell Subroutine Library + (without the IOVFLO argument) diff --git a/external/amd/Doc/License.txt b/external/amd/Doc/License.txt new file mode 100644 index 00000000..05f154c8 --- /dev/null +++ b/external/amd/Doc/License.txt @@ -0,0 +1,91 @@ +AMD, Copyright (c), 1996-2015, Timothy A. Davis, +Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + +AMD License: At the user's option, you may use AMD under either the LGPL +version 2.1 license, or the BSD 3-clause license. You may not use both +licenses, nor may you mix-and-match clauses from each license. To use a +license, in the documentation for your application simply state either of the +following, replacing with the name of your application: + + AMD, Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + Used in under the BSD 3-clause license. + +or + + AMD, Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + Used in under the LGPL v2.1 license. + +In the event that your package includes another package by another +author, and and use AMD under different licenses, you may select +one license to apply to both uses of AMD in the combined application. + +Availability: + + http://www.suitesparse.com + +------------------------------------------------------------------------------- +BSD 3-clause: +------------------------------------------------------------------------------- + + Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the organizations to which the authors are + affiliated, nor the names of its contributors may be used to endorse + or promote products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + +------------------------------------------------------------------------------- +LGPL version 2.1: +------------------------------------------------------------------------------- + + Your use or distribution of AMD or any modified version of + AMD implies that you agree to this License. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA + + Permission is hereby granted to use or copy this program under the + terms of the GNU LGPL, provided that the Copyright, this License, + and the Availability of the original version is retained on all copies. + User documentation of any code that uses this code or any modified + version of this code must cite the Copyright, this License, the + Availability note, and "Used by permission." Permission to modify + the code and to distribute modified code is granted, provided the + Copyright, this License, and the Availability note are retained, + and a notice that the code was modified is included. + +------------------------------------------------------------------------------- diff --git a/external/amd/Doc/Makefile b/external/amd/Doc/Makefile new file mode 100644 index 00000000..e90536a2 --- /dev/null +++ b/external/amd/Doc/Makefile @@ -0,0 +1,36 @@ +#------------------------------------------------------------------------------ +# AMD Makefile for compiling on Unix systems +#------------------------------------------------------------------------------ + +default: dist + +include ../../SuiteSparse_config/SuiteSparse_config.mk + +#------------------------------------------------------------------------------ +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------ + +clean: + - $(RM) -r $(CLEAN) + +purge: distclean + +distclean: clean + - $(RM) -r $(PURGE) + +#------------------------------------------------------------------------------ +# Create the User Guide and Quick Start Guide +#------------------------------------------------------------------------------ + +AMD_UserGuide.pdf: AMD_UserGuide.tex AMD_UserGuide.bib ../Include/amd.h + echo '\begin{verbatim}' > amd_h.tex + expand -8 ../Include/amd.h >> amd_h.tex + echo '\end{verbatim}' >> amd_h.tex + pdflatex AMD_UserGuide + bibtex AMD_UserGuide + pdflatex AMD_UserGuide + pdflatex AMD_UserGuide + +dist: AMD_UserGuide.pdf + - $(RM) *.aux *.bbl *.blg *.log *.toc amd_h.tex + diff --git a/external/amd/Doc/lesser.txt b/external/amd/Doc/lesser.txt new file mode 100644 index 00000000..8add30ad --- /dev/null +++ b/external/amd/Doc/lesser.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/external/amd/Lib/Makefile b/external/amd/Lib/Makefile new file mode 100644 index 00000000..2567de69 --- /dev/null +++ b/external/amd/Lib/Makefile @@ -0,0 +1,124 @@ +#------------------------------------------------------------------------------- +# AMD Lib/Makefile +#------------------------------------------------------------------------------- + +LIBRARY = libamd +VERSION = 2.4.6 +SO_VERSION = 2 + +default: library + +include ../../SuiteSparse_config/SuiteSparse_config.mk + +# AMD depends on SuiteSparse_config +LDLIBS += -lsuitesparseconfig + +# compile and install in SuiteSparse/lib +library: + $(MAKE) install INSTALL=$(SUITESPARSE) + +C = $(CC) $(CF) -I../Include -I../../SuiteSparse_config + +#------------------------------------------------------------------------------- +# source files +#------------------------------------------------------------------------------- + +AMD = amd_aat amd_1 amd_2 amd_dump amd_postorder amd_defaults \ + amd_post_tree \ + amd_order amd_control amd_info amd_valid amd_preprocess + +INC = ../Include/amd.h ../Include/amd_internal.h \ + ../../SuiteSparse_config/SuiteSparse_config.h + +#------------------------------------------------------------------------------- +# object files for each version +#------------------------------------------------------------------------------- + +AMDI = $(addsuffix .o, $(subst amd_,amd_i_,$(AMD))) +AMDL = $(addsuffix .o, $(subst amd_,amd_l_,$(AMD))) +OBJ = amd_global.o $(AMDI) $(AMDL) + +#------------------------------------------------------------------------------- +# compile each int and long routine (with no real/complex version) +#------------------------------------------------------------------------------- + +amd_global.o: ../Source/amd_global.c $(INC) + $(C) -c $< -o $@ + +amd_i_%.o: ../Source/amd_%.c $(INC) + $(C) -DDINT -c $< -o $@ + +amd_l_%.o: ../Source/amd_%.c $(INC) + $(C) -DDLONG -c $< -o $@ + +#------------------------------------------------------------------------------- +# Create the static library (C versions only) +#------------------------------------------------------------------------------- + +static: $(AR_TARGET) + +$(AR_TARGET): $(OBJ) + $(ARCHIVE) $@ $^ + - $(RANLIB) $@ + +#------------------------------------------------------------------------------- +# compile the Fortran versions and the libamdf77.a library (static only) +#------------------------------------------------------------------------------- + +fortran: libamdf77.a + +AMDF77 = amd.o amdbar.o + +amd.o: ../Source/amd.f + $(F77) $(F77FLAGS) -c ../Source/amd.f -o amd.o + +amdbar.o: ../Source/amdbar.f + $(F77) $(F77FLAGS) -c ../Source/amdbar.f -o amdbar.o + +libamdf77.a: $(AMDF77) + $(ARCHIVE) libamdf77.a $^ + - $(RANLIB) libamdf77.a + +#------------------------------------------------------------------------------- +# install (shared C version only) +#------------------------------------------------------------------------------- + +# install AMD +install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET) + +$(INSTALL_LIB)/$(SO_TARGET): $(OBJ) + @mkdir -p $(INSTALL_LIB) + @mkdir -p $(INSTALL_INCLUDE) + @mkdir -p $(INSTALL_DOC) + $(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS) + ( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) ) + ( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) ) + $(CP) ../Include/amd.h $(INSTALL_INCLUDE) + $(CP) ../Doc/AMD_UserGuide.pdf $(INSTALL_DOC) + $(CP) ../README.txt $(INSTALL_DOC)/AMD_README.txt + chmod 755 $(INSTALL_LIB)/$(SO_TARGET) + chmod 644 $(INSTALL_INCLUDE)/amd.h + chmod 644 $(INSTALL_DOC)/AMD_UserGuide.pdf + chmod 644 $(INSTALL_DOC)/AMD_README.txt + +# uninstall AMD +uninstall: + $(RM) $(INSTALL_LIB)/$(SO_TARGET) + $(RM) $(INSTALL_LIB)/$(SO_PLAIN) + $(RM) $(INSTALL_LIB)/$(SO_MAIN) + $(RM) $(INSTALL_INCLUDE)/amd.h + $(RM) $(INSTALL_DOC)/AMD_UserGuide.pdf + $(RM) $(INSTALL_DOC)/AMD_README.txt + +#------------------------------------------------------------------------------- +# Remove all but the files in the original distribution +#------------------------------------------------------------------------------- + +clean: + - $(RM) -r $(CLEAN) + +purge: distclean + +distclean: clean + - $(RM) -r $(PURGE) + diff --git a/external/amd/MATLAB/Contents.m b/external/amd/MATLAB/Contents.m new file mode 100644 index 00000000..c9c5eec4 --- /dev/null +++ b/external/amd/MATLAB/Contents.m @@ -0,0 +1,18 @@ +%Contents of the AMD sparse matrix ordering package: +% +% amd2 - p = amd2 (A), the approximate minimum degree ordering of A +% amd_demo - a demo of amd2, using the can_24 matrix +% amd_make - to compile amd2 for use in MATLAB +% amd_install - compile and install amd2 for use in MATLAB +% +% See also: amd, amd2, colamd, symamd, colmmd, symmmd, umfpack +% +% Note that amd2 and the built-in amd function in MATLAB 7.3 and later are one +% and the same. +% +% Example: +% p = amd2 (A) ; + +% Copyright 1994-2007, Tim Davis, Patrick R. Amestoy, and Iain S. Duff. + +help Contents diff --git a/external/amd/MATLAB/amd2.m b/external/amd/MATLAB/amd2.m new file mode 100644 index 00000000..60e09d5e --- /dev/null +++ b/external/amd/MATLAB/amd2.m @@ -0,0 +1,72 @@ +function [p, Info] = amd2 (A, Control) %#ok +%AMD2 p = amd2 (A), the approximate minimum degree ordering of A +% P = AMD2 (S) returns the approximate minimum degree permutation vector for +% the sparse matrix C = S+S'. The Cholesky factorization of C (P,P), or +% S (P,P), tends to be sparser than that of C or S. AMD tends to be faster +% than SYMMMD and SYMAMD, and tends to return better orderings than SYMMMD. +% S must be square. If S is full, amd(S) is equivalent to amd(sparse(S)). +% +% Note that the built-in AMD routine in MATLAB is identical to AMD2, +% except that AMD in MATLAB allows for a struct input to set the parameters. +% +% Usage: P = amd2 (S) ; % finds the ordering +% [P, Info] = amd2 (S, Control) ; % optional parameters & statistics +% Control = amd2 ; % returns default parameters +% amd2 ; % prints default parameters. +% +% Control (1); If S is n-by-n, then rows/columns with more than +% max (16, (Control (1))* sqrt(n)) entries in S+S' are considered +% "dense", and ignored during ordering. They are placed last in the +% output permutation. The default is 10.0 if Control is not present. +% Control (2): If nonzero, then aggressive absorption is performed. +% This is the default if Control is not present. +% Control (3): If nonzero, print statistics about the ordering. +% +% Info (1): status (0: ok, -1: out of memory, -2: matrix invalid) +% Info (2): n = size (A,1) +% Info (3): nnz (A) +% Info (4): the symmetry of the matrix S (0.0 means purely unsymmetric, +% 1.0 means purely symmetric). Computed as: +% B = tril (S, -1) + triu (S, 1) ; symmetry = nnz (B & B') / nnz (B); +% Info (5): nnz (diag (S)) +% Info (6): nnz in S+S', excluding the diagonal (= nnz (B+B')) +% Info (7): number "dense" rows/columns in S+S' +% Info (8): the amount of memory used by AMD, in bytes +% Info (9): the number of memory compactions performed by AMD +% +% The following statistics are slight upper bounds because of the +% approximate degree in AMD. The bounds are looser if "dense" rows/columns +% are ignored during ordering (Info (7) > 0). The statistics are for a +% subsequent factorization of the matrix C (P,P). The LU factorization +% statistics assume no pivoting. +% +% Info (10): the number of nonzeros in L, excluding the diagonal +% Info (11): the number of divide operations for LL', LDL', or LU +% Info (12): the number of multiply-subtract pairs for LL' or LDL' +% Info (13): the number of multiply-subtract pairs for LU +% Info (14): the max # of nonzeros in any column of L (incl. diagonal) +% Info (15:20): unused, reserved for future use +% +% An assembly tree post-ordering is performed, which is typically the same +% as an elimination tree post-ordering. It is not always identical because +% of the approximate degree update used, and because "dense" rows/columns +% do not take part in the post-order. It well-suited for a subsequent +% "chol", however. If you require a precise elimination tree post-ordering, +% then see the example below: +% +% Example: +% +% P = amd2 (S) ; +% C = spones (S) + spones (S') ; % skip this if S already symmetric +% [ignore, Q] = etree (C (P,P)) ; +% P = P (Q) ; +% +% See also AMD, COLMMD, COLAMD, COLPERM, SYMAMD, SYMMMD, SYMRCM. + +% Copyright 1994-2012, Timothy A. Davis, http://www.suitesparse.com, +% Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. +% +% Acknowledgements: This work was supported by the National Science +% Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270. + +error ('amd2 mexFunction not found') ; diff --git a/external/amd/MATLAB/amd_demo.m b/external/amd/MATLAB/amd_demo.m new file mode 100644 index 00000000..06deba22 --- /dev/null +++ b/external/amd/MATLAB/amd_demo.m @@ -0,0 +1,80 @@ +function amd_demo +%AMD_DEMO a demo of amd2, using the can_24 matrix +% +% A demo of AMD for MATLAB. +% +% Example: +% amd_demo +% +% See also: amd, amd2, amd_make + +% Copyright 1994-2007, Tim Davis, Patrick R. Amestoy, and Iain S. Duff. + +% This orders the same matrix as the ANSI C demo, amd_demo.c. It includes an +% additional analysis of the matrix via MATLAB's symbfact routine. + +% First, print the help information for AMD +help amd2 + +% Get the Harwell/Boeing can_24 matrix. + +load can_24 +A = spconvert (can_24) ; + +n = size (A,1) ; + +clf +subplot (2,2,1) ; +spy (A) +title ('HB/can24 matrix') ; + +% order the matrix. Note that the Info argument is optional. +fprintf ('\nIf the next step fails, then you have\n') ; +fprintf ('not yet compiled the AMD mexFunction.\n') ; +[p, Info] = amd2 (A) ; %#ok + +% order again, but this time print some statistics +[p, Info] = amd2 (A, [10 1 1]) ; + +fprintf ('Permutation vector:\n') ; +fprintf (' %2d', p) ; +fprintf ('\n\n') ; + +subplot (2,2,2) ; +spy (A (p,p)) ; +title ('Permuted matrix') ; + +% The amd_demo.c program stops here. + +fprintf ('Analyze A(p,p) with MATLAB''s symbfact routine:\n') ; +[cn, height, parent, post, R] = symbfact (A (p,p)) ; + +subplot (2,2,3) ; +spy (R') ; +title ('Cholesky factor, L') ; + +subplot (2,2,4) ; +treeplot (parent) ; +title ('elimination tree') ; + +% results from symbfact +lnz = sum (cn) ; % number of nonzeros in L, incl. diagonal +cn = cn - 1 ; % get the count of off-diagonal entries +fl = n + sum (cn.^2 + 2*cn) ; % flop count for chol (A (p,p) +fprintf ('number of nonzeros in L (including diagonal): %d\n', lnz) ; +fprintf ('floating point operation count for chol (A (p,p)): %d\n', fl) ; + +% approximations from amd: +lnz2 = n + Info (10) ; +fl2 = n + Info (11) + 2 * Info (12) ; +fprintf ('\nResults from AMD''s approximate analysis:\n') ; +fprintf ('number of nonzeros in L (including diagonal): %d\n', lnz2) ; +fprintf ('floating point operation count for chol (A (p,p)): %d\n\n', fl2) ; + +if (lnz2 ~= lnz | fl ~= fl2) %#ok + fprintf ('Note that the nonzero and flop counts from AMD are slight\n') ; + fprintf ('upper bounds. This is due to the approximate minimum degree\n'); + fprintf ('method used, in conjunction with "mass elimination".\n') ; + fprintf ('See the discussion about mass elimination in amd.h and\n') ; + fprintf ('amd_2.c for more details.\n') ; +end diff --git a/external/amd/MATLAB/amd_install.m b/external/amd/MATLAB/amd_install.m new file mode 100644 index 00000000..6b9f3628 --- /dev/null +++ b/external/amd/MATLAB/amd_install.m @@ -0,0 +1,19 @@ +function amd_install +%AMD_INSTALL compile and install amd2 for use in MATLAB +% Your current directory must be AMD/MATLAB for this function to work. +% +% Example: +% amd_install +% +% See also amd, amd2. + +% Copyright 1994-2007, Tim Davis, Patrick R. Amestoy, and Iain S. Duff. + +% This orders the same matrix as the ANSI C demo, amd_demo.c. It includes an + +amd_make +addpath (pwd) +fprintf ('\nThe following path has been added. You may wish to add it\n') ; +fprintf ('permanently, using the MATLAB pathtool command.\n') ; +fprintf ('%s\n\n', pwd) ; +amd_demo diff --git a/external/amd/MATLAB/amd_make.m b/external/amd/MATLAB/amd_make.m new file mode 100644 index 00000000..e43ec87b --- /dev/null +++ b/external/amd/MATLAB/amd_make.m @@ -0,0 +1,43 @@ +function amd_make +%AMD_MAKE to compile amd2 for use in MATLAB +% +% Example: +% amd_make +% +% See also amd, amd2. + +% Copyright 1994-2007, Tim Davis, Patrick R. Amestoy, and Iain S. Duff. + +details = 0 ; % 1 if details of each command are to be printed + +d = '' ; +if (~isempty (strfind (computer, '64'))) + d = '-largeArrayDims' ; +end + +% MATLAB 8.3.0 now has a -silent option to keep 'mex' from burbling too much +if (~verLessThan ('matlab', '8.3.0')) + d = ['-silent ' d] ; +end + +i = sprintf ('-I../Include -I../../SuiteSparse_config') ; +cmd = sprintf ('mex -O %s -DDLONG -output amd2 %s amd_mex.c %s', d, i, ... + '../../SuiteSparse_config/SuiteSparse_config.c') ; +files = {'amd_order', 'amd_dump', 'amd_postorder', 'amd_post_tree', ... + 'amd_aat', 'amd_2', 'amd_1', 'amd_defaults', 'amd_control', ... + 'amd_info', 'amd_valid', 'amd_preprocess' } ; +for i = 1 : length (files) + cmd = sprintf ('%s ../Source/%s.c', cmd, files {i}) ; +end +if (details) + fprintf ('%s\n', cmd) ; +end + +if (~(ispc || ismac)) + % for POSIX timing routine + cmd = [cmd ' -lrt'] ; +end + +eval (cmd) ; + +fprintf ('AMD successfully compiled.\n') ; diff --git a/external/amd/MATLAB/amd_mex.c b/external/amd/MATLAB/amd_mex.c new file mode 100644 index 00000000..89fdc9b7 --- /dev/null +++ b/external/amd/MATLAB/amd_mex.c @@ -0,0 +1,192 @@ +/* ========================================================================= */ +/* === AMD mexFunction ===================================================== */ +/* ========================================================================= */ + +/* ------------------------------------------------------------------------- */ +/* AMD, Copyright (c) Timothy A. Davis, */ +/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ +/* email: DrTimothyAldenDavis@gmail.com */ +/* ------------------------------------------------------------------------- */ + +/* + * Usage: + * p = amd (A) + * p = amd (A, Control) + * [p, Info] = amd (A) + * [p, Info] = amd (A, Control) + * Control = amd ; % return the default Control settings for AMD + * amd ; % print the default Control settings for AMD + * + * Given a square matrix A, compute a permutation P suitable for a Cholesky + * factorization of the matrix B (P,P), where B = spones (A) + spones (A'). + * The method used is the approximate minimum degree ordering method. See + * amd.m and amd.h for more information. + * + * The input matrix need not have sorted columns, and can have duplicate + * entries. + */ + +#include "amd.h" +#include "mex.h" +#include "matrix.h" +#define Long SuiteSparse_long + +void mexFunction +( + int nargout, + mxArray *pargout [ ], + int nargin, + const mxArray *pargin [ ] +) +{ + Long i, m, n, *Ap, *Ai, *P, nc, result, spumoni, full ; + double *Pout, *InfoOut, Control [AMD_CONTROL], Info [AMD_INFO], *ControlIn ; + mxArray *A ; + + /* --------------------------------------------------------------------- */ + /* get control parameters */ + /* --------------------------------------------------------------------- */ + + spumoni = 0 ; + if (nargin == 0) + { + /* get the default control parameters, and return */ + pargout [0] = mxCreateDoubleMatrix (AMD_CONTROL, 1, mxREAL) ; + amd_l_defaults (mxGetPr (pargout [0])) ; + if (nargout == 0) + { + amd_l_control (mxGetPr (pargout [0])) ; + } + return ; + } + + amd_l_defaults (Control) ; + if (nargin > 1) + { + ControlIn = mxGetPr (pargin [1]) ; + nc = mxGetM (pargin [1]) * mxGetN (pargin [1]) ; + Control [AMD_DENSE] + = (nc > 0) ? ControlIn [AMD_DENSE] : AMD_DEFAULT_DENSE ; + Control [AMD_AGGRESSIVE] + = (nc > 1) ? ControlIn [AMD_AGGRESSIVE] : AMD_DEFAULT_AGGRESSIVE ; + spumoni = (nc > 2) ? (ControlIn [2] != 0) : 0 ; + } + + if (spumoni > 0) + { + amd_l_control (Control) ; + } + + /* --------------------------------------------------------------------- */ + /* get inputs */ + /* --------------------------------------------------------------------- */ + + if (nargout > 2 || nargin > 2) + { + mexErrMsgTxt ("Usage: p = amd (A)\nor [p, Info] = amd (A, Control)") ; + } + + A = (mxArray *) pargin [0] ; + n = mxGetN (A) ; + m = mxGetM (A) ; + if (spumoni > 0) + { + mexPrintf (" input matrix A is %d-by-%d\n", m, n) ; + } + if (mxGetNumberOfDimensions (A) != 2) + { + mexErrMsgTxt ("amd: A must be 2-dimensional") ; + } + if (m != n) + { + mexErrMsgTxt ("amd: A must be square") ; + } + + /* --------------------------------------------------------------------- */ + /* allocate workspace for output permutation */ + /* --------------------------------------------------------------------- */ + + P = mxMalloc ((n+1) * sizeof (Long)) ; + + /* --------------------------------------------------------------------- */ + /* if A is full, convert to a sparse matrix */ + /* --------------------------------------------------------------------- */ + + full = !mxIsSparse (A) ; + if (full) + { + if (spumoni > 0) + { + mexPrintf ( + " input matrix A is full (sparse copy of A will be created)\n"); + } + mexCallMATLAB (1, &A, 1, (mxArray **) pargin, "sparse") ; + } + Ap = (Long *) mxGetJc (A) ; + Ai = (Long *) mxGetIr (A) ; + if (spumoni > 0) + { + mexPrintf (" input matrix A has %d nonzero entries\n", Ap [n]) ; + } + + /* --------------------------------------------------------------------- */ + /* order the matrix */ + /* --------------------------------------------------------------------- */ + + result = amd_l_order (n, Ap, Ai, P, Control, Info) ; + + /* --------------------------------------------------------------------- */ + /* if A is full, free the sparse copy of A */ + /* --------------------------------------------------------------------- */ + + if (full) + { + mxDestroyArray (A) ; + } + + /* --------------------------------------------------------------------- */ + /* print results (including return value) */ + /* --------------------------------------------------------------------- */ + + if (spumoni > 0) + { + amd_l_info (Info) ; + } + + /* --------------------------------------------------------------------- */ + /* check error conditions */ + /* --------------------------------------------------------------------- */ + + if (result == AMD_OUT_OF_MEMORY) + { + mexErrMsgTxt ("amd: out of memory") ; + } + else if (result == AMD_INVALID) + { + mexErrMsgTxt ("amd: input matrix A is corrupted") ; + } + + /* --------------------------------------------------------------------- */ + /* copy the outputs to MATLAB */ + /* --------------------------------------------------------------------- */ + + /* output permutation, P */ + pargout [0] = mxCreateDoubleMatrix (1, n, mxREAL) ; + Pout = mxGetPr (pargout [0]) ; + for (i = 0 ; i < n ; i++) + { + Pout [i] = P [i] + 1 ; /* change to 1-based indexing for MATLAB */ + } + mxFree (P) ; + + /* Info */ + if (nargout > 1) + { + pargout [1] = mxCreateDoubleMatrix (AMD_INFO, 1, mxREAL) ; + InfoOut = mxGetPr (pargout [1]) ; + for (i = 0 ; i < AMD_INFO ; i++) + { + InfoOut [i] = Info [i] ; + } + } +} diff --git a/external/amd/MATLAB/can_24 b/external/amd/MATLAB/can_24 new file mode 100644 index 00000000..38158a15 --- /dev/null +++ b/external/amd/MATLAB/can_24 @@ -0,0 +1,160 @@ + 1 1 1 + 6 1 1 + 7 1 1 +13 1 1 +14 1 1 +18 1 1 +19 1 1 +20 1 1 +22 1 1 + 2 2 1 + 9 2 1 +10 2 1 +14 2 1 +15 2 1 +18 2 1 + 3 3 1 + 7 3 1 +12 3 1 +21 3 1 +22 3 1 +23 3 1 + 4 4 1 + 8 4 1 +11 4 1 +16 4 1 +19 4 1 +20 4 1 + 5 5 1 + 8 5 1 +10 5 1 +15 5 1 +16 5 1 +17 5 1 + 1 6 1 + 6 6 1 + 7 6 1 +13 6 1 +14 6 1 +18 6 1 + 1 7 1 + 3 7 1 + 6 7 1 + 7 7 1 +12 7 1 +13 7 1 +20 7 1 +22 7 1 +24 7 1 + 4 8 1 + 5 8 1 + 8 8 1 +10 8 1 +15 8 1 +16 8 1 +17 8 1 +18 8 1 +19 8 1 + 2 9 1 + 9 9 1 +10 9 1 +15 9 1 + 2 10 1 + 5 10 1 + 8 10 1 + 9 10 1 +10 10 1 +14 10 1 +15 10 1 +18 10 1 +19 10 1 + 4 11 1 +11 11 1 +19 11 1 +20 11 1 +21 11 1 +22 11 1 + 3 12 1 + 7 12 1 +12 12 1 +13 12 1 +22 12 1 +24 12 1 + 1 13 1 + 6 13 1 + 7 13 1 +12 13 1 +13 13 1 +24 13 1 + 1 14 1 + 2 14 1 + 6 14 1 +10 14 1 +14 14 1 +18 14 1 + 2 15 1 + 5 15 1 + 8 15 1 + 9 15 1 +10 15 1 +15 15 1 + 4 16 1 + 5 16 1 + 8 16 1 +16 16 1 +17 16 1 +19 16 1 + 5 17 1 + 8 17 1 +16 17 1 +17 17 1 + 1 18 1 + 2 18 1 + 6 18 1 + 8 18 1 +10 18 1 +14 18 1 +18 18 1 +19 18 1 +20 18 1 + 1 19 1 + 4 19 1 + 8 19 1 +10 19 1 +11 19 1 +16 19 1 +18 19 1 +19 19 1 +20 19 1 + 1 20 1 + 4 20 1 + 7 20 1 +11 20 1 +18 20 1 +19 20 1 +20 20 1 +21 20 1 +22 20 1 + 3 21 1 +11 21 1 +20 21 1 +21 21 1 +22 21 1 +23 21 1 + 1 22 1 + 3 22 1 + 7 22 1 +11 22 1 +12 22 1 +20 22 1 +21 22 1 +22 22 1 +23 22 1 + 3 23 1 +21 23 1 +22 23 1 +23 23 1 + 7 24 1 +12 24 1 +13 24 1 +24 24 1 diff --git a/external/amd/src/amd_1.c b/external/amd/Source/amd_1.c similarity index 100% rename from external/amd/src/amd_1.c rename to external/amd/Source/amd_1.c diff --git a/external/amd/src/amd_2.c b/external/amd/Source/amd_2.c similarity index 100% rename from external/amd/src/amd_2.c rename to external/amd/Source/amd_2.c diff --git a/external/amd/src/amd_aat.c b/external/amd/Source/amd_aat.c similarity index 100% rename from external/amd/src/amd_aat.c rename to external/amd/Source/amd_aat.c diff --git a/external/amd/src/amd_control.c b/external/amd/Source/amd_control.c similarity index 100% rename from external/amd/src/amd_control.c rename to external/amd/Source/amd_control.c diff --git a/external/amd/src/amd_defaults.c b/external/amd/Source/amd_defaults.c similarity index 100% rename from external/amd/src/amd_defaults.c rename to external/amd/Source/amd_defaults.c diff --git a/external/amd/src/amd_dump.c b/external/amd/Source/amd_dump.c similarity index 100% rename from external/amd/src/amd_dump.c rename to external/amd/Source/amd_dump.c diff --git a/external/amd/src/amd_global.c b/external/amd/Source/amd_global.c similarity index 100% rename from external/amd/src/amd_global.c rename to external/amd/Source/amd_global.c diff --git a/external/amd/src/amd_info.c b/external/amd/Source/amd_info.c similarity index 100% rename from external/amd/src/amd_info.c rename to external/amd/Source/amd_info.c diff --git a/external/amd/src/amd_order.c b/external/amd/Source/amd_order.c similarity index 100% rename from external/amd/src/amd_order.c rename to external/amd/Source/amd_order.c diff --git a/external/amd/src/amd_post_tree.c b/external/amd/Source/amd_post_tree.c similarity index 100% rename from external/amd/src/amd_post_tree.c rename to external/amd/Source/amd_post_tree.c diff --git a/external/amd/src/amd_postorder.c b/external/amd/Source/amd_postorder.c similarity index 100% rename from external/amd/src/amd_postorder.c rename to external/amd/Source/amd_postorder.c diff --git a/external/amd/src/amd_preprocess.c b/external/amd/Source/amd_preprocess.c similarity index 100% rename from external/amd/src/amd_preprocess.c rename to external/amd/Source/amd_preprocess.c diff --git a/external/amd/src/amd_valid.c b/external/amd/Source/amd_valid.c similarity index 100% rename from external/amd/src/amd_valid.c rename to external/amd/Source/amd_valid.c diff --git a/external/amd/include/amd.h b/external/amd/include/amd.h deleted file mode 100644 index a72851fc..00000000 --- a/external/amd/include/amd.h +++ /dev/null @@ -1,400 +0,0 @@ -/* ========================================================================= */ -/* === AMD: approximate minimum degree ordering =========================== */ -/* ========================================================================= */ - -/* ------------------------------------------------------------------------- */ -/* AMD Version 2.4, Copyright (c) 1996-2013 by Timothy A. Davis, */ -/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ -/* email: DrTimothyAldenDavis@gmail.com */ -/* ------------------------------------------------------------------------- */ - -/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky - * factorization of P*A*P' has fewer nonzeros and takes less work than the - * Cholesky factorization of A. If A is not symmetric, then it performs its - * ordering on the matrix A+A'. Two sets of user-callable routines are - * provided, one for int integers and the other for SuiteSparse_long integers. - * - * The method is based on the approximate minimum degree algorithm, discussed - * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm", - * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp. - * 886-905, 1996. This package can perform both the AMD ordering (with - * aggressive absorption), and the AMDBAR ordering (without aggressive - * absorption) discussed in the above paper. This package differs from the - * Fortran codes discussed in the paper: - * - * (1) it can ignore "dense" rows and columns, leading to faster run times - * (2) it computes the ordering of A+A' if A is not symmetric - * (3) it is followed by a depth-first post-ordering of the assembly tree - * (or supernodal elimination tree) - * - * For historical reasons, the Fortran versions, amd.f and amdbar.f, have - * been left (nearly) unchanged. They compute the identical ordering as - * described in the above paper. - */ - -#ifndef AMD_H -#define AMD_H - -/* make it easy for C++ programs to include AMD */ -#ifdef __cplusplus -extern "C" { -#endif - -/* get the definition of size_t: */ -#include - -#include "SuiteSparse_config.h" - -int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, - * AMD_INVALID, or AMD_OUT_OF_MEMORY */ -( - int n, /* A is n-by-n. n must be >= 0. */ - const int Ap [ ], /* column pointers for A, of size n+1 */ - const int Ai [ ], /* row indices of A, of size nz = Ap [n] */ - int P [ ], /* output permutation, of size n */ - double Control [ ], /* input Control settings, of size AMD_CONTROL */ - double Info [ ] /* output Info statistics, of size AMD_INFO */ -) ; - -SuiteSparse_long amd_l_order /* see above for description of arguments */ -( - SuiteSparse_long n, - const SuiteSparse_long Ap [ ], - const SuiteSparse_long Ai [ ], - SuiteSparse_long P [ ], - double Control [ ], - double Info [ ] -) ; - -/* Input arguments (not modified): - * - * n: the matrix A is n-by-n. - * Ap: an int/SuiteSparse_long array of size n+1, containing column - * pointers of A. - * Ai: an int/SuiteSparse_long array of size nz, containing the row - * indices of A, where nz = Ap [n]. - * Control: a double array of size AMD_CONTROL, containing control - * parameters. Defaults are used if Control is NULL. - * - * Output arguments (not defined on input): - * - * P: an int/SuiteSparse_long array of size n, containing the output - * permutation. If row i is the kth pivot row, then P [k] = i. In - * MATLAB notation, the reordered matrix is A (P,P). - * Info: a double array of size AMD_INFO, containing statistical - * information. Ignored if Info is NULL. - * - * On input, the matrix A is stored in column-oriented form. The row indices - * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1]. - * - * If the row indices appear in ascending order in each column, and there - * are no duplicate entries, then amd_order is slightly more efficient in - * terms of time and memory usage. If this condition does not hold, a copy - * of the matrix is created (where these conditions do hold), and the copy is - * ordered. This feature is new to v2.0 (v1.2 and earlier required this - * condition to hold for the input matrix). - * - * Row indices must be in the range 0 to - * n-1. Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros - * in A. The array Ap is of size n+1, and the array Ai is of size nz = Ap [n]. - * The matrix does not need to be symmetric, and the diagonal does not need to - * be present (if diagonal entries are present, they are ignored except for - * the output statistic Info [AMD_NZDIAG]). The arrays Ai and Ap are not - * modified. This form of the Ap and Ai arrays to represent the nonzero - * pattern of the matrix A is the same as that used internally by MATLAB. - * If you wish to use a more flexible input structure, please see the - * umfpack_*_triplet_to_col routines in the UMFPACK package, at - * http://www.suitesparse.com. - * - * Restrictions: n >= 0. Ap [0] = 0. Ap [j] <= Ap [j+1] for all j in the - * range 0 to n-1. nz = Ap [n] >= 0. Ai [0..nz-1] must be in the range 0 - * to n-1. Finally, Ai, Ap, and P must not be NULL. If any of these - * restrictions are not met, AMD returns AMD_INVALID. - * - * AMD returns: - * - * AMD_OK if the matrix is valid and sufficient memory can be allocated to - * perform the ordering. - * - * AMD_OUT_OF_MEMORY if not enough memory can be allocated. - * - * AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is - * NULL. - * - * AMD_OK_BUT_JUMBLED if the matrix had unsorted columns, and/or duplicate - * entries, but was otherwise valid. - * - * The AMD routine first forms the pattern of the matrix A+A', and then - * computes a fill-reducing ordering, P. If P [k] = i, then row/column i of - * the original is the kth pivotal row. In MATLAB notation, the permuted - * matrix is A (P,P), except that 0-based indexing is used instead of the - * 1-based indexing in MATLAB. - * - * The Control array is used to set various parameters for AMD. If a NULL - * pointer is passed, default values are used. The Control array is not - * modified. - * - * Control [AMD_DENSE]: controls the threshold for "dense" rows/columns. - * A dense row/column in A+A' can cause AMD to spend a lot of time in - * ordering the matrix. If Control [AMD_DENSE] >= 0, rows/columns - * with more than Control [AMD_DENSE] * sqrt (n) entries are ignored - * during the ordering, and placed last in the output order. The - * default value of Control [AMD_DENSE] is 10. If negative, no - * rows/columns are treated as "dense". Rows/columns with 16 or - * fewer off-diagonal entries are never considered "dense". - * - * Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive - * absorption, in which a prior element is absorbed into the current - * element if is a subset of the current element, even if it is not - * adjacent to the current pivot element (refer to Amestoy, Davis, - * & Duff, 1996, for more details). The default value is nonzero, - * which means to perform aggressive absorption. This nearly always - * leads to a better ordering (because the approximate degrees are - * more accurate) and a lower execution time. There are cases where - * it can lead to a slightly worse ordering, however. To turn it off, - * set Control [AMD_AGGRESSIVE] to 0. - * - * Control [2..4] are not used in the current version, but may be used in - * future versions. - * - * The Info array provides statistics about the ordering on output. If it is - * not present, the statistics are not returned. This is not an error - * condition. - * - * Info [AMD_STATUS]: the return value of AMD, either AMD_OK, - * AMD_OK_BUT_JUMBLED, AMD_OUT_OF_MEMORY, or AMD_INVALID. - * - * Info [AMD_N]: n, the size of the input matrix - * - * Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n] - * - * Info [AMD_SYMMETRY]: the symmetry of the matrix A. It is the number - * of "matched" off-diagonal entries divided by the total number of - * off-diagonal entries. An entry A(i,j) is matched if A(j,i) is also - * an entry, for any pair (i,j) for which i != j. In MATLAB notation, - * S = spones (A) ; - * B = tril (S, -1) + triu (S, 1) ; - * symmetry = nnz (B & B') / nnz (B) ; - * - * Info [AMD_NZDIAG]: the number of entries on the diagonal of A. - * - * Info [AMD_NZ_A_PLUS_AT]: the number of nonzeros in A+A', excluding the - * diagonal. If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1) - * with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n - * (the smallest possible value). If A is perfectly unsymmetric - * (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for - * example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz - * (the largest possible value). - * - * Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were - * removed from A prior to ordering. These are placed last in the - * output order P. - * - * Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes. In the - * current version, this is 1.2 * Info [AMD_NZ_A_PLUS_AT] + 9*n - * times the size of an integer. This is at most 2.4nz + 9n. This - * excludes the size of the input arguments Ai, Ap, and P, which have - * a total size of nz + 2*n + 1 integers. - * - * Info [AMD_NCMPA]: the number of garbage collections performed. - * - * Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal). - * This is a slight upper bound because mass elimination is combined - * with the approximate degree update. It is a rough upper bound if - * there are many "dense" rows/columns. The rest of the statistics, - * below, are also slight or rough upper bounds, for the same reasons. - * The post-ordering of the assembly tree might also not exactly - * correspond to a true elimination tree postordering. - * - * Info [AMD_NDIV]: the number of divide operations for a subsequent LDL' - * or LU factorization of the permuted matrix A (P,P). - * - * Info [AMD_NMULTSUBS_LDL]: the number of multiply-subtract pairs for a - * subsequent LDL' factorization of A (P,P). - * - * Info [AMD_NMULTSUBS_LU]: the number of multiply-subtract pairs for a - * subsequent LU factorization of A (P,P), assuming that no numerical - * pivoting is required. - * - * Info [AMD_DMAX]: the maximum number of nonzeros in any column of L, - * including the diagonal. - * - * Info [14..19] are not used in the current version, but may be used in - * future versions. - */ - -/* ------------------------------------------------------------------------- */ -/* direct interface to AMD */ -/* ------------------------------------------------------------------------- */ - -/* amd_2 is the primary AMD ordering routine. It is not meant to be - * user-callable because of its restrictive inputs and because it destroys - * the user's input matrix. It does not check its inputs for errors, either. - * However, if you can work with these restrictions it can be faster than - * amd_order and use less memory (assuming that you can create your own copy - * of the matrix for AMD to destroy). Refer to AMD/Source/amd_2.c for a - * description of each parameter. */ - -void amd_2 -( - int n, - int Pe [ ], - int Iw [ ], - int Len [ ], - int iwlen, - int pfree, - int Nv [ ], - int Next [ ], - int Last [ ], - int Head [ ], - int Elen [ ], - int Degree [ ], - int W [ ], - double Control [ ], - double Info [ ] -) ; - -void amd_l2 -( - SuiteSparse_long n, - SuiteSparse_long Pe [ ], - SuiteSparse_long Iw [ ], - SuiteSparse_long Len [ ], - SuiteSparse_long iwlen, - SuiteSparse_long pfree, - SuiteSparse_long Nv [ ], - SuiteSparse_long Next [ ], - SuiteSparse_long Last [ ], - SuiteSparse_long Head [ ], - SuiteSparse_long Elen [ ], - SuiteSparse_long Degree [ ], - SuiteSparse_long W [ ], - double Control [ ], - double Info [ ] -) ; - -/* ------------------------------------------------------------------------- */ -/* amd_valid */ -/* ------------------------------------------------------------------------- */ - -/* Returns AMD_OK or AMD_OK_BUT_JUMBLED if the matrix is valid as input to - * amd_order; the latter is returned if the matrix has unsorted and/or - * duplicate row indices in one or more columns. Returns AMD_INVALID if the - * matrix cannot be passed to amd_order. For amd_order, the matrix must also - * be square. The first two arguments are the number of rows and the number - * of columns of the matrix. For its use in AMD, these must both equal n. - * - * NOTE: this routine returned TRUE/FALSE in v1.2 and earlier. - */ - -int amd_valid -( - int n_row, /* # of rows */ - int n_col, /* # of columns */ - const int Ap [ ], /* column pointers, of size n_col+1 */ - const int Ai [ ] /* row indices, of size Ap [n_col] */ -) ; - -SuiteSparse_long amd_l_valid -( - SuiteSparse_long n_row, - SuiteSparse_long n_col, - const SuiteSparse_long Ap [ ], - const SuiteSparse_long Ai [ ] -) ; - -/* ------------------------------------------------------------------------- */ -/* AMD memory manager and printf routines */ -/* ------------------------------------------------------------------------- */ - - /* moved to SuiteSparse_config.c */ - -/* ------------------------------------------------------------------------- */ -/* AMD Control and Info arrays */ -/* ------------------------------------------------------------------------- */ - -/* amd_defaults: sets the default control settings */ -void amd_defaults (double Control [ ]) ; -void amd_l_defaults (double Control [ ]) ; - -/* amd_control: prints the control settings */ -void amd_control (double Control [ ]) ; -void amd_l_control (double Control [ ]) ; - -/* amd_info: prints the statistics */ -void amd_info (double Info [ ]) ; -void amd_l_info (double Info [ ]) ; - -#define AMD_CONTROL 5 /* size of Control array */ -#define AMD_INFO 20 /* size of Info array */ - -/* contents of Control */ -#define AMD_DENSE 0 /* "dense" if degree > Control [0] * sqrt (n) */ -#define AMD_AGGRESSIVE 1 /* do aggressive absorption if Control [1] != 0 */ - -/* default Control settings */ -#define AMD_DEFAULT_DENSE 10.0 /* default "dense" degree 10*sqrt(n) */ -#define AMD_DEFAULT_AGGRESSIVE 1 /* do aggressive absorption by default */ - -/* contents of Info */ -#define AMD_STATUS 0 /* return value of amd_order and amd_l_order */ -#define AMD_N 1 /* A is n-by-n */ -#define AMD_NZ 2 /* number of nonzeros in A */ -#define AMD_SYMMETRY 3 /* symmetry of pattern (1 is sym., 0 is unsym.) */ -#define AMD_NZDIAG 4 /* # of entries on diagonal */ -#define AMD_NZ_A_PLUS_AT 5 /* nz in A+A' */ -#define AMD_NDENSE 6 /* number of "dense" rows/columns in A */ -#define AMD_MEMORY 7 /* amount of memory used by AMD */ -#define AMD_NCMPA 8 /* number of garbage collections in AMD */ -#define AMD_LNZ 9 /* approx. nz in L, excluding the diagonal */ -#define AMD_NDIV 10 /* number of fl. point divides for LU and LDL' */ -#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */ -#define AMD_NMULTSUBS_LU 12 /* number of fl. point (*,-) pairs for LU */ -#define AMD_DMAX 13 /* max nz. in any column of L, incl. diagonal */ - -/* ------------------------------------------------------------------------- */ -/* return values of AMD */ -/* ------------------------------------------------------------------------- */ - -#define AMD_OK 0 /* success */ -#define AMD_OUT_OF_MEMORY -1 /* malloc failed, or problem too large */ -#define AMD_INVALID -2 /* input arguments are not valid */ -#define AMD_OK_BUT_JUMBLED 1 /* input matrix is OK for amd_order, but - * columns were not sorted, and/or duplicate entries were present. AMD had - * to do extra work before ordering the matrix. This is a warning, not an - * error. */ - -/* ========================================================================== */ -/* === AMD version ========================================================== */ -/* ========================================================================== */ - -/* AMD Version 1.2 and later include the following definitions. - * As an example, to test if the version you are using is 1.2 or later: - * - * #ifdef AMD_VERSION - * if (AMD_VERSION >= AMD_VERSION_CODE (1,2)) ... - * #endif - * - * This also works during compile-time: - * - * #if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE (1,2)) - * printf ("This is version 1.2 or later\n") ; - * #else - * printf ("This is an early version\n") ; - * #endif - * - * Versions 1.1 and earlier of AMD do not include a #define'd version number. - */ - -#define AMD_DATE "May 4, 2016" -#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define AMD_MAIN_VERSION 2 -#define AMD_SUB_VERSION 4 -#define AMD_SUBSUB_VERSION 6 -#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/external/amd/include/amd_internal.h b/external/amd/include/amd_internal.h deleted file mode 100644 index 3433ac72..00000000 --- a/external/amd/include/amd_internal.h +++ /dev/null @@ -1,326 +0,0 @@ -/* ========================================================================= */ -/* === amd_internal.h ====================================================== */ -/* ========================================================================= */ - -/* ------------------------------------------------------------------------- */ -/* AMD, Copyright (c) Timothy A. Davis, */ -/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */ -/* email: DrTimothyAldenDavis@gmail.com */ -/* ------------------------------------------------------------------------- */ - -/* This file is for internal use in AMD itself, and does not normally need to - * be included in user code (it is included in UMFPACK, however). All others - * should use amd.h instead. - */ - -/* ========================================================================= */ -/* === NDEBUG ============================================================== */ -/* ========================================================================= */ - -/* - * Turning on debugging takes some work (see below). If you do not edit this - * file, then debugging is always turned off, regardless of whether or not - * -DNDEBUG is specified in your compiler options. - * - * If AMD is being compiled as a mexFunction, then MATLAB_MEX_FILE is defined, - * and mxAssert is used instead of assert. If debugging is not enabled, no - * MATLAB include files or functions are used. Thus, the AMD library libamd.a - * can be safely used in either a stand-alone C program or in another - * mexFunction, without any change. - */ - -/* - AMD will be exceedingly slow when running in debug mode. The next three - lines ensure that debugging is turned off. -*/ -// #ifndef NDEBUG -// #define NDEBUG -// #endif - -/* - To enable debugging, uncomment the following line: -*/ -// #undef NDEBUG - -/* ------------------------------------------------------------------------- */ -/* ANSI include files */ -/* ------------------------------------------------------------------------- */ - -/* from stdlib.h: size_t, malloc, free, realloc, and calloc */ -#include - -#if !defined(NPRINT) || !defined(NDEBUG) -/* from stdio.h: printf. Not included if NPRINT is defined at compile time. - * fopen and fscanf are used when debugging. */ -#include -#endif - -/* from limits.h: INT_MAX and LONG_MAX */ -#include - -/* from math.h: sqrt */ -#include - -/* ------------------------------------------------------------------------- */ -/* MATLAB include files (only if being used in or via MATLAB) */ -/* ------------------------------------------------------------------------- */ - -#ifdef MATLAB_MEX_FILE -#include "matrix.h" -#include "mex.h" -#endif - -/* ------------------------------------------------------------------------- */ -/* basic definitions */ -/* ------------------------------------------------------------------------- */ - -#ifdef FLIP -#undef FLIP -#endif - -#ifdef MAX -#undef MAX -#endif - -#ifdef MIN -#undef MIN -#endif - -#ifdef EMPTY -#undef EMPTY -#endif - -#ifdef GLOBAL -#undef GLOBAL -#endif - -#ifdef PRIVATE -#undef PRIVATE -#endif - -/* FLIP is a "negation about -1", and is used to mark an integer i that is - * normally non-negative. FLIP (EMPTY) is EMPTY. FLIP of a number > EMPTY - * is negative, and FLIP of a number < EMTPY is positive. FLIP (FLIP (i)) = i - * for all integers i. UNFLIP (i) is >= EMPTY. */ -#define EMPTY (-1) -#define FLIP(i) (-(i)-2) -#define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i)) - -/* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */ -#define MAX(a,b) (((a) > (b)) ? (a) : (b)) -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -/* logical expression of p implies q: */ -#define IMPLIES(p,q) (!(p) || (q)) - -/* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in . */ -/* The Compaq Alpha also predefines TRUE and FALSE. */ -#ifdef TRUE -#undef TRUE -#endif -#ifdef FALSE -#undef FALSE -#endif - -#define TRUE (1) -#define FALSE (0) -#define PRIVATE static -#define GLOBAL -#define EMPTY (-1) - -/* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */ -/* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0). We */ -/* need to use the ANSI standard value of 0. */ -#ifdef NULL -#undef NULL -#endif - -#define NULL 0 - -/* largest value of size_t */ -#ifndef SIZE_T_MAX -#ifdef SIZE_MAX -/* C99 only */ -#define SIZE_T_MAX SIZE_MAX -#else -#define SIZE_T_MAX ((size_t) (-1)) -#endif -#endif - -/* ------------------------------------------------------------------------- */ -/* integer type for AMD: int or SuiteSparse_long */ -/* ------------------------------------------------------------------------- */ - -#include "amd.h" - -#if defined (DLONG) || defined (ZLONG) - -#define Int SuiteSparse_long -#define ID SuiteSparse_long_id -#define Int_MAX SuiteSparse_long_max - -#define AMD_order amd_l_order -#define AMD_defaults amd_l_defaults -#define AMD_control amd_l_control -#define AMD_info amd_l_info -#define AMD_1 amd_l1 -#define AMD_2 amd_l2 -#define AMD_valid amd_l_valid -#define AMD_aat amd_l_aat -#define AMD_postorder amd_l_postorder -#define AMD_post_tree amd_l_post_tree -#define AMD_dump amd_l_dump -#define AMD_debug amd_l_debug -#define AMD_debug_init amd_l_debug_init -#define AMD_preprocess amd_l_preprocess - -#else - -#define Int int -#define ID "%d" -#define Int_MAX INT_MAX - -#define AMD_order amd_order -#define AMD_defaults amd_defaults -#define AMD_control amd_control -#define AMD_info amd_info -#define AMD_1 amd_1 -#define AMD_2 amd_2 -#define AMD_valid amd_valid -#define AMD_aat amd_aat -#define AMD_postorder amd_postorder -#define AMD_post_tree amd_post_tree -#define AMD_dump amd_dump -#define AMD_debug amd_debug -#define AMD_debug_init amd_debug_init -#define AMD_preprocess amd_preprocess - -#endif - -/* ------------------------------------------------------------------------- */ -/* AMD routine definitions (not user-callable) */ -/* ------------------------------------------------------------------------- */ - -GLOBAL size_t AMD_aat -( - Int n, - const Int Ap [ ], - const Int Ai [ ], - Int Len [ ], - Int Tp [ ], - double Info [ ] -) ; - -GLOBAL void AMD_1 -( - Int n, - const Int Ap [ ], - const Int Ai [ ], - Int P [ ], - Int Pinv [ ], - Int Len [ ], - Int slen, - Int S [ ], - double Control [ ], - double Info [ ] -) ; - -GLOBAL void AMD_postorder -( - Int nn, - Int Parent [ ], - Int Npiv [ ], - Int Fsize [ ], - Int Order [ ], - Int Child [ ], - Int Sibling [ ], - Int Stack [ ] -) ; - -GLOBAL Int AMD_post_tree -( - Int root, - Int k, - Int Child [ ], - const Int Sibling [ ], - Int Order [ ], - Int Stack [ ] -#ifndef NDEBUG - , Int nn -#endif -) ; - -GLOBAL void AMD_preprocess -( - Int n, - const Int Ap [ ], - const Int Ai [ ], - Int Rp [ ], - Int Ri [ ], - Int W [ ], - Int Flag [ ] -) ; - -/* ------------------------------------------------------------------------- */ -/* debugging definitions */ -/* ------------------------------------------------------------------------- */ - -#ifndef NDEBUG - -/* from assert.h: assert macro */ -#include - -#ifndef EXTERN -#define EXTERN extern -#endif - -EXTERN Int AMD_debug ; - -GLOBAL void AMD_debug_init ( char *s ) ; - -GLOBAL void AMD_dump -( - Int n, - Int Pe [ ], - Int Iw [ ], - Int Len [ ], - Int iwlen, - Int pfree, - Int Nv [ ], - Int Next [ ], - Int Last [ ], - Int Head [ ], - Int Elen [ ], - Int Degree [ ], - Int W [ ], - Int nel -) ; - -#ifdef ASSERT -#undef ASSERT -#endif - -/* Use mxAssert if AMD is compiled into a mexFunction */ -#ifdef MATLAB_MEX_FILE -#define ASSERT(expression) (mxAssert ((expression), "")) -#else -#define ASSERT(expression) (assert (expression)) -#endif - -#define AMD_DEBUG0(params) { SUITESPARSE_PRINTF (params) ; } -#define AMD_DEBUG1(params) { if (AMD_debug >= 1) SUITESPARSE_PRINTF (params) ; } -#define AMD_DEBUG2(params) { if (AMD_debug >= 2) SUITESPARSE_PRINTF (params) ; } -#define AMD_DEBUG3(params) { if (AMD_debug >= 3) SUITESPARSE_PRINTF (params) ; } -#define AMD_DEBUG4(params) { if (AMD_debug >= 4) SUITESPARSE_PRINTF (params) ; } - -#else - -/* no debugging */ -#define ASSERT(expression) -#define AMD_DEBUG0(params) -#define AMD_DEBUG1(params) -#define AMD_DEBUG2(params) -#define AMD_DEBUG3(params) -#define AMD_DEBUG4(params) - -#endif diff --git a/external/ldl/Demo/Makefile b/external/ldl/Demo/Makefile new file mode 100644 index 00000000..e1d1d764 --- /dev/null +++ b/external/ldl/Demo/Makefile @@ -0,0 +1,85 @@ +#------------------------------------------------------------------------------- +# LDL Demo Makefile +#------------------------------------------------------------------------------- + +default: all + +include ../../SuiteSparse_config/SuiteSparse_config.mk + +I = -I../../include + +C = $(CC) $(CF) $(I) + +all: library ldlsimple ldllsimple ldlmain ldllmain ldlamd ldllamd + +LIB2 = $(LDFLAGS) -L../../lib -lldl -lamd -lsuitesparseconfig $(LDLIBS) + +library: + ( cd ../Lib ; $(MAKE) ) + ( cd ../../SuiteSparse_config ; $(MAKE) ) + ( cd ../../AMD ; $(MAKE) ) + +#------------------------------------------------------------------------------- +# stand-alone C programs: +#------------------------------------------------------------------------------- + +ldlmain: ldlmain.c + $(C) ldlmain.c -o ldlmain $(LIB2) + - ./ldlmain > my_ldlmain.out + - diff ldlmain.out my_ldlmain.out + +ldllmain: ldlmain.c + $(C) -DLDL_LONG ldlmain.c -o ldllmain $(LIB2) + - ./ldllmain > my_ldllmain.out + - diff ldlmain.out my_ldllmain.out + +ldlsimple: ldlsimple.c + $(C) ldlsimple.c -o ldlsimple $(LIB2) + - ./ldlsimple > my_ldlsimple.out + - diff ldlsimple.out my_ldlsimple.out + +ldllsimple: ldlsimple.c library + $(C) $(I) -DLDL_LONG ldlsimple.c -o ldllsimple $(LIB2) + - ./ldllsimple > my_ldllsimple.out + - diff ldlsimple.out my_ldllsimple.out + +ldlamd: ldlmain.c library + - $(C) -I../../AMD/Include -DUSE_AMD ldlmain.c -o ldlamd $(LIB2) + - ./ldlamd > my_ldlamd.out + - diff ldlamd.out my_ldlamd.out + +ldllamd: ldlmain.c library + - $(C) -DLDL_LONG $(I) -I../../AMD/Include -DUSE_AMD \ + ldlmain.c -o ldllamd $(LIB2) + - ./ldllamd > my_ldllamd.out + - diff ldllamd.out my_ldllamd.out + +run: + - ./ldlsimple > my_ldlsimple.out + - diff ldlsimple.out my_ldlsimple.out + - ./ldllsimple > my_ldllsimple.out + - diff ldlsimple.out my_ldllsimple.out + - ./ldlmain > my_ldlmain.out + - diff ldlmain.out my_ldlmain.out + - ./ldllmain > my_ldllmain.out + - diff ldlmain.out my_ldllmain.out + - ./ldlamd > my_ldlamd.out + - diff ldlamd.out my_ldlamd.out + - ./ldllamd > my_ldllamd.out + - diff ldllamd.out my_ldllamd.out + + +#------------------------------------------------------------------------------- +# clean-up: +#------------------------------------------------------------------------------- + +distclean: purge + +purge: clean + - $(RM) ldlmain ldllmain ldlsimple ldllsimple ldlamd ldllamd + - $(RM) my_ldlmain.out my_ldlamd.out my_ldlsimple.out my_ldllamd.out + - $(RM) my_ldllsimple.out my_ldllmain.out + - $(RM) -r $(PURGE) + +clean: + - $(RM) -r $(CLEAN) diff --git a/external/ldl/Demo/ldllsimple.c b/external/ldl/Demo/ldllsimple.c new file mode 100644 index 00000000..fb8c2b2e --- /dev/null +++ b/external/ldl/Demo/ldllsimple.c @@ -0,0 +1,74 @@ +/* ========================================================================== */ +/* === ldllsimple.c: a simple LDL main program (long integer version) ====== */ +/* ========================================================================== */ + +/* LDLSIMPLE: this is a very simple main program that illustrates the basic + * usage of the LDL routines. The output of this program is in ldlsimple.out. + * This program factorizes the matrix + * + * A =[ ... + * 1.7 0 0 0 0 0 0 0 .13 0 + * 0 1. 0 0 .02 0 0 0 0 .01 + * 0 0 1.5 0 0 0 0 0 0 0 + * 0 0 0 1.1 0 0 0 0 0 0 + * 0 .02 0 0 2.6 0 .16 .09 .52 .53 + * 0 0 0 0 0 1.2 0 0 0 0 + * 0 0 0 0 .16 0 1.3 0 0 .56 + * 0 0 0 0 .09 0 0 1.6 .11 0 + * .13 0 0 0 .52 0 0 .11 1.4 0 + * 0 .01 0 0 .53 0 .56 0 0 3.1 ] ; + * + * and then solves a system Ax=b whose true solution is + * x = [.1 .2 .3 .4 .5 .6 .7 .8 .9 1]' ; + * + * Note that Li and Lx are statically allocated, with length 13. This is just + * enough to hold the factor L, but normally this size is not known until after + * ldl_symbolic has analyzed the matrix. The size of Li and Lx must be greater + * than or equal to lnz = Lp [N], which is 13 for this matrix L. + * + * Copyright (c) 2006 by Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See LDL/Doc/License.txt for the License. + */ + +#ifndef LDL_LONG +#define LDL_LONG +#endif + +#include +#include "ldl.h" +#define N 10 /* A is 10-by-10 */ +#define ANZ 19 /* # of nonzeros on diagonal and upper triangular part of A */ +#define LNZ 13 /* # of nonzeros below the diagonal of L */ +#define Long SuiteSparse_long + +int main (void) +{ + /* only the upper triangular part of A is required */ + Long Ap[N+1] = {0, 1, 2, 3, 4, 6, 7, 9, 11, 15, ANZ}, + Ai [ANZ] = {0, 1, 2, 3, 1,4, 5, 4,6, 4,7, 0,4,7,8, 1,4,6,9 } ; + double Ax [ANZ] = {1.7, 1., 1.5, 1.1, .02,2.6, 1.2, .16,1.3, .09,1.6, + .13,.52,.11,1.4, .01,.53,.56,3.1}, + b [N] = {.287, .22, .45, .44, 2.486, .72, 1.55, 1.424, 1.621, 3.759}; + double Lx [LNZ], D [N], Y [N] ; + Long Li [LNZ], Lp [N+1], Parent [N], Lnz [N], Flag [N], Pattern [N], d, i ; + + /* factorize A into LDL' (P and Pinv not used) */ + ldl_l_symbolic (N, Ap, Ai, Lp, Parent, Lnz, Flag, NULL, NULL) ; + printf ("Nonzeros in L, excluding diagonal: %d\n", Lp [N]) ; + d = ldl_l_numeric (N, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Pattern, + Flag, NULL, NULL) ; + + if (d == N) + { + /* solve Ax=b, overwriting b with the solution x */ + ldl_l_lsolve (N, b, Lp, Li, Lx) ; + ldl_l_dsolve (N, b, D) ; + ldl_l_ltsolve (N, b, Lp, Li, Lx) ; + for (i = 0 ; i < N ; i++) printf ("x [%d] = %g\n", i, b [i]) ; + } + else + { + printf ("ldl_l_numeric failed, D (%d,%d) is zero\n", d, d) ; + } + return (0) ; +} diff --git a/external/ldl/Demo/ldlmain.c b/external/ldl/Demo/ldlmain.c new file mode 100644 index 00000000..ef921fdd --- /dev/null +++ b/external/ldl/Demo/ldlmain.c @@ -0,0 +1,412 @@ +/* ========================================================================== */ +/* === ldlmain.c: LDL main program, for demo and testing ==================== */ +/* ========================================================================== */ + +/* LDLMAIN: this main program has two purposes. It provides an example of how + * to use the LDL routines, and it tests the package. The output of this + * program is in ldlmain.out (without AMD) and ldlamd.out (with AMD). If you + * did not download and install AMD, then the compilation of this program will + * not work with USE_AMD defined. Compare your output with ldlmain.out and + * ldlamd.out. + * + * The program reads in a set of matrices, in the Matrix/ subdirectory. + * The format of the files is as follows: + * + * one line with the matrix description + * one line with 2 integers: n jumbled + * n+1 lines, containing the Ap array of size n+1 (column pointers) + * nz lines, containing the Ai array of size nz (row indices) + * nz lines, containing the Ax array of size nz (numerical values) + * n lines, containing the P permutation array of size n + * + * The Ap, Ai, Ax, and P data structures are described in ldl.c. + * The jumbled flag is 1 if the matrix could contain unsorted columns and/or + * duplicate entries, and 0 otherwise. + * + * Once the matrix is read in, it is checked to see if it is valid. Some + * matrices are invalid by design, to test the error-checking routines. If + * valid, the matrix factorized twice (A and P*A*P'). A linear + * system Ax=b is set up and solved, and the residual computed. + * If any system is not solved accurately, this test will fail. + * + * This program can also be compiled as a MATLAB mexFunction, with the command + * "mex ldlmain.c ldl.c". You can then run the program in MATLAB, with the + * command "ldlmain". + * + * Copyright (c) 2006 by Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See LDL/Doc/License.txt for the License. + */ + +#ifdef MATLAB_MEX_FILE +#ifndef LDL_LONG +#define LDL_LONG +#endif +#endif + +#include +#include +#include "ldl.h" + +#define NMATRICES 30 /* number of test matrices in Matrix/ directory */ +#define LEN 200 /* string length */ + +#ifdef USE_AMD /* get AMD include file, if using AMD */ +#include "amd.h" +#define PROGRAM "ldlamd" +#else +#define PROGRAM "ldlmain" +#endif + +#ifdef MATLAB_MEX_FILE +#include "mex.h" +#define EXIT_ERROR mexErrMsgTxt ("failure") ; +#define EXIT_OK +#else +#define EXIT_ERROR exit (EXIT_FAILURE) ; +#define EXIT_OK exit (EXIT_SUCCESS) ; +#endif + +/* -------------------------------------------------------------------------- */ +/* ALLOC_MEMORY: allocate a block of memory */ +/* -------------------------------------------------------------------------- */ + +#define ALLOC_MEMORY(p,type,size) \ +p = (type *) calloc ((((size) <= 0) ? 1 : (size)) , sizeof (type)) ; \ +if (p == (type *) NULL) \ +{ \ + printf (PROGRAM ": out of memory\n") ; \ + EXIT_ERROR ; \ +} + +/* -------------------------------------------------------------------------- */ +/* FREE_MEMORY: free a block of memory */ +/* -------------------------------------------------------------------------- */ + +#define FREE_MEMORY(p,type) \ +if (p != (type *) NULL) \ +{ \ + free (p) ; \ + p = (type *) NULL ; \ +} + +/* -------------------------------------------------------------------------- */ +/* stand-alone main program, or MATLAB mexFunction */ +/* -------------------------------------------------------------------------- */ + +#ifdef MATLAB_MEX_FILE +void mexFunction +( + int nargout, + mxArray *pargout[ ], + int nargin, + const mxArray *pargin[ ] +) +#else +int main (void) +#endif +{ + + /* ---------------------------------------------------------------------- */ + /* local variables */ + /* ---------------------------------------------------------------------- */ + +#ifdef USE_AMD + double Info [AMD_INFO] ; +#endif + double r, rnorm, flops, maxrnorm = 0. ; + double *Ax, *Lx, *B, *D, *X, *Y ; + LDL_int matrix, *Ai, *Ap, *Li, *Lp, *P, *Pinv, *Perm, *PermInv, n, i, j, p, + nz, *Flag, *Pattern, *Lnz, *Parent, trial, lnz, d, jumbled, ok ; + FILE *f ; + char s [LEN], filename [LEN] ; + + /* ---------------------------------------------------------------------- */ + /* check the error-checking routines with null matrices */ + /* ---------------------------------------------------------------------- */ + + i = 1 ; + n = -1 ; + if (LDL_valid_perm (n, (LDL_int *) NULL, &i) + || !LDL_valid_perm (0, (LDL_int *) NULL, &i) + || LDL_valid_matrix (n, (LDL_int *) NULL, (LDL_int *) NULL) + || LDL_valid_matrix (0, &i, &i)) + { + printf (PROGRAM ": ldl error-checking routine failed\n") ; + EXIT_ERROR ; + } + + /* ---------------------------------------------------------------------- */ + /* read in a factorize a set of matrices */ + /* ---------------------------------------------------------------------- */ + + for (matrix = 1 ; matrix <= NMATRICES ; matrix++) + { + + /* ------------------------------------------------------------------ */ + /* read in the matrix and the permutation */ + /* ------------------------------------------------------------------ */ + + sprintf (filename, "../Matrix/A%02d", (int) matrix) ; + if ((f = fopen (filename, "r")) == (FILE *) NULL) + { + printf (PROGRAM ": could not open file: %s\n", filename) ; + EXIT_ERROR ; + } + printf ("\n\n--------------------------------------------------------"); + printf ("\nInput file: %s\n", filename) ; + s [0] = 0 ; + ok = (fgets (s, LEN, f) != NULL) ; + printf ("%s", s) ; + printf ("--------------------------------------------------------\n\n"); + n = 0 ; + if (ok) + { + ok = ok && (fscanf (f, LDL_ID " " LDL_ID, &n, &jumbled) == 2) ; + n = (n < 0) ? (0) : (n) ; + ALLOC_MEMORY (P, LDL_int, n) ; + ALLOC_MEMORY (Ap, LDL_int, n+1) ; + } + for (j = 0 ; ok && j <= n ; j++) + { + ok = ok && (fscanf (f, LDL_ID, &Ap [j]) == 1) ; + } + nz = 0 ; + if (ok) + { + nz = Ap [n] ; + ALLOC_MEMORY (Ai, LDL_int, nz) ; + ALLOC_MEMORY (Ax, double, nz) ; + } + for (p = 0 ; ok && p < nz ; p++) + { + ok = ok && (fscanf (f, LDL_ID , &Ai [p]) == 1) ; + } + for (p = 0 ; ok && p < nz ; p++) + { + ok = ok && (fscanf (f, "%lg", &Ax [p]) == 1) ; + } + for (j = 0 ; ok && j < n ; j++) + { + ok = ok && (fscanf (f, LDL_ID , &P [j]) == 1) ; + } + fclose (f) ; + if (!ok) + { + printf (PROGRAM ": error reading file: %s\n", filename) ; + EXIT_ERROR ; + } + + /* ------------------------------------------------------------------ */ + /* check the matrix A and the permutation P */ + /* ------------------------------------------------------------------ */ + + ALLOC_MEMORY (Flag, LDL_int, n) ; + + /* To test the error-checking routines, some of the input matrices + * are not valid. So this error is expected to occur. */ + if (!LDL_valid_matrix (n, Ap, Ai) || !LDL_valid_perm (n, P, Flag)) + { + printf (PROGRAM ": invalid matrix and/or permutation\n") ; + FREE_MEMORY (P, LDL_int) ; + FREE_MEMORY (Ap, LDL_int) ; + FREE_MEMORY (Ai, LDL_int) ; + FREE_MEMORY (Ax, double) ; + FREE_MEMORY (Flag, LDL_int) ; + continue ; + } + + /* ------------------------------------------------------------------ */ + /* get the AMD permutation, if available */ + /* ------------------------------------------------------------------ */ + +#ifdef USE_AMD + + /* recompute the permutation with AMD */ + /* Assume that AMD produces a valid permutation P. */ + +#ifdef LDL_LONG + + if (amd_l_order (n, Ap, Ai, P, (double *) NULL, Info) < AMD_OK) + { + printf (PROGRAM ": call to AMD failed\n") ; + EXIT_ERROR ; + } + amd_l_control ((double *) NULL) ; + amd_l_info (Info) ; + +#else + + if (amd_order (n, Ap, Ai, P, (double *) NULL, Info) < AMD_OK) + { + printf (PROGRAM ": call to AMD failed\n") ; + EXIT_ERROR ; + } + amd_control ((double *) NULL) ; + amd_info (Info) ; + +#endif +#endif + + /* ------------------------------------------------------------------ */ + /* allocate workspace and the first part of LDL factorization */ + /* ------------------------------------------------------------------ */ + + ALLOC_MEMORY (Pinv, LDL_int, n) ; + ALLOC_MEMORY (Y, double, n) ; + ALLOC_MEMORY (Pattern, LDL_int, n) ; + ALLOC_MEMORY (Lnz, LDL_int, n) ; + ALLOC_MEMORY (Lp, LDL_int, n+1) ; + ALLOC_MEMORY (Parent, LDL_int, n) ; + ALLOC_MEMORY (D, double, n) ; + ALLOC_MEMORY (B, double, n) ; + ALLOC_MEMORY (X, double, n) ; + + /* ------------------------------------------------------------------ */ + /* factorize twice, with and without permutation */ + /* ------------------------------------------------------------------ */ + + for (trial = 1 ; trial <= 2 ; trial++) + { + + if (trial == 1) + { + printf ("Factorize PAP'=LDL' and solve Ax=b\n") ; + Perm = P ; + PermInv = Pinv ; + } + else + { + printf ("Factorize A=LDL' and solve Ax=b\n") ; + Perm = (LDL_int *) NULL ; + PermInv = (LDL_int *) NULL ; + } + + /* -------------------------------------------------------------- */ + /* symbolic factorization to get Lp, Parent, Lnz, and Pinv */ + /* -------------------------------------------------------------- */ + + LDL_symbolic (n, Ap, Ai, Lp, Parent, Lnz, Flag, Perm, PermInv) ; + lnz = Lp [n] ; + + /* find # of nonzeros in L, and flop count for LDL_numeric */ + flops = 0 ; + for (j = 0 ; j < n ; j++) + { + flops += ((double) Lnz [j]) * (Lnz [j] + 2) ; + } + printf ("Nz in L: "LDL_ID" Flop count: %g\n", lnz, flops) ; + + /* -------------------------------------------------------------- */ + /* allocate remainder of L, of size lnz */ + /* -------------------------------------------------------------- */ + + ALLOC_MEMORY (Li, LDL_int, lnz) ; + ALLOC_MEMORY (Lx, double, lnz) ; + + /* -------------------------------------------------------------- */ + /* numeric factorization to get Li, Lx, and D */ + /* -------------------------------------------------------------- */ + + d = LDL_numeric (n, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, + Y, Flag, Pattern, Perm, PermInv) ; + + /* -------------------------------------------------------------- */ + /* solve, or report singular case */ + /* -------------------------------------------------------------- */ + + if (d != n) + { + printf ("Ax=b not solved since D("LDL_ID","LDL_ID") is zero.\n", d, d) ; + } + else + { + /* construct the right-hand-side, B */ + for (i = 0 ; i < n ; i++) + { + B [i] = 1 + ((double) i) / 100 ; + } + + /* solve Ax=b */ + if (trial == 1) + { + /* the factorization is LDL' = PAP' */ + LDL_perm (n, Y, B, P) ; /* y = Pb */ + LDL_lsolve (n, Y, Lp, Li, Lx) ; /* y = L\y */ + LDL_dsolve (n, Y, D) ; /* y = D\y */ + LDL_ltsolve (n, Y, Lp, Li, Lx) ; /* y = L'\y */ + LDL_permt (n, X, Y, P) ; /* x = P'y */ + } + else + { + /* the factorization is LDL' = A */ + for (i = 0 ; i < n ; i++) /* x = b */ + { + X [i] = B [i] ; + } + LDL_lsolve (n, X, Lp, Li, Lx) ; /* x = L\x */ + LDL_dsolve (n, X, D) ; /* x = D\x */ + LDL_ltsolve (n, X, Lp, Li, Lx) ; /* x = L'\x */ + } + + /* compute the residual y = Ax-b */ + /* note that this code can tolerate a jumbled matrix */ + for (i = 0 ; i < n ; i++) + { + Y [i] = -B [i] ; + } + for (j = 0 ; j < n ; j++) + { + for (p = Ap [j] ; p < Ap [j+1] ; p++) + { + Y [Ai [p]] += Ax [p] * X [j] ; + } + } + /* rnorm = norm (y, inf) */ + rnorm = 0 ; + for (i = 0 ; i < n ; i++) + { + r = (Y [i] > 0) ? (Y [i]) : (-Y [i]) ; + rnorm = (r > rnorm) ? (r) : (rnorm) ; + } + maxrnorm = (rnorm > maxrnorm) ? (rnorm) : (maxrnorm) ; + printf ("relative maxnorm of residual: %g\n", rnorm) ; + } + + /* -------------------------------------------------------------- */ + /* free the size-lnz part of L */ + /* -------------------------------------------------------------- */ + + FREE_MEMORY (Li, LDL_int) ; + FREE_MEMORY (Lx, double) ; + + } + + /* free everything */ + FREE_MEMORY (P, LDL_int) ; + FREE_MEMORY (Ap, LDL_int) ; + FREE_MEMORY (Ai, LDL_int) ; + FREE_MEMORY (Ax, double) ; + FREE_MEMORY (Pinv, LDL_int) ; + FREE_MEMORY (Y, double) ; + FREE_MEMORY (Flag, LDL_int) ; + FREE_MEMORY (Pattern, LDL_int) ; + FREE_MEMORY (Lnz, LDL_int) ; + FREE_MEMORY (Lp, LDL_int) ; + FREE_MEMORY (Parent, LDL_int) ; + FREE_MEMORY (D, double) ; + FREE_MEMORY (B, double) ; + FREE_MEMORY (X, double) ; + } + + printf ("\nLargest residual during all tests: %g\n", maxrnorm) ; + if (maxrnorm < 1e-8) + { + printf ("\n" PROGRAM ": all tests passed\n") ; + EXIT_OK ; + } + else + { + printf ("\n" PROGRAM ": one more tests failed (residual too high)\n") ; + EXIT_ERROR ; + } +} diff --git a/external/ldl/Demo/ldlsimple.c b/external/ldl/Demo/ldlsimple.c new file mode 100644 index 00000000..19cd21ab --- /dev/null +++ b/external/ldl/Demo/ldlsimple.c @@ -0,0 +1,69 @@ +/* ========================================================================== */ +/* === ldlsimple.c: a simple LDL main program ============================== */ +/* ========================================================================== */ + +/* LDLSIMPLE: this is a very simple main program that illustrates the basic + * usage of the LDL routines. The output of this program is in ldlsimple.out. + * This program factorizes the matrix + * + * A =[ ... + * 1.7 0 0 0 0 0 0 0 .13 0 + * 0 1. 0 0 .02 0 0 0 0 .01 + * 0 0 1.5 0 0 0 0 0 0 0 + * 0 0 0 1.1 0 0 0 0 0 0 + * 0 .02 0 0 2.6 0 .16 .09 .52 .53 + * 0 0 0 0 0 1.2 0 0 0 0 + * 0 0 0 0 .16 0 1.3 0 0 .56 + * 0 0 0 0 .09 0 0 1.6 .11 0 + * .13 0 0 0 .52 0 0 .11 1.4 0 + * 0 .01 0 0 .53 0 .56 0 0 3.1 ] ; + * + * and then solves a system Ax=b whose true solution is + * x = [.1 .2 .3 .4 .5 .6 .7 .8 .9 1]' ; + * + * Note that Li and Lx are statically allocated, with length 13. This is just + * enough to hold the factor L, but normally this size is not known until after + * ldl_symbolic has analyzed the matrix. The size of Li and Lx must be greater + * than or equal to lnz = Lp [N], which is 13 for this matrix L. + * + * Copyright (c) 2006 by Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See LDL/Doc/License.txt for the License. + */ + +#include +#include "ldl.h" +#define N 10 /* A is 10-by-10 */ +#define ANZ 19 /* # of nonzeros on diagonal and upper triangular part of A */ +#define LNZ 13 /* # of nonzeros below the diagonal of L */ + +int main (void) +{ + /* only the upper triangular part of A is required */ + int Ap [N+1] = {0, 1, 2, 3, 4, 6, 7, 9, 11, 15, ANZ}, + Ai [ANZ] = {0, 1, 2, 3, 1,4, 5, 4,6, 4,7, 0,4,7,8, 1,4,6,9 } ; + double Ax [ANZ] = {1.7, 1., 1.5, 1.1, .02,2.6, 1.2, .16,1.3, .09,1.6, + .13,.52,.11,1.4, .01,.53,.56,3.1}, + b [N] = {.287, .22, .45, .44, 2.486, .72, 1.55, 1.424, 1.621, 3.759}; + double Lx [LNZ], D [N], Y [N] ; + int Li [LNZ], Lp [N+1], Parent [N], Lnz [N], Flag [N], Pattern [N], d, i ; + + /* factorize A into LDL' (P and Pinv not used) */ + ldl_symbolic (N, Ap, Ai, Lp, Parent, Lnz, Flag, NULL, NULL) ; + printf ("Nonzeros in L, excluding diagonal: %d\n", Lp [N]) ; + d = ldl_numeric (N, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Pattern, + Flag, NULL, NULL) ; + + if (d == N) + { + /* solve Ax=b, overwriting b with the solution x */ + ldl_lsolve (N, b, Lp, Li, Lx) ; + ldl_dsolve (N, b, D) ; + ldl_ltsolve (N, b, Lp, Li, Lx) ; + for (i = 0 ; i < N ; i++) printf ("x [%d] = %g\n", i, b [i]) ; + } + else + { + printf ("ldl_numeric failed, D (%d,%d) is zero\n", d, d) ; + } + return (0) ; +} diff --git a/external/ldl/Doc/ChangeLog b/external/ldl/Doc/ChangeLog new file mode 100644 index 00000000..a92d9337 --- /dev/null +++ b/external/ldl/Doc/ChangeLog @@ -0,0 +1,84 @@ +May 4, 2016: version 2.2.6 + + * minor changes to Makefile + +Apr 1, 2016: version 2.2.5 + + * licensing simplified (no other change); refer to LDL/Doc/License.txt + +Feb 1, 2016: version 2.2.4 + + * update to Makefiles + +Jan 30, 2016: version 2.2.3 + + * modifications to Makefiles + +Jan 1, 2016: version 2.2.2 + + * modified Makefile to create shared libraries + No change to C code except version number + +Oct 10, 2014: version 2.2.1 + + modified MATLAB/ldl_make.m. No change to C code except version number. + +July 31, 2013: version 2.2.0 + + * changed malloc and printf pointers to use SuiteSparse_config + +Jun 1, 2012: version 2.1.0 + + * UFconfig replaced with SuiteSparse_config + +Dec 7, 2011: version 2.0.4 + + * fixed the Makefile to better align with CFLAGS and other standards + * modified the demo program to check for errors in input test matrices + +Jan 25, 2011: version 2.0.3 + + * minor fix to "make install" + +Nov 30, 2009: version 2.0.2 + + * added "make install" and "make uninstall" + +May 31, 2007: version 2.0.0 + + * C-callable 64-bit version added + + * ported to 64-bit MATLAB + + * subdirectories added (Source/, Include/, Lib/, Demo/, Doc/, MATLAB/) + +Dec 12, 2006: version 1.3.4 + + * minor MATLAB cleanup + +Sept 11, 2006: version 1.3.1 + + * The ldl m-file renamed to ldlsparse, to avoid name conflict with the + new MATLAB ldl function (in MATLAB 7.3). + +Apr 30, 2006: version 1.3 + + * requires AMD v2.0. ldlmain.c demo program modified, since AMD can now + handle jumbled matrices. Minor change to Makefile. + +Aug 30, 2005: + + * Makefile changed to use ../UFconfig/UFconfig.mk. default license changed + +July 4, 2005: + + * user guide added. Since no changes to the code were made, + the version number (1.1) and code release date (Apr 22, 2005) + were left unchanged. + +Apr. 22, 2005: LDL v1.1 released. + + * No real changes were made. The code was revised so + that each routine fits on a single page in the documentation. + +Dec 31, 2003: LDL v1.0 released. diff --git a/external/ldl/Doc/License.txt b/external/ldl/Doc/License.txt new file mode 100644 index 00000000..5fec545f --- /dev/null +++ b/external/ldl/Doc/License.txt @@ -0,0 +1,19 @@ +LDL Copyright (c) 2005-2013 by Timothy A. Davis. +LDL is also available under other licenses; contact the author for details. +http://www.suitesparse.com + +-------------------------------------------------------------------------------- + +LDL is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +LDL is distributed in the hope that 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 Lesser General Public +License along with this Module; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/external/ldl/Doc/Makefile b/external/ldl/Doc/Makefile new file mode 100644 index 00000000..8d35ffb8 --- /dev/null +++ b/external/ldl/Doc/Makefile @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------- +# Makefile for the LDL documentation +#------------------------------------------------------------------------------- + +default: ldl_userguide.pdf + +include ../../SuiteSparse_config/SuiteSparse_config.mk + +#------------------------------------------------------------------------------- +# clean-up: +#------------------------------------------------------------------------------- + +distclean: purge + +purge: clean + - $(RM) -r $(PURGE) + +clean: + - $(RM) -r $(CLEAN) + +#------------------------------------------------------------------------------- +# user guide: +#------------------------------------------------------------------------------- + +ldl_userguide.pdf: ldl_userguide.tex ldl.bib + latex ldl_userguide + - bibtex ldl_userguide + latex ldl_userguide + latex ldl_userguide + dvips ldl_userguide -o ldl_userguide.ps + pdflatex ldl_userguide + pdflatex ldl_userguide + - $(RM) *.dvi *.aux *.log *.bak *.bbl *.blg *.ps diff --git a/external/ldl/Doc/ldl.bib b/external/ldl/Doc/ldl.bib new file mode 100644 index 00000000..3d87f167 --- /dev/null +++ b/external/ldl/Doc/ldl.bib @@ -0,0 +1,150 @@ +@string{TOMS = "{ACM} Trans. Math. Softw."} +@string{SIMAX = "{SIAM} J. Matrix Anal. Applic."} +@string{SIAMJSC = "{SIAM} J. Sci. Comput."} +@string{SIAMJSSC = "{SIAM} J. Sci. Statist. Comput."} + +@article{AmestoyDavisDuff96, + author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.}, + title={An approximate minimum degree ordering algorithm}, + journal=SIMAX, + year={1996} + ,volume={17} + ,number={4} + ,pages={886-905} + } + +@article{AmestoyDavisDuff03, + author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.}, + title={Algorithm 837: {AMD}, an approximate minimum degree ordering algorithm}, + journal=TOMS, + year={2004} + ,volume={30} + ,number={3} + ,pages={381-388}} + +@article{Davis05, + author={Davis, T. A}, + title={Algorithm 849: a concise sparse Cholesky factorization package}, + journal=TOMS, + year={2005}, + volume={31}, + number={4}, + pages={587--591} + } + +@article{GeorgeLiu79, + author={George, A. and Liu, J. W. H.}, + month={Jun.}, + year={1979}, + title={The Design of a User Interface for a Sparse Matrix Package}, + journal=TOMS, + annote={f}, + volume={5}, + number={2}, + pages={139-162}, + keywords={software user interface SPARSPAK}} + +@book{GeorgeLiu, + author={George, A. and Liu, J. W. H.}, + year={1981}, + title={Computer Solution of Large Sparse Positive Definite Systems}, + address={Englewood Cliffs, New Jersey}, + publisher={Prentice-Hall}, + keywords={ positive definite systems}, + annote={sh} + } + +@article{GilbertMolerSchreiber, + author={Gilbert, J. R. and Moler, C. and Schreiber, R.}, + title={Sparse matrices in {MATLAB}: design and implementation}, + journal=SIMAX, + year={1992} + ,volume={13} + ,number={1} + ,pages={333-356} + ,annote={f} + } + +@article{GilbertNgPeyton94, + author={Gilbert, J. R. and Ng, E. G. and Peyton, B. W.}, + title={An efficient algorithm to compute row and column counts for sparse {C}holesky factorization}, + journal=SIMAX, + year={1994} + ,volume={15} + ,number={4} + ,pages={1075-1091} + ,annote={f} + } + +@article{GilbertPeierls88, + author={Gilbert, J. R. and Peierls, T.}, + year={1988}, + title={Sparse Partial Pivoting in Time Proportional to Arithmetic Operations}, + journal=SIAMJSSC, + annote={f}, + volume={9}, + pages={862-874}, + keywords={316 partial pivoting, graph algorithms}} + +@article{Liu86c, + author={Liu, J. W. H.}, + month={Jun.}, + year={1986}, + title={A Compact Row Storage Scheme for {C}holesky Factors Using Elimination Trees}, + journal=TOMS, + volume={12}, + number={2}, + pages={127-148}, + annote={f. previously Report CS-84-02, Dept. Computer Science, York University (1984)}} + +@article{Liu90a, + author={Liu, J. W. H.}, + title={The Role of Elimination Trees in Sparse Factorization}, + journal=SIMAX, + year={1990} + ,volume={11} + ,number={1} + ,pages={134-172} + ,annote={f} + } + +@article{Liu91, + author={Liu, J. W. H.}, + title={A generalized envelope method for sparse factorization by rows}, + journal=TOMS, + year={1991} + ,volume={17} + ,number={1} + ,pages={112-129} + ,annote={f} + } + +@article{NgPeyton93, + author={Ng, E. G. and Peyton, B. W.}, + title={A supernodal {Cholesky} factorization algorithm for shared-memory multiprocessors}, + journal=SIAMJSC, + year={1993} + ,volume={14} + ,pages={761-769} + ,annote={f} + } + +@article{RothbergGupta91, + author={Rothberg, E. and Gupta, A.}, + title={Efficient sparse matrix factorization on high-performance workstations - {E}xploiting the memory hierarchy}, + journal=TOMS, + year={1991} + ,volume={17} + ,number={3} + ,pages={313-334} + ,annote={f} + } + +@techreport{Stewart03, + author={Stewart, G. W.}, + title={Building an old-fashioned sparse solver}, + institution={Univ. Maryland (www.umd.cs.edu/$\sim$stewart)}, + year={2003} + ,annote={f} + } + diff --git a/external/ldl/Doc/ldl_userguide.pdf b/external/ldl/Doc/ldl_userguide.pdf new file mode 100644 index 00000000..322a77e2 Binary files /dev/null and b/external/ldl/Doc/ldl_userguide.pdf differ diff --git a/external/ldl/Doc/ldl_userguide.tex b/external/ldl/Doc/ldl_userguide.tex new file mode 100644 index 00000000..e99030e7 --- /dev/null +++ b/external/ldl/Doc/ldl_userguide.tex @@ -0,0 +1,655 @@ +\documentclass[12pt]{article} + +\newcommand{\m}[1]{{\bf{#1}}} % for matrices and vectors +\newcommand{\tr}{^{\sf T}} % transpose + +\topmargin 0in +\textheight 9in +\oddsidemargin 0pt +\evensidemargin 0pt +\textwidth 6.5in + +%------------------------------------------------------------------------------- +\begin{document} +%------------------------------------------------------------------------------- + +\title{User Guide for LDL, a concise sparse Cholesky package} +\author{Timothy A. Davis\thanks{ +email: DrTimothyAldenDavis@gmail.com, +http://www.suitesparse.com. +This work was supported by the National +Science Foundation, under grant CCR-0203270. +Portions of the work were done while on sabbatical at Stanford University +and Lawrence Berkeley National Laboratory (with funding from Stanford +University and the SciDAC program). +}} + +\date{VERSION 2.2.6, May 4, 2016} + +\maketitle + +%------------------------------------------------------------------------------- +\begin{abstract} +The {\tt LDL} software package is a set of short, concise routines for +factorizing symmetric positive-definite sparse matrices, with some +applicability to symmetric indefinite matrices. Its primary purpose is +to illustrate much of the basic theory of sparse matrix algorithms in as +concise a code as possible, including an elegant method +of sparse symmetric factorization that computes the factorization row-by-row +but stores it column-by-column. The entire symbolic and numeric factorization +consists of less than 50 lines of code. The package is written in C, +and includes a MATLAB interface. +\end{abstract} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +\section{Overview} +%------------------------------------------------------------------------------- + +{\tt LDL} is a set of short, concise routines that compute the $\m{LDL}\tr$ +factorization of a sparse symmetric matrix $\m{A}$. Its primary purpose is +to illustrate much of the basic theory of sparse matrix algorithms in as +compact a code as possible, including an elegant method of +sparse symmetric factorization (related to \cite{Liu86c,Liu91}). +The lower triangular factor $\m{L}$ is computed row-by-row, in contrast to the +conventional column-by-column method. +Although it does not achieve the same level of performance +as methods based on dense matrix kernels +(such as \cite{NgPeyton93,RothbergGupta91}), +its performance is competitive with column-by-column methods that do not +use dense kernels \cite{GeorgeLiu79, GeorgeLiu, GilbertMolerSchreiber}. + +Section~\ref{Algorithm} gives a brief description of the algorithm +used in the symbolic and numeric factorization. A more detailed tutorial-level +discussion may be found in \cite{Stewart03}. Details +of the concise implementation of this method are given in +Section~\ref{Implementation}. Sections~\ref{MATLAB}~and~\ref{C} give an +overview of how to use the package in MATLAB and in a stand-alone C program. + +%------------------------------------------------------------------------------- +\section{Algorithm} +\label{Algorithm} +%------------------------------------------------------------------------------- + +The underlying numerical algorithm is described below. The $k$th +step solves a lower triangular system of dimension $k-1$ to compute the +$k$th row of $\m{L}$ and the $d_{kk}$ entry of the diagonal matrix $\m{D}$. +Colon notation is used for submatrices. For example, +$\m{L}_{k,1:k-1}$ refers to the first $k-1$ columns of +the $k$th row of $\m{L}$. Similarly, $\m{L}_{1:k-1,1:k-1}$ refers to +the leading $(k-1)$-by-$(k-1)$ submatrix of $\m{L}$. +%--------------- +\vspace{-0.2in} +\begin{tabbing} +\hspace{2em} \= \hspace{2em} \= \hspace{2em} \= \\ +{\bf Algorithm~1 +($\m{LDL}\tr$ factorization of a $n$-by-$n$ symmetric matrix $\m{A}$)} \\ +\> {\bf for} $k = 1$ {\bf to} $n$ \\ +\>\> (step 1) Solve $\m{L}_{1:k-1,1:k-1}\m{y} = \m{A}_{1:k-1,k}$ for $\m{y}$ \\ +\>\> (step 2) $\m{L}_{k,1:k-1} = (\m{D}_{1:k-1,1:k-1}^{-1} \m{y})\tr$ \\ +\>\> (step 3) $l_{kk} = 1$ \\ +\>\> (step 4) $d_{kk} = a_{kk} - \m{L}_{k,1:k-1}\m{y}$ \\ +\> {\bf end for} +\end{tabbing} +%--------------- + +The algorithm computes an $\m{LDL}\tr$ factorization without numerical pivoting. +It can thus factorize any symmetric positive definite matrix, and any +symmetric indefinite matrix whose leading minors are all well-conditioned. + +When $\m{A}$ and $\m{L}$ are sparse, step 1 of Algorithm~1 requires a +triangular solve of the form $\m{Lx}=\m{b}$, where all three terms in +the equation are sparse. This is the most costly step of the Algorithm. +Steps 2 through 4 are fairly straightforward. + +Let ${\cal X}$ and ${\cal B}$ refer to the set of indices of nonzero entries +in $\m{x}$ and $\m{b}$, respectively, in the lower triangular system +$\m{Lx}=\m{b}$. To compute $\m{x}$ efficiently +the nonzero pattern ${\cal X}$ must be found first. +In the general case when $\m{L}$ is arbitrary \cite{GilbertPeierls88}, +the nonzero +pattern ${\cal X}$ is the set of nodes reachable via paths in the graph $G_L$ +from all nodes in the set ${\cal B}$, and where the graph $G_L$ has +$n$ nodes and a directed edge $(j,i)$ if and only if $l_{ij}$ is nonzero. +To compute the numerical solution to $\m{Lx}=\m{b}$ by accessing the columns of +$\m{L}$ one at a time, ${\cal X}$ can be traversed +in any topological order of the subgraph of $G_L$ consisting of nodes in +${\cal X}$. That is, $x_j$ must be computed before $x_i$ if there is a path +from $j$ to $i$ in $G_L$. The natural order ($1, 2, \ldots, n$) is one such +ordering, but that requires a costly sort of ${\cal X}$. +With a graph traversal and topological sort, the solution of $\m{Lx}=\m{b}$ +can be computed using Algorithm~2 below. +The computation of ${\cal X}$ and $\m{x}$ both take +time proportional to the floating-point operation count. +%--------------- +\vspace{-0.2in} +\begin{tabbing} +\hspace{2em} \= \hspace{2em} \= \hspace{2em} \= \\ +{\bf Algorithm~2 +(Solve $\m{Lx}=\m{b}$, where $\m{L}$ is lower triangular with unit diagonal)} \\ +\> ${\cal X} = \mbox{Reach}_{G_L} ({\cal B})$ \\ +\> $\m{x} = \m{b}$ \\ +\> {\bf for} $i \in {\cal X}$ in any topological order \\ +\>\> $\m{x}_{i+1:n} = \m{x}_{i+1:n} - \m{L}_{i+1:n,i} x_i$ \\ +\> {\bf end for} +\end{tabbing} +%--------------- + +The general result also governs the pattern of $\m{y}$ in Algorithm~1. +However, in this case $\m{L}$ arises from a sparse Cholesky factorization, +and is governed by the elimination tree \cite{Liu90a}. +A general graph traversal is not required. +In the elimination tree, the parent of node $i$ is the smallest $j > i$ +such that $l_{ji}$ is nonzero. Node $i$ has no parent if column $i$ of +$\m{L}$ is completely zero below the diagonal; $i$ is a root of the +elimination tree in this case. The nonzero pattern of $\m{x}$ is the +union of all the nodes on the paths from any node $i$ (where $b_i$ is nonzero) to the +root of the elimination tree \cite[Thm 2.4]{Liu86c}. It is referred to here as a tree, +but in general it can be a forest. + +Rather than a general topological sort of the subgraph of $G_L$ consisting +nodes reachable from nodes in ${\cal B}$, a simpler +tree traversal can be used. First, select any nonzero entry $b_i$ +and follow the path from $i$ to the root of tree. +Nodes along this path are marked and placed in a stack, +with $i$ at the top of the +stack and the root at the bottom. +Repeat for every other nonzero entry in $b_i$, in arbitrary order, but stop +just before reaching a marked node (the result can be empty if $i$ is already +in the stack). The stack now contains ${\cal X}$, a topological ordering of +the nonzero pattern of $\m{x}$, which can be used in Algorithm~2 to solve +$\m{Lx}=\m{b}$. The time to compute ${\cal X}$ +using an elimination tree traversal is much faster than the general graph +traversal, taking time proportional to the size of ${\cal X}$ rather than the +number of floating-point operations required to compute $\m{x}$. + +In the $k$th step of the factorization, the set ${\cal X}$ becomes the +nonzero pattern of row $k$ of $\m{L}$. This step requires the elimination +tree of $\m{L}_{1:k-1,1:k-1}$, and must construct the elimination tree of +$\m{L}_{1:k,1:k}$ for step $k+1$. Recall that the parent of $i$ in the +tree is the smallest $j$ such that $i < j$ and $l_{ji} \ne 0$. +Thus, if any node $i$ already has a parent $j$, then $j$ will remain the +parent of $i$ in the elimination trees of all other larger leading submatrices +of $\m{L}$, and in the elimination tree of $\m{L}$ itself. +If $l_{ki} \ne 0$ and $i$ does not have a parent in the elimination tree of +$\m{L}_{1:k-1,1:k-1}$, then the parent of $i$ is $k$ +in the elimination tree of $\m{L}_{1:k,1:k}$. +Node $k$ becomes the parent of any node $i \in {\cal X}$ that does not yet +have a parent. + +Since Algorithm~2 traverses $\m{L}$ in column order, $\m{L}$ is stored in a +conventional sparse column representation. Each column $j$ is stored as a list +of nonzero values and their corresponding row indices. When row $k$ is +computed, the new entries can be placed at the end of each list. As +a by-product of computing $\m{L}$ one row at a time, +the columns of $\m{L}$ are computed in a sorted manner. This is a convenient +form of the output. +MATLAB requires the columns of its sparse matrices to be sorted, for example. +Sorted columns improve the speed of Algorithm~2, since the memory access +pattern is more regular. The conventional column-by-column algorithm +\cite{GeorgeLiu79,GeorgeLiu} does not produce columns of $\m{L}$ with +sorted row indices. + +A simple symbolic pre-analysis can be obtained by repeating the subtree traversals. +All that is required to compute the nonzero pattern of +the $k$th row of $\m{L}$ is the partially constructed elimination tree +and the nonzero pattern of the $k$th column of $\m{A}$. This is computed +in time proportional to the size of this set, using the elimination tree +traversal. Once constructed, the number of nonzeros in each column of +$\m{L}$ is incremented, for each entry in ${\cal X}$, and then ${\cal X}$ +is discarded. The set ${\cal X}$ need not be constructed in topological +order, so no stack is required. The run time of the symbolic analysis +algorithm is thus proportional to the number of nonzeros in $\m{L}$. +This is more costly than the optimal algorithm \cite{GilbertNgPeyton94}, +which takes time essentially proportional to the number of nonzeros in $\m{A}$. +The memory requirements are just the matrix $\m{A}$ and a few size-$n$ integer +arrays. The result of the algorithm is the elimination tree, a count +of the number of nonzeros in each column of $\m{L}$, and +the cumulative sum of the column counts. + +%------------------------------------------------------------------------------- +\section{Implementation} +\label{Implementation} +%------------------------------------------------------------------------------- + +Because of its simplicity, the implementation of this algorithm leads to +a very short, concise code. The symbolic analysis routine {\tt ldl\_symbolic} +shown in Figure~\ref{ldlsymbolic} +consists of only 18 lines of executable C code. +This includes 5 lines of code to allow for a +sparsity-preserving ordering $\m{P}$ so that either $\m{A}$ or $\m{PAP}\tr$ +can be analyzed, 3 lines of code to compute the cumulative sum of +the column counts, and one line of code to speed up a {\tt for} loop. +An additional line of code allows for a more general form of the input +sparse matrix $\m{A}$. + +The {\tt n}-by-{\tt n} sparse matrix $\m{A}$ is provided in compressed column +form as an {\tt int} array {\tt Ap} of length {\tt n+1}, +an {\tt int} array {\tt Ai} of length {\tt nz}, +and a {\tt double} array {\tt Ax} also of length {\tt nz}, +where {\tt nz} is the number of entries in the matrix. +The numerical values of entries in column $j$ are stored in +{\tt Ax[Ap[j]} $\ldots$ {\tt Ap[j+1]-1]} +and the corresponding row indices are in +{\tt Ai[Ap[j]} $\ldots$ {\tt Ap[j+1]-1]}. +With {\tt Ap[0] = 0}, the number of entries in the matrix is {\tt nz = Ap[n]}. +If no fill-reducing ordering {\tt P} is provided, +only entries in the upper triangular part of $\m{A}$ are considered. +If {\tt P} is provided and row/column {\tt i} of the +matrix $\m{A}$ is the {\tt k}-th row/column of $\m{PAP}\tr$, then {\tt P[k]=i}. +Only entries in the upper +triangular part of $\m{PAP}\tr$ are considered. These entries may be +in the lower triangular part of $\m{A}$, so to ensure that the correct matrix +is factorized, all entries of $\m{A}$ should be provided when using the +permutation input {\tt P}. + +The outputs of {\tt ldl\_symbolic} are three size-{\tt n} arrays: +{\tt Parent} holds the elimination tree, +{\tt Lnz} holds the counts of the number of entries in each column of +$\m{L}$, and +{\tt Lp} holds the cumulative sum of {\tt Lnz}. +The size-{\tt n} array {\tt Flag} is used as workspace. +None of the output or workspace arrays need to be initialized. + +\begin{figure} +\caption{{\tt ldl\_symbolic:} finding the elimination tree and column counts} +\label{ldlsymbolic} +{\scriptsize +\begin{verbatim} +void ldl_symbolic +( + int n, /* A and L are n-by-n, where n >= 0 */ + int Ap [ ], /* input of size n+1, not modified */ + int Ai [ ], /* input of size nz=Ap[n], not modified */ + int Lp [ ], /* output of size n+1, not defined on input */ + int Parent [ ], /* output of size n, not defined on input */ + int Lnz [ ], /* output of size n, not defined on input */ + int Flag [ ], /* workspace of size n, not defn. on input or output */ + int P [ ], /* optional input of size n */ + int Pinv [ ] /* optional output of size n (used if P is not NULL) */ +) +{ + int i, k, p, kk, p2 ; + if (P) + { + /* If P is present then compute Pinv, the inverse of P */ + for (k = 0 ; k < n ; k++) + { + Pinv [P [k]] = k ; + } + } + for (k = 0 ; k < n ; k++) + { + /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */ + Parent [k] = -1 ; /* parent of k is not yet known */ + Flag [k] = k ; /* mark node k as visited */ + Lnz [k] = 0 ; /* count of nonzeros in column k of L */ + kk = (P) ? (P [k]) : (k) ; /* kth original, or permuted, column */ + p2 = Ap [kk+1] ; + for (p = Ap [kk] ; p < p2 ; p++) + { + /* A (i,k) is nonzero (original or permuted A) */ + i = (Pinv) ? (Pinv [Ai [p]]) : (Ai [p]) ; + if (i < k) + { + /* follow path from i to root of etree, stop at flagged node */ + for ( ; Flag [i] != k ; i = Parent [i]) + { + /* find parent of i if not yet determined */ + if (Parent [i] == -1) Parent [i] = k ; + Lnz [i]++ ; /* L (k,i) is nonzero */ + Flag [i] = k ; /* mark i as visited */ + } + } + } + } + /* construct Lp index array from Lnz column counts */ + Lp [0] = 0 ; + for (k = 0 ; k < n ; k++) + { + Lp [k+1] = Lp [k] + Lnz [k] ; + } +} +\end{verbatim} +} +\end{figure} + +The {\tt ldl\_numeric} numeric factorization routine shown +in Figure~\ref{ldlnumeric} consists of only 31 lines of +executable code. It includes this same subtree traversal algorithm +as {\tt ldl\_symbolic}, +except that each path is placed on a stack that holds +nonzero pattern of the $k$th row of $\m{L}$. +This traversal is followed by a sparse forward solve +using this pattern, and all of the nonzero entries in +the resulting $k$th row of $\m{L}$ are appended to their respective columns +in the data structure of $\m{L}$. + +\begin{figure} +\caption{{\tt ldl\_numeric:} numeric factorization} +\label{ldlnumeric} +{\scriptsize +\begin{verbatim} +int ldl_numeric /* returns n if successful, k if D (k,k) is zero */ +( + int n, /* A and L are n-by-n, where n >= 0 */ + int Ap [ ], /* input of size n+1, not modified */ + int Ai [ ], /* input of size nz=Ap[n], not modified */ + double Ax [ ], /* input of size nz=Ap[n], not modified */ + int Lp [ ], /* input of size n+1, not modified */ + int Parent [ ], /* input of size n, not modified */ + int Lnz [ ], /* output of size n, not defn. on input */ + int Li [ ], /* output of size lnz=Lp[n], not defined on input */ + double Lx [ ], /* output of size lnz=Lp[n], not defined on input */ + double D [ ], /* output of size n, not defined on input */ + double Y [ ], /* workspace of size n, not defn. on input or output */ + int Pattern [ ], /* workspace of size n, not defn. on input or output */ + int Flag [ ], /* workspace of size n, not defn. on input or output */ + int P [ ], /* optional input of size n */ + int Pinv [ ] /* optional input of size n */ +) +{ + double yi, l_ki ; + int i, k, p, kk, p2, len, top ; + for (k = 0 ; k < n ; k++) + { + /* compute nonzero Pattern of kth row of L, in topological order */ + Y [k] = 0.0 ; /* Y(0:k) is now all zero */ + top = n ; /* stack for pattern is empty */ + Flag [k] = k ; /* mark node k as visited */ + Lnz [k] = 0 ; /* count of nonzeros in column k of L */ + kk = (P) ? (P [k]) : (k) ; /* kth original, or permuted, column */ + p2 = Ap [kk+1] ; + for (p = Ap [kk] ; p < p2 ; p++) + { + i = (Pinv) ? (Pinv [Ai [p]]) : (Ai [p]) ; /* get A(i,k) */ + if (i <= k) + { + Y [i] += Ax [p] ; /* scatter A(i,k) into Y (sum duplicates) */ + for (len = 0 ; Flag [i] != k ; i = Parent [i]) + { + Pattern [len++] = i ; /* L(k,i) is nonzero */ + Flag [i] = k ; /* mark i as visited */ + } + while (len > 0) Pattern [--top] = Pattern [--len] ; + } + } + /* compute numerical values kth row of L (a sparse triangular solve) */ + D [k] = Y [k] ; /* get D(k,k) and clear Y(k) */ + Y [k] = 0.0 ; + for ( ; top < n ; top++) + { + i = Pattern [top] ; /* Pattern [top:n-1] is pattern of L(:,k) */ + yi = Y [i] ; /* get and clear Y(i) */ + Y [i] = 0.0 ; + p2 = Lp [i] + Lnz [i] ; + for (p = Lp [i] ; p < p2 ; p++) + { + Y [Li [p]] -= Lx [p] * yi ; + } + l_ki = yi / D [i] ; /* the nonzero entry L(k,i) */ + D [k] -= l_ki * yi ; + Li [p] = k ; /* store L(k,i) in column form of L */ + Lx [p] = l_ki ; + Lnz [i]++ ; /* increment count of nonzeros in col i */ + } + if (D [k] == 0.0) return (k) ; /* failure, D(k,k) is zero */ + } + return (n) ; /* success, diagonal of D is all nonzero */ +} +\end{verbatim} +} +\end{figure} + +After the matrix is factorized, the {\tt ldl\_lsolve}, {\tt ldl\_dsolve}, +and {\tt ldl\_ltsolve} routines shown in Figure~\ref{ldlsolve} +are provided to solve +$\m{Lx}=\m{b}$, $\m{Dx}=\m{b}$, and $\m{L}\tr\m{x}=\m{b}$, respectively. +Together, they solve $\m{Ax}=\m{b}$, and consist of only 10 lines of executable +code. If a fill-reducing permutation is used, +{\tt ldl\_perm} and {\tt ldl\_permt} must be used to permute $\m{b}$ and +$\m{x}$ accordingly. + +\begin{figure} +\caption{Solve routines} +\label{ldlsolve} +{\scriptsize +\begin{verbatim} +void ldl_lsolve +( + int n, /* L is n-by-n, where n >= 0 */ + double X [ ], /* size n. right-hand-side on input, soln. on output */ + int Lp [ ], /* input of size n+1, not modified */ + int Li [ ], /* input of size lnz=Lp[n], not modified */ + double Lx [ ] /* input of size lnz=Lp[n], not modified */ +) +{ + int j, p, p2 ; + for (j = 0 ; j < n ; j++) + { + p2 = Lp [j+1] ; + for (p = Lp [j] ; p < p2 ; p++) + { + X [Li [p]] -= Lx [p] * X [j] ; + } + } +} + +void ldl_dsolve +( + int n, /* D is n-by-n, where n >= 0 */ + double X [ ], /* size n. right-hand-side on input, soln. on output */ + double D [ ] /* input of size n, not modified */ +) +{ + int j ; + for (j = 0 ; j < n ; j++) + { + X [j] /= D [j] ; + } +} + +void ldl_ltsolve +( + int n, /* L is n-by-n, where n >= 0 */ + double X [ ], /* size n. right-hand-side on input, soln. on output */ + int Lp [ ], /* input of size n+1, not modified */ + int Li [ ], /* input of size lnz=Lp[n], not modified */ + double Lx [ ] /* input of size lnz=Lp[n], not modified */ +) +{ + int j, p, p2 ; + for (j = n-1 ; j >= 0 ; j--) + { + p2 = Lp [j+1] ; + for (p = Lp [j] ; p < p2 ; p++) + { + X [j] -= Lx [p] * X [Li [p]] ; + } + } +} +\end{verbatim} +} +\end{figure} + +In addition to appearing as a Collected Algorithm of the ACM \cite{Davis05}, +{\tt LDL} is available at http://www.suitesparse.com. + +%------------------------------------------------------------------------------- +\section{Using LDL in MATLAB} +\label{MATLAB} +%------------------------------------------------------------------------------- + +The simplest way to use {\tt LDL} is within MATLAB. Once the {\tt ldlsparse} +mexFunction is compiled and installed, the MATLAB statement +{\tt [L, D, Parent, fl] = ldlsparse (A)} returns the sparse factorization +{\tt A = (L+I)*D*(L+I)'}, where {\tt L} is lower triangular, {\tt D} is a +diagonal matrix, and {\tt I} is the {\tt n}-by-{\tt n} +identity matrix ({\tt ldlsparse} does not return the unit diagonal of {\tt L}). +The elimination tree is returned in {\tt Parent}. +If no zero on the diagonal of {\tt D} is encountered, {\tt fl} is the +floating-point operation count. Otherwise, {\tt D(-fl,-fl)} is the first +zero entry encountered. Let {\tt d=-fl}. The function returns the +factorization of {\tt A (1:d,1:d)}, where rows {\tt d+1} to {\tt n} of {\tt L} +and {\tt D} are all zero. If a sparsity preserving permutation {\tt P} is +passed, {\tt [L, D, Parent, fl] = ldlsparse (A,P)} +operates on {\tt A(P,P)} without +forming it explicitly. + +The statement {\tt x = ldlsparse (A, [ ], b)} is roughly equivalent to +{\tt x = A}$\backslash${\tt b}, when {\tt A} is sparse, real, and symmetric. +The $\m{LDL}\tr$ factorization of {\tt A} is performed. If {\tt P} is +provided, {\tt x = ldlsparse (A, P, b)} still performs +{\tt x = A}$\backslash${\tt b}, except that {\tt A(P,P)} is factorized +instead. + +%------------------------------------------------------------------------------- +\section{Using LDL in a C program} +\label{C} +%------------------------------------------------------------------------------- + +To compile the library, do {\tt make}. To install the shared library in +/usr/local/include and /usr/local/lib, do {\tt make install}; to remove it +from there, use {\tt make uninstall}. +For alternative installation locations, see the instructions in +{\tt SuiteSparse/README.txt}. + +The C-callable {\tt LDL} library consists of nine user-callable routines +and one include file. + +\begin{itemize} +\item {\tt ldl\_symbolic}: given the nonzero pattern of a sparse symmetric + matrix $\m{A}$ and an optional permutation $\m{P}$, analyzes either + $\m{A}$ or $\m{PAP}\tr$, and returns the elimination tree, the + number of nonzeros in each column of $\m{L}$, and the {\tt Lp} array + for the sparse matrix data structure for $\m{L}$. + Duplicate entries are allowed in the columns of $\m{A}$, and the + row indices in each column need not be sorted. + Providing a sparsity-preserving ordering is critical for obtaining + good performance. A minimum degree ordering + (such as AMD \cite{AmestoyDavisDuff96,AmestoyDavisDuff03}) + or a graph-partitioning based ordering are appropriate. +\item {\tt ldl\_numeric}: given {\tt Lp} and the elimination tree computed + by {\tt ldl\_symbolic}, and an optional permutation $\m{P}$, + returns the numerical factorization of $\m{A}$ or $\m{PAP}\tr$. + Duplicate entries are allowed in the columns of $\m{A}$ + (any duplicate entries are summed), and the + row indices in each column need not be sorted. + The data structure for $\m{L}$ is the same as $\m{A}$, except that + no duplicates appear, and each column has sorted row indices. +\item {\tt ldl\_lsolve}: given the factor $\m{L}$ computed by + {\tt ldl\_numeric}, solves the linear system $\m{Lx}=\m{b}$, where + $\m{x}$ and $\m{b}$ are full $n$-by-1 vectors. +\item {\tt ldl\_dsolve}: given the factor $\m{D}$ computed by + {\tt ldl\_numeric}, solves the linear system $\m{Dx}=\m{b}$. +\item {\tt ldl\_ltsolve}: given the factor $\m{L}$ computed by + {\tt ldl\_numeric}, solves the linear system $\m{L}\tr\m{x}=\m{b}$. +\item {\tt ldl\_perm}: given a vector $\m{b}$ and a permutation $\m{P}$, + returns $\m{x}=\m{Pb}$. +\item {\tt ldl\_permt}: given a vector $\m{b}$ and a permutation $\m{P}$, + returns $\m{x}=\m{P}\tr\m{b}$. +\item {\tt ldl\_valid\_perm}: Except for checking if the diagonal of + $\m{D}$ is zero, none of the above routines check their inputs for errors. + This routine checks the validity of a permutation $\m{P}$. +\item {\tt ldl\_valid\_matrix}: checks if a matrix $\m{A}$ is valid as input + to {\tt ldl\_symbolic} and {\tt ldl\_numeric}. +\end{itemize} + +Note that the primary input to the {\tt ldl\_symbolic} and +{\tt ldl\_numeric} is the sparse matrix $\m{A}$. It is provided in +column-oriented form, and only the upper triangular part is accessed. +This is slightly different than the primary output: the matrix $\m{L}$, +which is lower triangular in column-oriented form. +If you wish to factorize a symmetric matrix $\m{A}$ for which only the lower +triangular part is supplied, you would need to transpose $\m{A}$ before +passing it {\tt ldl\_symbolic} and {\tt ldl\_numeric}. + +An additional set of routines is available for use in a 64-bit environment. +Each routine name changes uniformly; {\tt ldl\_symbolic} becomes +{\tt ldl\_l\_symbolic}, and each {\tt int} parameter becomes type +{\tt SuiteSparse\_long}. The {\tt SuiteSparse\_long} type is {\tt long}, except for +Microsoft Windows 64, where it becomes {\tt \_\_int64}. + +\begin{figure} +\caption{Example of use} +\label{ldlsimple} +{\scriptsize +\begin{verbatim} +#include +#include "ldl.h" +#define N 10 /* A is 10-by-10 */ +#define ANZ 19 /* # of nonzeros on diagonal and upper triangular part of A */ +#define LNZ 13 /* # of nonzeros below the diagonal of L */ + +int main (void) +{ + /* only the upper triangular part of A is required */ + int Ap [N+1] = {0, 1, 2, 3, 4, 6, 7, 9, 11, 15, ANZ}, + Ai [ANZ] = {0, 1, 2, 3, 1,4, 5, 4,6, 4,7, 0,4,7,8, 1,4,6,9 } ; + double Ax [ANZ] = {1.7, 1., 1.5, 1.1, .02,2.6, 1.2, .16,1.3, .09,1.6, + .13,.52,.11,1.4, .01,.53,.56,3.1}, + b [N] = {.287, .22, .45, .44, 2.486, .72, 1.55, 1.424, 1.621, 3.759}; + double Lx [LNZ], D [N], Y [N] ; + int Li [LNZ], Lp [N+1], Parent [N], Lnz [N], Flag [N], Pattern [N], d, i ; + + /* factorize A into LDL' (P and Pinv not used) */ + ldl_symbolic (N, Ap, Ai, Lp, Parent, Lnz, Flag, NULL, NULL) ; + printf ("Nonzeros in L, excluding diagonal: %d\n", Lp [N]) ; + d = ldl_numeric (N, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Pattern, + Flag, NULL, NULL) ; + + if (d == N) + { + /* solve Ax=b, overwriting b with the solution x */ + ldl_lsolve (N, b, Lp, Li, Lx) ; + ldl_dsolve (N, b, D) ; + ldl_ltsolve (N, b, Lp, Li, Lx) ; + for (i = 0 ; i < N ; i++) printf ("x [%d] = %g\n", i, b [i]) ; + } + else + { + printf ("ldl_numeric failed, D (%d,%d) is zero\n", d, d) ; + } + return (0) ; +} +\end{verbatim} +} +\end{figure} + +The program in Figure~\ref{ldlsimple} +illustrates the basic usage of the {\tt LDL} routines. +It analyzes and factorizes the sparse symmetric positive-definite matrix +{\small +\[ +\m{A} = \left[ +\begin{array}{cccccccccc} + 1.7 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & .13 & 0 \\ + 0 & 1. & 0 & 0 & .02 & 0 & 0 & 0 & 0 & .01 \\ + 0 & 0 & 1.5 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 1.1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & .02 & 0 & 0 & 2.6 & 0 & .16 & .09 & .52 & .53 \\ + 0 & 0 & 0 & 0 & 0 & 1.2 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & .16 & 0 & 1.3 & 0 & 0 & .56 \\ + 0 & 0 & 0 & 0 & .09 & 0 & 0 & 1.6 & .11 & 0 \\ + .13 & 0 & 0 & 0 & .52 & 0 & 0 & .11 & 1.4 & 0 \\ + 0 & .01 & 0 & 0 & .53 & 0 & .56 & 0 & 0 & 3.1 \\ +\end{array} +\right] +\] +} +and then solves a system $\m{Ax}=\m{b}$ whose true solution is +$x_i = i/10$. Note that {\tt Li} and {\tt Lx} are statically allocated. +Normally they would be allocated after their size, {\tt Lp[n]}, +is determined by {\tt ldl\_symbolic}. +More example programs are included with the {\tt LDL} package. + +\section{Acknowledgments} + +I would like to thank Pete Stewart for his comments on an earlier draft +of this software and its accompanying paper. + +\newpage +\bibliographystyle{plain} +\bibliography{ldl} + +\end{document} diff --git a/external/ldl/Doc/lesser.txt b/external/ldl/Doc/lesser.txt new file mode 100644 index 00000000..8add30ad --- /dev/null +++ b/external/ldl/Doc/lesser.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/external/ldl/Lib/Makefile b/external/ldl/Lib/Makefile new file mode 100644 index 00000000..604ffa27 --- /dev/null +++ b/external/ldl/Lib/Makefile @@ -0,0 +1,74 @@ +#------------------------------------------------------------------------------- +# LDL Lib/Makefile +#------------------------------------------------------------------------------- + +LIBRARY = libldl +VERSION = 2.2.6 +SO_VERSION = 2 + +default: library + +include ../../SuiteSparse_config/SuiteSparse_config.mk + +# LDL depends on SuiteSparse_config +LDLIBS += -lsuitesparseconfig + +# compile and install in SuiteSparse/lib +library: + $(MAKE) install INSTALL=$(SUITESPARSE) + +I = -I../../SuiteSparse_config -I../Include + +C = $(CC) $(CF) $(I) + +all: library + +OBJ = ldl.o ldll.o + +ldl.o: ../Source/ldl.c ../Include/ldl.h + $(C) -c ../Source/ldl.c -o ldl.o + +ldll.o: ../Source/ldl.c ../Include/ldl.h + $(C) -DLDL_LONG -c ../Source/ldl.c -o ldll.o + +static: $(AR_TARGET) + +$(AR_TARGET): $(OBJ) + $(ARCHIVE) $@ $^ + - $(RANLIB) $@ + +distclean: purge + +purge: clean + - $(RM) -r $(PURGE) + +clean: + - $(RM) -r $(CLEAN) + +# install LDL +install: $(AR_TARGET) $(INSTALL_LIB)/$(SO_TARGET) + +$(INSTALL_LIB)/$(SO_TARGET): $(OBJ) + @mkdir -p $(INSTALL_LIB) + @mkdir -p $(INSTALL_INCLUDE) + @mkdir -p $(INSTALL_DOC) + $(CC) $(SO_OPTS) $^ -o $@ $(LDLIBS) + ( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_PLAIN) ) + ( cd $(INSTALL_LIB) ; ln -sf $(SO_TARGET) $(SO_MAIN) ) + $(CP) ../Include/ldl.h $(INSTALL_INCLUDE) + $(CP) ../Doc/ldl_userguide.pdf $(INSTALL_DOC) + $(CP) ../README.txt $(INSTALL_DOC)/LDL_README.txt + chmod 755 $(INSTALL_LIB)/$(SO_TARGET) + chmod 644 $(INSTALL_INCLUDE)/ldl.h + chmod 644 $(INSTALL_DOC)/ldl_userguide.pdf + chmod 644 $(INSTALL_DOC)/LDL_README.txt + +# uninstall LDL +uninstall: + $(RM) $(INSTALL_LIB)/$(SO_TARGET) + $(RM) $(INSTALL_LIB)/$(SO_PLAIN) + $(RM) $(INSTALL_LIB)/$(SO_MAIN) + $(RM) $(INSTALL_INCLUDE)/ldl.h + $(RM) $(INSTALL_DOC)/ldl_userguide.pdf + $(RM) $(INSTALL_DOC)/LDL_README.txt + diff --git a/external/ldl/MATLAB/Contents.m b/external/ldl/MATLAB/Contents.m new file mode 100644 index 00000000..51e5ea41 --- /dev/null +++ b/external/ldl/MATLAB/Contents.m @@ -0,0 +1,33 @@ +% LDL package: simple sparse LDL factorization +% +% Primary routines: +% +% ldlsparse - LDL' factorization of a real, sparse, symmetric matrix +% ldlsymbol - symbolic Cholesky factorization +% +% Helper routines: +% +% ldldemo - demo program for LDL +% ldlrow - an m-file description of the algorithm used by LDL +% ldltest - test program for LDL +% ldlmain2 - compiles and runs a longer test program for LDL +% ldl_install - compile and install the LDL package for use in MATLAB. +% ldl_make - compile LDL +% +% Example: +% +% [L, D, Parent, fl] = ldlsparse (A) + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +% LDL License: see LDL/Doc/License.txt +% +% Acknowledgements: +% +% This work was supported by the National Science Foundation, under +% grant CCR-0203270. +% +% Portions of this work were done while on sabbatical at Stanford University +% and Lawrence Berkeley National Laboratory (with funding from the SciDAC +% program). I would like to thank Gene Golub, Esmond Ng, and Horst Simon +% for making this sabbatical possible. diff --git a/external/ldl/MATLAB/ldl_install.m b/external/ldl/MATLAB/ldl_install.m new file mode 100644 index 00000000..0e2c10e9 --- /dev/null +++ b/external/ldl/MATLAB/ldl_install.m @@ -0,0 +1,17 @@ +function ldl_install +%LDL_INSTALL compile and install the LDL package for use in MATLAB. +% Your current working directory must be LDL for this function to work. +% +% Example: +% ldl_install +% +% See also ldlsparse, ldlsymbol + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +ldl_make +addpath (pwd) ; +fprintf ('LDL has been compiled and installed. The path:\n') ; +disp (pwd) ; +fprintf ('has been added to your path. Use pathtool to add it permanently.\n'); +ldldemo diff --git a/external/ldl/MATLAB/ldl_make.m b/external/ldl/MATLAB/ldl_make.m new file mode 100644 index 00000000..cb56de5b --- /dev/null +++ b/external/ldl/MATLAB/ldl_make.m @@ -0,0 +1,24 @@ +function ldl_make +%LDL_MAKE compile LDL +% +% Example: +% ldl_make % compiles ldlsparse and ldlsymbol +% +% See also ldlsparse, ldlsymbol + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +d = '' ; +if (~isempty (strfind (computer, '64'))) + d = '-largeArrayDims' ; +end + +% MATLAB 8.3.0 now has a -silent option to keep 'mex' from burbling too much +if (~verLessThan ('matlab', '8.3.0')) + d = ['-silent ' d] ; +end + +eval (sprintf ('mex -O %s -DLDL_LONG -I../../SuiteSparse_config -I../Include -output ldlsparse ../Source/ldl.c ldlmex.c', d)) ; +eval (sprintf ('mex -O %s -DLDL_LONG -I../../SuiteSparse_config -I../Include -output ldlsymbol ../Source/ldl.c ldlsymbolmex.c', d)) ; +fprintf ('LDL successfully compiled.\n') ; + diff --git a/external/ldl/MATLAB/ldldemo.m b/external/ldl/MATLAB/ldldemo.m new file mode 100644 index 00000000..557dafcb --- /dev/null +++ b/external/ldl/MATLAB/ldldemo.m @@ -0,0 +1,123 @@ +function ldldemo +%LDLDEMO demo program for LDL +% +% Example: +% ldldemo +% +% See also ldlsparse. + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +% compile the LDLSPARSE and LDLSYMBOL mexFunctions +help ldlsparse + +fprintf ('\nTesting ldlsparse and ldlsymbol:\n') ; + +% create a small random symmetric positive definite sparse matrix +n = 100 ; +d = 0.03 ; +rand ('state', 0) ; +randn ('state', 0) ; +A = sprandn (n, n, d) ; +A = speye (n) + A*A' ; +b = randn (n, 1) ; + +clf +subplot (2,2,1) ; +spy (A) ; +title ('original matrix') ; + +% permute for sparsity +p = symamd (A) ; +C = A (p,p) ; + +subplot (2,2,2) ; +spy (C) ; +title ('permuted matrix') ; +drawnow + +% factorize, without using ldlsparse's internal permutation +[L, D, Parent, fl] = ldlsparse (C) ; +L = L + speye (n) ; +err = norm (L*D*L' - C, 1) ; +fprintf ('norm (LDL''-PAP'') = %g\n', err) ; + +% solve Ax=b +x = L' \ (D \ (L \ (b (p)))) ; +x (p) = x ; +resid = norm (A*x-b) ; +fprintf ('residual %g for ldlsparse, flops %10.1f\n', resid, fl) ; + +% solve Ax=b with one call to ldlsparse +x = ldlsparse (C, [ ], b (p)) ; +x (p) = x ; +resid = norm (A*x-b) ; +fprintf ('residual %g for ldlsparse solve\n', resid) ; + +subplot (2,2,3) ; +spy (L + D + L') ; +title ('L+D+L''') ; + +subplot (2,2,4) ; +treeplot (Parent) +title ('elimination tree') ; + +% try ldlrow (this will be slow) +[L, D] = ldlrow (C) ; +x = L' \ (D \ (L \ (b (p)))) ; +x (p) = x ; +resid = norm (A*x-b) ; +fprintf ('residual %g for ldlrow.m\n', resid) ; + +% factorize, using ldlsparse's internal permutation +[L, D, Parent, fl] = ldlsparse (A, p) ; +L = L + speye (n) ; +err = norm (L*D*L' - C, 1) ; +fprintf ('norm (LDL''-PAP'') = %g\n', err) ; + +% solve Ax=b +x = L' \ (D \ (L \ (b (p)))) ; +x (p) = x ; +resid = norm (A*x-b) ; +fprintf ('residual %g for ldlsparse, flops %10.1f\n', resid, fl) ; + +% solve Ax=b with one call to ldlsparse +x = ldlsparse (A, p, b) ; +resid = norm (A*x-b) ; +fprintf ('residual %g for ldlsparse solve\n\n', resid) ; + +% compare ldlsymbol and symbfact +[Lnz, Parent, fl] = ldlsymbol (A) ; +fprintf ('Original matrix: nz in L: %5d flop count: %g\n', sum (Lnz), fl) ; + +Lnz2 = symbfact (A) - 1 ; +Parent2 = etree (A) ; +fl2 = sum (Lnz2 .* (Lnz2 + 2)) ; +if (any (Lnz ~= Lnz2)) + error ('Lnz mismatch') ; +end +if (any (Parent ~= Parent2)) + error ('Parent mismatch') ; +end +if (fl ~= fl2) + error ('fl mismatch') ; +end + +[Lnz, Parent, fl] = ldlsymbol (A, p) ; +fprintf ('Permuted matrix: nz in L: %5d flop count: %g\n', sum (Lnz), fl) ; + +Lnz2 = symbfact (A (p,p)) - 1 ; +Parent2 = etree (A (p,p)) ; +fl2 = sum (Lnz2 .* (Lnz2 + 2)) ; +if (any (Lnz ~= Lnz2)) + error ('Lnz mismatch') ; +end +if (any (Parent ~= Parent2)) + error ('Parent mismatch') ; +end +if (fl ~= fl2) + error ('fl mismatch') ; +end + + +fprintf ('\nldldemo: all tests passed\n') ; diff --git a/external/ldl/MATLAB/ldlmain2.m b/external/ldl/MATLAB/ldlmain2.m new file mode 100644 index 00000000..9a417245 --- /dev/null +++ b/external/ldl/MATLAB/ldlmain2.m @@ -0,0 +1,56 @@ +function ldlmain2 +%LDLMAIN2 compiles and runs a longer test program for LDL +% +% Example: +% ldlmain2 +% +% See also ldlsparse. + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +help ldlmain2 + +detail = 0 ; + +ldl_make + +d = '' ; +if (~isempty (strfind (computer, '64'))) + d = '-largeArrayDims' ; +end + +mx = sprintf (... + 'mex -O %s -DLDL_LONG -DDLONG -I../../SuiteSparse_config -I../Include', d) ; + +% compile ldlmain without AMD +cmd = sprintf ('%s ../Demo/ldlmain.c ../Source/ldl.c', mx) ; +if (detail) + fprintf ('%s\n', cmd) ; +end +eval (cmd) ; +ldlmain + +% compile ldlamd (ldlmain with AMD) +cmd = sprintf ('%s -I../../AMD/Include', mx) ; + +cmd = [cmd ' ../../SuiteSparse_config/SuiteSparse_config.c' ] ; + +files = {'amd_order', 'amd_dump', 'amd_postorder', 'amd_post_tree', ... + 'amd_aat', 'amd_2', 'amd_1', 'amd_defaults', 'amd_control', ... + 'amd_info', 'amd_valid', 'amd_preprocess' } ; +for i = 1 : length (files) + cmd = sprintf ('%s ../../AMD/Source/%s.c', cmd, files {i}) ; +end + +if (~(ispc || ismac)) + % for POSIX timing routine + cmd = [cmd ' -lrt'] ; +end + +cmd = [cmd ' -DUSE_AMD -output ldlamd ../Demo/ldlmain.c ../Source/ldl.c'] ; +if (detail) + fprintf ('%s\n', cmd) ; +end +eval (cmd) ; +ldlamd + diff --git a/external/ldl/MATLAB/ldlmex.c b/external/ldl/MATLAB/ldlmex.c new file mode 100644 index 00000000..d13e132c --- /dev/null +++ b/external/ldl/MATLAB/ldlmex.c @@ -0,0 +1,369 @@ +/* ========================================================================== */ +/* === ldlmex.c: LDL mexFunction =========================================== */ +/* ========================================================================== */ + +/* MATLAB interface for numerical LDL' factorization using the LDL sparse matrix + * package. + * + * MATLAB calling syntax is: + * + * [L, D, Parent, flops] = ldl (A) + * [L, D, Parent, flops] = ldl (A, P) + * [x, flops] = ldl (A, [ ], b) + * [x, flops] = ldl (A, P, b) + * + * The factorization is L*D*L' = A or L*D*L' = A(P,P). A must be sparse, + * square, and real. L is lower triangular with unit diagonal, but the diagonal + * is not returned. D is diagonal sparse matrix. Let n = size (A,1). If P is + * not present or empty, the factorization is: + * + * (L + speye (n)) * D * (L + speye (n))' = A + * + * otherwise, the factorization is + * + * (L + speye (n)) * D * (L + speye (n))' = A(P,P) + * + * P is a permutation of 1:n, an output of AMD, SYMAMD, or SYMRCM, for example. + * Only the diagonal and upper triangular part of A or A(P,P) is accessed; the + * lower triangular part is ignored. + * + * The elimination tree is returned in the Parent array. + * + * In the x = ldl (A, P, b) usage, the LDL' factorization is not returned. + * Instead, the system A*x=b is solved for x, where b is a dense n-by-m matrix, + * using P as the fill-reducing ordering for the LDL' factorization of A(P,P). + * If P is not present or equal to [ ], it is assumed to be the identity + * permutation. + * + * If no zero entry on the diagonal of D is encountered, then the flops argument + * is the floating point count. + * + * If any entry on the diagonal of D is zero, then the LDL' factorization is + * terminated at that point. If there is no flops output argument, an error + * message is printed and no outputs are returned. Otherwise, flops is + * negative, d = -flops, and D (d,d) is the first zero entry on the diagonal of + * D. A partial factorization is returned. Let B = A if P is not present or + * empty, or B = A(P,P) otherwise. Then the factorization is + * + * LDL = (L + speye (n)) * D * (L + speye (n))' + * LDL (1:d, 1:d) = B (1:d,1:d) + * + * That is, the LDL' factorization of B (1:d,1:d) is in the first d rows and + * columns of L and D. The rest of L and D are zero. + * + * Copyright (c) by Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See LDL/Doc/License.txt for the License. + */ + +#ifndef LDL_LONG +#define LDL_LONG +#endif + +#include "ldl.h" +#include "mex.h" +#define Long SuiteSparse_long + +/* ========================================================================== */ +/* === LDL mexFunction ====================================================== */ +/* ========================================================================== */ + +void mexFunction +( + int nargout, + mxArray *pargout[ ], + int nargin, + const mxArray *pargin[ ] +) +{ + Long i, n, *Pattern, *Flag, *Li, *Lp, *Ap, *Ai, *Lnz, *Parent, do_chol, + nrhs = 0, lnz, do_solve, *P, *Pinv, nn, k, j, permute, *Dp = NULL, *Di, + d, do_flops, psrc, pdst ; + double *Y, *D, *Lx, *Ax, flops, *X = NULL, *B = NULL, *p ; + + /* ---------------------------------------------------------------------- */ + /* get inputs and allocate workspace */ + /* ---------------------------------------------------------------------- */ + + do_chol = (nargin > 0) && (nargin <= 2) && (nargout <= 4) ; + do_solve = (nargin == 3) && (nargout <= 2) ; + if (!(do_chol || do_solve)) + { + mexErrMsgTxt ("Usage:\n" + " [L, D, etree, flopcount] = ldl (A) ;\n" + " [L, D, etree, flopcount] = ldl (A, P) ;\n" + " [x, flopcount] = ldl (A, [ ], b) ;\n" + " [x, flopcount] = ldl (A, P, b) ;\n" + "The etree and flopcount arguments are optional.") ; + } + n = mxGetM (pargin [0]) ; + if (!mxIsSparse (pargin [0]) || n != mxGetN (pargin [0]) + || mxIsComplex (pargin [0])) + { + mexErrMsgTxt ("ldl: A must be sparse, square, and real") ; + } + if (do_solve) + { + if (mxIsSparse (pargin [2]) || n != mxGetM (pargin [2]) + || !mxIsDouble (pargin [2]) || mxIsComplex (pargin [2])) + { + mexErrMsgTxt ( + "ldl: b must be dense, real, and with proper dimension") ; + } + } + nn = (n == 0) ? 1 : n ; + + /* get sparse matrix A */ + Ap = (Long *) mxGetJc (pargin [0]) ; + Ai = (Long *) mxGetIr (pargin [0]) ; + Ax = mxGetPr (pargin [0]) ; + + /* get fill-reducing ordering, if present */ + permute = ((nargin > 1) && !mxIsEmpty (pargin [1])) ; + if (permute) + { + if (mxGetM (pargin [1]) * mxGetN (pargin [1]) != n || + mxIsSparse (pargin [1])) + { + mexErrMsgTxt ("ldl: invalid input permutation\n") ; + } + P = (Long *) mxMalloc (nn * sizeof (Long)) ; + Pinv = (Long *) mxMalloc (nn * sizeof (Long)) ; + p = mxGetPr (pargin [1]) ; + for (k = 0 ; k < n ; k++) + { + P [k] = p [k] - 1 ; /* convert to 0-based */ + } + } + else + { + P = (Long *) NULL ; + Pinv = (Long *) NULL ; + } + + /* allocate first part of L */ + Lp = (Long *) mxMalloc ((n+1) * sizeof (Long)) ; + Parent = (Long *) mxMalloc (nn * sizeof (Long)) ; + + /* get workspace */ + Y = (double *) mxMalloc (nn * sizeof (double)) ; + Flag = (Long *) mxMalloc (nn * sizeof (Long)) ; + Pattern = (Long *) mxMalloc (nn * sizeof (Long)) ; + Lnz = (Long *) mxMalloc (nn * sizeof (Long)) ; + + /* make sure the input P is valid */ + if (permute && !ldl_l_valid_perm (n, P, Flag)) + { + mexErrMsgTxt ("ldl: invalid input permutation\n") ; + } + + /* note that we assume that the input matrix is valid */ + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization to get Lp, Parent, Lnz, and optionally Pinv */ + /* ---------------------------------------------------------------------- */ + + ldl_l_symbolic (n, Ap, Ai, Lp, Parent, Lnz, Flag, P, Pinv) ; + lnz = Lp [n] ; + + /* ---------------------------------------------------------------------- */ + /* create outputs */ + /* ---------------------------------------------------------------------- */ + + if (do_chol) + { + /* create the output matrix L, using the Lp array from ldl_l_symbolic */ + pargout [0] = mxCreateSparse (n, n, lnz+1, mxREAL) ; + mxFree (mxGetJc (pargout [0])) ; + mxSetJc (pargout [0], (void *) Lp) ; /* Lp is not mxFree'd */ + Li = (Long *) mxGetIr (pargout [0]) ; + Lx = mxGetPr (pargout [0]) ; + + /* create sparse diagonal matrix D */ + if (nargout > 1) + { + pargout [1] = mxCreateSparse (n, n, nn, mxREAL) ; + Dp = (Long *) mxGetJc (pargout [1]) ; + Di = (Long *) mxGetIr (pargout [1]) ; + for (j = 0 ; j < n ; j++) + { + Dp [j] = j ; + Di [j] = j ; + } + Dp [n] = n ; + D = mxGetPr (pargout [1]) ; + } + else + { + D = (double *) mxMalloc (nn * sizeof (double)) ; + } + + /* return elimination tree (add 1 to change from 0-based to 1-based) */ + if (nargout > 2) + { + pargout [2] = mxCreateDoubleMatrix (1, n, mxREAL) ; + p = mxGetPr (pargout [2]) ; + for (i = 0 ; i < n ; i++) + { + p [i] = Parent [i] + 1 ; + } + } + + do_flops = (nargout == 4) ? (3) : (-1) ; + } + else + { + /* create L and D as temporary matrices */ + Li = (Long *) mxMalloc ((lnz+1) * sizeof (Long)) ; + Lx = (double *) mxMalloc ((lnz+1) * sizeof (double)) ; + D = (double *) mxMalloc (nn * sizeof (double)) ; + + /* create solution x */ + nrhs = mxGetN (pargin [2]) ; + pargout [0] = mxCreateDoubleMatrix (n, nrhs, mxREAL) ; + X = mxGetPr (pargout [0]) ; + B = mxGetPr (pargin [2]) ; + + do_flops = (nargout == 2) ? (1) : (-1) ; + } + + if (do_flops >= 0) + { + /* find flop count for ldl_l_numeric */ + flops = 0 ; + for (k = 0 ; k < n ; k++) + { + flops += ((double) Lnz [k]) * (Lnz [k] + 2) ; + } + if (do_solve) + { + /* add flop count for solve */ + for (k = 0 ; k < n ; k++) + { + flops += 4 * ((double) Lnz [k]) + 1 ; + } + } + pargout [do_flops] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + p = mxGetPr (pargout [do_flops]) ; + p [0] = flops ; + } + + /* ---------------------------------------------------------------------- */ + /* numeric factorization to get Li, Lx, and D */ + /* ---------------------------------------------------------------------- */ + + d = ldl_l_numeric (n, Ap, Ai, Ax, Lp, Parent, Lnz, Li, Lx, D, Y, Flag, + Pattern, P, Pinv) ; + + /* ---------------------------------------------------------------------- */ + /* singular case : truncate the factorization */ + /* ---------------------------------------------------------------------- */ + + if (d != n) + { + /* D [d] is zero: report error, or clean up */ + if (do_chol && do_flops < 0) + { + mexErrMsgTxt ("ldl: zero pivot encountered\n") ; + } + else + { + /* L and D are incomplete, compact them */ + if (do_chol) + { + for (k = d ; k < n ; k++) + { + Dp [k] = d ; + } + Dp [n] = d ; + } + for (k = d ; k < n ; k++) + { + D [k] = 0 ; + } + pdst = 0 ; + for (k = 0 ; k < d ; k++) + { + for (psrc = Lp [k] ; psrc < Lp [k] + Lnz [k] ; psrc++) + { + Li [pdst] = Li [psrc] ; + Lx [pdst] = Lx [psrc] ; + pdst++ ; + } + } + for (k = 0 ; k < d ; k++) + { + Lp [k+1] = Lp [k] + Lnz [k] ; + } + for (k = d ; k <= n ; k++) + { + Lp [k] = pdst ; + } + if (do_flops >= 0) + { + /* return -d instead of the flop count (convert to 1-based) */ + p = mxGetPr (pargout [do_flops]) ; + p [0] = -(1+d) ; + } + } + } + + /* ---------------------------------------------------------------------- */ + /* solve Ax=b, if requested */ + /* ---------------------------------------------------------------------- */ + + if (do_solve) + { + if (permute) + { + for (j = 0 ; j < nrhs ; j++) + { + ldl_l_perm (n, Y, B, P) ; /* y = Pb */ + ldl_l_lsolve (n, Y, Lp, Li, Lx) ; /* y = L\y */ + ldl_l_dsolve (n, Y, D) ; /* y = D\y */ + ldl_l_ltsolve (n, Y, Lp, Li, Lx) ; /* y = L'\y */ + ldl_l_permt (n, X, Y, P) ; /* x = P'y */ + X += n ; + B += n ; + } + } + else + { + for (j = 0 ; j < nrhs ; j++) + { + for (k = 0 ; k < n ; k++) /* x = b */ + { + X [k] = B [k] ; + } + ldl_l_lsolve (n, X, Lp, Li, Lx) ; /* x = L\x */ + ldl_l_dsolve (n, X, D) ; /* x = D\x */ + ldl_l_ltsolve (n, X, Lp, Li, Lx) ; /* x = L'\x */ + X += n ; + B += n ; + } + } + /* free the matrix L */ + mxFree (Lp) ; + mxFree (Li) ; + mxFree (Lx) ; + mxFree (D) ; + } + + /* ---------------------------------------------------------------------- */ + /* free workspace */ + /* ---------------------------------------------------------------------- */ + + if (do_chol && nargout < 2) + { + mxFree (D) ; + } + if (permute) + { + mxFree (P) ; + mxFree (Pinv) ; + } + mxFree (Parent) ; + mxFree (Y) ; + mxFree (Flag) ; + mxFree (Pattern) ; + mxFree (Lnz) ; +} diff --git a/external/ldl/MATLAB/ldlrow.m b/external/ldl/MATLAB/ldlrow.m new file mode 100644 index 00000000..a2317df5 --- /dev/null +++ b/external/ldl/MATLAB/ldlrow.m @@ -0,0 +1,82 @@ +function [L, D] = ldlrow (A) +%LDLROW an m-file description of the algorithm used by LDL +% +% Example: +% [L, D] = ldlrow (A) +% +% Compute the L*D*L' factorization of A, by rows. Returns +% full L and D matrices. This routine serves as an outline +% of the numerical factorization performed by ldl.c. +% +% Here is a diagram of how L is computed. "a" means an +% entry that is accessed at the kth step, and "c" means an +% entry that is computed. A "-" means neither accessed nor +% computed. A "1" means the value of the entry is L (the +% unit diagonal of L), and it is accessed at the kth step. +% A "." means the value is zero. +% +% The L matrix +% +% 1 . . . . . . . +% a 1 . . . . . . +% a a 1 . . . . . +% a a a 1 . . . . +% c c c c c . . . <- kth row of L +% - - - - - - . . +% - - - - - - - . +% - - - - - - - - +% +% The A matrix: +% +% the kth column of A +% v +% - - - - a - - - +% - - - - a - - - +% - - - - a - - - +% - - - - a - - - +% - - - - a - - - <- kth row of A +% - - - - - - - - +% - - - - - - - - +% - - - - - - - - +% +% The D matrix: +% +% the kth column of D +% v +% a . . . . . . . +% . a . . . . . . +% . . a . . . . . +% . . . a . . . . +% . . . . c . . . <- kth row of D +% . . . . . . . . +% . . . . . . . . +% . . . . . . . . +% +% See also ldlsparse. + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +[m n] = size (A) ; +L = zeros (n, n) ; +D = zeros (n, 1) ; +A = full (A) ; + +L (1, 1) = 1 ; +D (1) = A (1,1) ; + +for k = 2:n + + % note the sparse triangular solve. For the sparse + % case, the pattern of y is the same as the pattern of + % the kth row of L. + y = L (1:k-1, 1:k-1) \ A (1:k-1, k) ; + + % scale row k of L + L (k, 1:k-1) = (y ./ D (1:k-1))' ; + L (k, k) = 1 ; + + % compute the diagonal + D (k) = A (k,k) - L (k, 1:k-1) * y ; +end + +D = diag (D) ; diff --git a/external/ldl/MATLAB/ldlsparse.m b/external/ldl/MATLAB/ldlsparse.m new file mode 100644 index 00000000..cb5a0bd1 --- /dev/null +++ b/external/ldl/MATLAB/ldlsparse.m @@ -0,0 +1,33 @@ +function [arg1, arg2, arg3, arg4] = ldlsparse (A, P, b) %#ok +%LDLSPARSE LDL' factorization of a real, sparse, symmetric matrix +% +% Example: +% [L, D, Parent, fl] = ldlsparse (A) +% [L, D, Parent, fl] = ldlsparse (A, P) +% [x, fl] = ldlsparse (A, [ ], b) +% [x, fl] = ldlsparse (A, P, b) +% +% Let I = speye (size (A,1)). The factorization is (L+I)*D*(L+I)' = A or A(P,P). +% A must be sparse, square, and real. Only the diagonal and upper triangular +% part of A or A(P,P) are accessed. L is lower triangular with unit diagonal, +% but the diagonal is not returned. D is a diagonal sparse matrix. P is either +% a permutation of 1:n, or an empty vector, where n = size (A,1). If not +% present, or empty, then P=1:n is assumed. Parent is the elimination tree of +% A or A(P,P). If positive, fl is the floating point operation count, or +% negative if any entry on the diagonal of D is zero. +% +% In the x = ldlsparse (A, P, b) usage, the LDL' factorization is not returned. +% Instead, the system A*x=b is solved for x, where both b and x are dense. +% +% If a zero entry on the diagonal of D is encountered, the LDL' factorization is +% terminated at that point. If there is no fl output argument, an error occurs. +% Otherwise, fl is negative, and let d=-fl. D(d,d) is the first zero entry on +% the diagonal of D. A partial factorization is returned. Let B = A, or A(P,P) +% if P is present. Let F = (L+I)*D*(L+I)'. Then F (1:d,1:d) = B (1:d,1:d). +% Rows d+1 to n of L and D are all zero. +% +% See also chol, ldl, ldlsymbol, symbfact, etree + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +error ('ldlsparse mexFunction not found') ; diff --git a/external/ldl/MATLAB/ldlsymbol.m b/external/ldl/MATLAB/ldlsymbol.m new file mode 100644 index 00000000..6788f643 --- /dev/null +++ b/external/ldl/MATLAB/ldlsymbol.m @@ -0,0 +1,35 @@ +function [Lnz, Parent, fl] = ldlsymbol (A, P) %#ok +%LDLSYMBOL symbolic Cholesky factorization +% +% Example: +% [Lnz, Parent, fl] = ldlsymbol (A) +% [Lnz, Parent, fl] = ldlsymbol (A, P) +% +% P is a permutation of 1:n, an output of AMD, SYMAMD, or SYMRCM, for example. +% Only the diagonal and upper triangular part of A or A(P,P) is accessed; the +% lower triangular part is ignored. If P is not provided, then P = 1:n is +% assumed. +% +% The elimination tree is returned in the Parent array. The number of nonzeros +% in each column of L is returned in Lnz. fl is the floating point operation +% count for a subsequent LDL' factorization. This mexFunction replicates the +% following MATLAB computations, using ldl_symbolic: +% +% Lnz = symbfact (A) - 1 ; +% Parent = etree (A) ; +% fl = sum (Lnz .* (Lnz + 2)) ; +% +% or, if P is provided, +% +% Lnz = symbfact (A (P,P)) - 1 ; +% Parent = etree (A (P,P)) ; +% fl = sum (Lnz .* (Lnz + 2)) ; +% +% Note that this routine is not required by LDL, since LDL does its own +% symbolic factorization. +% +% See also ldlsparse, symbfact, etree + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +error ('ldlsymbol mexFunction not found') ; diff --git a/external/ldl/MATLAB/ldlsymbolmex.c b/external/ldl/MATLAB/ldlsymbolmex.c new file mode 100644 index 00000000..e1a1fbf2 --- /dev/null +++ b/external/ldl/MATLAB/ldlsymbolmex.c @@ -0,0 +1,179 @@ +/* ========================================================================== */ +/* === ldlsymbolmex.c: LDLSYMBOL mexFunction =============================== */ +/* ========================================================================== */ + +/* MATLAB interface for symbolic LDL' factorization using the LDL sparse matrix + * package. This mexFunction is not required by the LDL mexFunction. + * + * MATLAB calling syntax is: + * + * [Lnz, Parent, flopcount] = ldlsymbol (A) + * [Lnz, Parent, flopcount] = ldlsymbol (A, P) + * + * P is a permutation of 1:n, an output of AMD, SYMAMD, or SYMRCM, for example. + * Only the diagonal and upper triangular part of A or A(P,P) is accessed; the + * lower triangular part is ignored. + * + * The elimination tree is returned in the Parent array. The number of nonzeros + * in each column of L is returned in Lnz. This mexFunction replicates the + * following MATLAB computations, using ldl_l_symbolic: + * + * Lnz = symbfact (A) - 1 ; + * Parent = etree (A) ; + * flopcount = sum (Lnz .* (Lnz + 2)) ; + * + * or, if P is provided, + * + * B = A (P,P) ; + * Lnz = symbfact (B) - 1 ; + * Parent = etree (B) ; + * flopcount = sum (Lnz .* (Lnz + 2)) ; + * + * This code is faster than the above MATLAB statements, typically by a factor + * of 4 to 40 (median speedup of 9) in MATLAB 6.5 on a Pentium 4 Linux laptop + * (excluding the B=A(P,P) time), on a wide range of symmetric sparse matrices. + * + * Copyright (c) 2006 by Timothy A Davis, http://www.suitesparse.com. + * All Rights Reserved. See LDL/Doc/License.txt for the License. + */ + +#ifndef LDL_LONG +#define LDL_LONG +#endif + +#include "ldl.h" +#include "mex.h" +#define Long SuiteSparse_long + +/* ========================================================================== */ +/* === LDLSYMBOL mexFunction ================================================ */ +/* ========================================================================== */ + +void mexFunction +( + int nargout, + mxArray *pargout[ ], + int nargin, + const mxArray *pargin[ ] +) +{ + Long i, n, *Pattern, *Flag, *Lp, *Ap, *Ai, *Lnz, *Parent, + *P, *Pinv, nn, k, j, permute ; + double flops, *p ; + + /* ---------------------------------------------------------------------- */ + /* get inputs and allocate workspace */ + /* ---------------------------------------------------------------------- */ + + if (nargin == 0 || nargin > 2) + { + mexErrMsgTxt ("Usage:\n" + " [Lnz, Parent, flopcount] = ldl (A) ;\n" + " [Lnz, Parent, flopcount] = ldl (A, P) ;\n") ; + } + n = mxGetM (pargin [0]) ; + if (!mxIsSparse (pargin [0]) || n != mxGetN (pargin [0]) + || mxIsComplex (pargin [0])) + { + mexErrMsgTxt ("ldlsymbol: A must be sparse, square, and real") ; + } + + nn = (n == 0) ? 1 : n ; + + /* get sparse matrix A */ + Ap = (Long *) mxGetJc (pargin [0]) ; + Ai = (Long *) mxGetIr (pargin [0]) ; + + /* get fill-reducing ordering, if present */ + permute = ((nargin > 1) && !mxIsEmpty (pargin [1])) ; + if (permute) + { + if (mxGetM (pargin [1]) * mxGetN (pargin [1]) != n || + mxIsSparse (pargin [1])) + { + mexErrMsgTxt ("ldlsymbol: invalid input permutation\n") ; + } + P = (Long *) mxMalloc (nn * sizeof (Long)) ; + Pinv = (Long *) mxMalloc (nn * sizeof (Long)) ; + p = mxGetPr (pargin [1]) ; + for (k = 0 ; k < n ; k++) + { + P [k] = p [k] - 1 ; /* convert to 0-based */ + } + } + else + { + P = (Long *) NULL ; + Pinv = (Long *) NULL ; + } + + /* allocate first part of L */ + Lp = (Long *) mxMalloc ((n+1) * sizeof (Long)) ; + Parent = (Long *) mxMalloc (nn * sizeof (Long)) ; + + /* get workspace */ + Flag = (Long *) mxMalloc (nn * sizeof (Long)) ; + Pattern = (Long *) mxMalloc (nn * sizeof (Long)) ; + Lnz = (Long *) mxMalloc (nn * sizeof (Long)) ; + + /* make sure the input P is valid */ + if (permute && !ldl_l_valid_perm (n, P, Flag)) + { + mexErrMsgTxt ("ldlsymbol: invalid input permutation\n") ; + } + + /* note that we assume that the input matrix is valid */ + + /* ---------------------------------------------------------------------- */ + /* symbolic factorization to get Lp, Parent, Lnz, and optionally Pinv */ + /* ---------------------------------------------------------------------- */ + + ldl_l_symbolic (n, Ap, Ai, Lp, Parent, Lnz, Flag, P, Pinv) ; + + /* ---------------------------------------------------------------------- */ + /* create outputs */ + /* ---------------------------------------------------------------------- */ + + /* create the output Lnz vector */ + pargout [0] = mxCreateDoubleMatrix (1, n, mxREAL) ; + p = mxGetPr (pargout [0]) ; + for (j = 0 ; j < n ; j++) + { + p [j] = Lnz [j] ; + } + + /* return elimination tree (add 1 to change from 0-based to 1-based) */ + if (nargout > 1) + { + pargout [1] = mxCreateDoubleMatrix (1, n, mxREAL) ; + p = mxGetPr (pargout [1]) ; + for (i = 0 ; i < n ; i++) + { + p [i] = Parent [i] + 1 ; + } + } + + if (nargout > 2) + { + /* find flop count for ldl_l_numeric */ + flops = 0 ; + for (k = 0 ; k < n ; k++) + { + flops += ((double) Lnz [k]) * (Lnz [k] + 2) ; + } + pargout [2] = mxCreateDoubleMatrix (1, 1, mxREAL) ; + p = mxGetPr (pargout [2]) ; + p [0] = flops ; + } + + if (permute) + { + mxFree (P) ; + mxFree (Pinv) ; + } + mxFree (Lp) ; + mxFree (Parent) ; + mxFree (Flag) ; + mxFree (Pattern) ; + mxFree (Lnz) ; +} diff --git a/external/ldl/MATLAB/ldltest.m b/external/ldl/MATLAB/ldltest.m new file mode 100644 index 00000000..795b0a4b --- /dev/null +++ b/external/ldl/MATLAB/ldltest.m @@ -0,0 +1,187 @@ +function ldltest +%LDLTEST test program for LDL +% +% Example: +% ldltest +% See also ldlsparse. + +% Copyright 2006-2007 by Timothy A. Davis, http://www.suitesparse.com + +help ldlsparse + +A = sparse ([ ]) ; + +[L, D, Parent, fl] = ldlsparse (A) ; %#ok +[L, D, Parent, fl] = ldlsparse (A, [ ]) ; %#ok + +try + [L, D, Parent, fl] = ldlsparse (A, [1 2]) ; + fprintf ('L = ') ; disp (L) + fprintf ('D = ') ; disp (D) + fprintf ('Parent = ') ; disp (Parent) + fprintf ('fl = %g\n', fl) ; + ok = 0 ; +catch + ok = 1 ; +end +if (~ok) + error ('?') ; +end + +try + ldlsparse + ok = 0 ; +catch + ok = 1 ; +end +if (~ok) + error ('?') +end + +try + [L, D, Parent, fl] = ldlsparse (1) ; %#ok + ok = 0 ; +catch + ok = 1 ; +end +if (~ok) + error ('?') +end + +try + x = ldlsparse (1,2) ; %#ok + ok = 0 ; +catch + ok = 1 ; +end +if (~ok) + error ('?') +end + +A =[ ... +1.7 0 0 0 0 0 0 0 .13 0 + 0 1.0 0 0 .02 0 0 0 0 .01 + 0 0 1.5 0 0 0 0 0 0 0 + 0 0 0 1.1 0 0 0 0 0 0 + 0 .02 0 0 2.6 0 .16 .09 .52 .53 + 0 0 0 0 0 1.2 0 0 0 0 + 0 0 0 0 .16 0 1.3 0 0 .56 + 0 0 0 0 .09 0 0 1.6 .11 0 +.13 0 0 0 .52 0 0 .11 1.4 0 + 0 .01 0 0 .53 0 .56 0 0 3.1 ] ; +A = sparse (A) ; +b = [ ... + .98 .64 .05 + .58 .20 .44 + .42 .37 .30 + .51 .78 .84 + .33 .68 .01 + .43 .46 .76 + .22 .56 .97 + .57 .79 .99 + .76 .05 .78 + .52 .60 .43 ] ; +P = [3 10 2 5 8 6 9 7 1 4] ; +I = speye (10) ; + +[L, D, Parent, fl] = ldlsparse (A) ; +err = norm ((L+I)*D*(L+I)'-A, 1) ; +fprintf ('err: %g fl: %g\n', err, fl) ; +if (err > 1e-14) + error ('?') ; +end ; + +Parent2 = etree (A) ; +if (any (Parent2 ~= Parent)) + error ('?') ; +end + +[L, D, Parent] = ldlsparse (A) ; %#ok +err = norm ((L+I)*D*(L+I)'-A, 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +[L, D] = ldlsparse (A) ; +err = norm ((L+I)*D*(L+I)'-A, 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +L2 = ldlsparse (A) ; +err = norm (L - L2, 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +x = ldlsparse (A, [ ], b) ; +err = norm (A*x-b, 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +[x, fl] = ldlsparse (A, [ ], b) ; +err = norm (A*x-b, 1) ; +fprintf ('err: %g fl: %g\n', err, fl) ; +if (err > 1e-14) + error ('?') ; +end ; + +[L, D, Parent, fl] = ldlsparse (A, P) ; +err = norm ((L+I)*D*(L+I)'-A(P,P), 1) ; +fprintf ('err: %g fl: %g\n', err, fl) ; +if (err > 1e-14) + error ('?') ; +end ; + +Parent2 = etree (A (P,P)) ; +if (any (Parent2 ~= Parent)) + error ('?') ; +end + +clf +subplot (2,2,1), spy (A), title ('original matrix') ; +subplot (2,2,2), spy (A (P,P)), title ('permuted matrix') ; +subplot (2,2,3), spy (L+D+L'), title ('L+D+L''') ; +subplot (2,2,4), treeplot (Parent), title ('elimination tree') ; + +[L, D, Parent] = ldlsparse (A, P) ; +err = norm ((L+I)*D*(L+I)'-A(P,P), 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +[L, D] = ldlsparse (A, P) ; +err = norm ((L+I)*D*(L+I)'-A(P,P), 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +L2 = ldlsparse (A, P) ; +err = norm (L - L2, 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +x = ldlsparse (A, P, b) ; +err = norm (A*x-b, 1) ; +fprintf ('err: %g\n', err) ; +if (err > 1e-14) + error ('?') ; +end ; + +[x, fl] = ldlsparse (A, P, b) ; +err = norm (A*x-b, 1) ; +fprintf ('err: %g fl: %g\n', err, fl) ; +if (err > 1e-14) + error ('?') ; +end ; + +fprintf ('\nldl: all tests passed\n') ; diff --git a/external/ldl/Matrix/A01 b/external/ldl/Matrix/A01 new file mode 100644 index 00000000..e96ce3d5 --- /dev/null +++ b/external/ldl/Matrix/A01 @@ -0,0 +1,3 @@ +name: Dense/0 n: 0 entries: 0 +0 0 +0 diff --git a/external/ldl/Matrix/A02 b/external/ldl/Matrix/A02 new file mode 100644 index 00000000..c5ac8772 --- /dev/null +++ b/external/ldl/Matrix/A02 @@ -0,0 +1,3 @@ +name: Dense/0 n: 0 entries: 0 (jumbled version) +0 1 +0 diff --git a/external/ldl/Matrix/A03 b/external/ldl/Matrix/A03 new file mode 100644 index 00000000..5f371a61 --- /dev/null +++ b/external/ldl/Matrix/A03 @@ -0,0 +1,7 @@ +name: Dense/1 n: 1 entries: 1 +1 0 +0 +1 +0 +1.90275 +0 diff --git a/external/ldl/Matrix/A04 b/external/ldl/Matrix/A04 new file mode 100644 index 00000000..c203274d --- /dev/null +++ b/external/ldl/Matrix/A04 @@ -0,0 +1,9 @@ +name: Dense/1 n: 1 entries: 2 (jumbled version) +1 1 +0 +2 +0 +0 +1.90275 +0.606843 +0 diff --git a/external/ldl/Matrix/A05 b/external/ldl/Matrix/A05 new file mode 100644 index 00000000..5cec713f --- /dev/null +++ b/external/ldl/Matrix/A05 @@ -0,0 +1,15 @@ +name: Dense/2 n: 2 entries: 4 +2 0 +0 +2 +4 +0 +1 +0 +1 +1.78915 +0.389047 +0.389047 +1.67505 +0 +1 diff --git a/external/ldl/Matrix/A06 b/external/ldl/Matrix/A06 new file mode 100644 index 00000000..6ed9b9f2 --- /dev/null +++ b/external/ldl/Matrix/A06 @@ -0,0 +1,17 @@ +name: Dense/2 n: 2 entries: 5 (jumbled version) +2 1 +0 +3 +5 +0 +1 +0 +1 +0 +1.78915 +0.389047 +0.738207 +1.67505 +0.389047 +0 +1 diff --git a/external/ldl/Matrix/A07 b/external/ldl/Matrix/A07 new file mode 100644 index 00000000..f71a6f59 --- /dev/null +++ b/external/ldl/Matrix/A07 @@ -0,0 +1,27 @@ +name: Dense/3 n: 3 entries: 9 +3 0 +0 +3 +6 +9 +0 +1 +2 +0 +1 +2 +0 +1 +2 +1.92648 +0.776267 +0.405764 +0.776267 +1.68063 +0.250703 +0.405764 +0.250703 +1.44517 +0 +1 +2 diff --git a/external/ldl/Matrix/A08 b/external/ldl/Matrix/A08 new file mode 100644 index 00000000..3e7a8ed8 --- /dev/null +++ b/external/ldl/Matrix/A08 @@ -0,0 +1,31 @@ +name: Dense/3 n: 3 entries: 11 (jumbled version) +3 1 +0 +4 +7 +11 +2 +0 +1 +2 +1 +0 +2 +0 +2 +0 +1 +0.262576 +1.92648 +0.776267 +0.405764 +1.68063 +0.776267 +0.250703 +0.262576 +1.44517 +0.405764 +0.250703 +0 +1 +2 diff --git a/external/ldl/Matrix/A09 b/external/ldl/Matrix/A09 new file mode 100644 index 00000000..3f00aad1 --- /dev/null +++ b/external/ldl/Matrix/A09 @@ -0,0 +1,371 @@ +name: HB/can_24 n: 24 entries: 160 +24 0 +0 +9 +15 +21 +27 +33 +39 +48 +57 +61 +70 +76 +82 +88 +94 +100 +106 +110 +119 +128 +137 +143 +152 +156 +160 +0 +5 +6 +12 +13 +17 +18 +19 +21 +1 +8 +9 +13 +14 +17 +2 +6 +11 +20 +21 +22 +3 +7 +10 +15 +18 +19 +4 +7 +9 +14 +15 +16 +0 +5 +6 +12 +13 +17 +0 +2 +5 +6 +11 +12 +19 +21 +23 +3 +4 +7 +9 +14 +15 +16 +17 +18 +1 +8 +9 +14 +1 +4 +7 +8 +9 +13 +14 +17 +18 +3 +10 +18 +19 +20 +21 +2 +6 +11 +12 +21 +23 +0 +5 +6 +11 +12 +23 +0 +1 +5 +9 +13 +17 +1 +4 +7 +8 +9 +14 +3 +4 +7 +15 +16 +18 +4 +7 +15 +16 +0 +1 +5 +7 +9 +13 +17 +18 +19 +0 +3 +7 +9 +10 +15 +17 +18 +19 +0 +3 +6 +10 +17 +18 +19 +20 +21 +2 +10 +19 +20 +21 +22 +0 +2 +6 +10 +11 +19 +20 +21 +22 +2 +20 +21 +22 +6 +11 +12 +23 +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 +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 +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 +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 +1 +1 +1 +1 +22 +20 +10 +23 +12 +5 +16 +8 +14 +4 +15 +7 +1 +9 +13 +17 +0 +2 +3 +6 +11 +18 +21 +19 diff --git a/external/ldl/Matrix/A10 b/external/ldl/Matrix/A10 new file mode 100644 index 00000000..a5dc3e98 --- /dev/null +++ b/external/ldl/Matrix/A10 @@ -0,0 +1,427 @@ +name: HB/can_24 n: 24 entries: 188 (jumbled version) +24 1 +0 +10 +16 +23 +30 +37 +44 +54 +67 +71 +81 +89 +95 +102 +108 +114 +123 +128 +141 +152 +161 +168 +179 +183 +188 +12 +6 +13 +5 +17 +21 +19 +0 +21 +18 +14 +17 +9 +8 +1 +13 +2 +21 +22 +21 +11 +6 +20 +15 +10 +18 +3 +7 +19 +10 +16 +9 +14 +15 +7 +7 +4 +6 +17 +12 +0 +5 +17 +13 +21 +0 +6 +11 +23 +6 +2 +12 +5 +19 +17 +15 +15 +14 +7 +3 +18 +16 +4 +4 +9 +18 +17 +8 +1 +9 +14 +18 +8 +14 +9 +13 +17 +17 +1 +7 +4 +20 +20 +21 +3 +19 +18 +3 +10 +12 +23 +11 +21 +6 +2 +11 +23 +5 +12 +0 +23 +6 +5 +0 +9 +17 +13 +1 +7 +1 +4 +9 +14 +8 +7 +15 +7 +18 +15 +18 +16 +4 +3 +16 +4 +7 +16 +15 +17 +7 +5 +17 +9 +0 +13 +1 +19 +5 +18 +7 +9 +15 +0 +19 +9 +7 +18 +3 +7 +17 +15 +10 +21 +10 +3 +6 +18 +19 +17 +20 +0 +19 +21 +2 +10 +22 +10 +20 +21 +19 +10 +22 +11 +20 +0 +0 +2 +2 +6 +20 +2 +21 +22 +6 +12 +23 +11 +12 +1 +1 +1 +1 +1 +0.435191 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.445161 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.00496365 +1 +1 +1 +1 +1 +0.215083 +1 +1 +1 +1 +1 +1 +0.0801502 +1 +1 +1 +1 +1 +1 +0.869867 +1 +1 +1 +1 +0.436428 +1 +0.332466 +1 +1 +1 +0.367454 +1 +0.215083 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.409378 +1 +1 +1 +1 +0.132225 +1 +1 +1 +1 +1 +0.00496365 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.483444 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.332466 +0.23788 +1 +0.467118 +1 +1 +1 +1 +1 +0.645831 +1 +1 +1 +1 +1 +0.436428 +1 +0.13701 +0.409378 +1 +1 +1 +1 +0.0801502 +1 +1 +1 +1 +1 +1 +1 +0.367454 +1 +1 +1 +1 +0.467118 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.132225 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +0.435191 +1 +0.445161 +1 +1 +1 +1 +1 +1 +0.483444 +1 +1 +1 +22 +20 +10 +23 +12 +5 +16 +8 +14 +4 +15 +7 +1 +9 +13 +17 +0 +2 +3 +6 +11 +18 +21 +19 diff --git a/external/ldl/Matrix/A11 b/external/ldl/Matrix/A11 new file mode 100644 index 00000000..230e32b2 --- /dev/null +++ b/external/ldl/Matrix/A11 @@ -0,0 +1,615 @@ +name: FIDAP/ex5 n: 27 entries: 279 +27 0 +0 +6 +18 +27 +42 +51 +66 +75 +87 +93 +99 +111 +120 +135 +144 +159 +168 +180 +186 +192 +204 +213 +228 +237 +252 +261 +273 +279 +0 +1 +9 +10 +18 +19 +0 +1 +2 +3 +9 +10 +11 +12 +18 +19 +20 +21 +1 +2 +3 +10 +11 +12 +19 +20 +21 +1 +2 +3 +4 +5 +10 +11 +12 +13 +14 +19 +20 +21 +22 +23 +3 +4 +5 +12 +13 +14 +21 +22 +23 +3 +4 +5 +6 +7 +12 +13 +14 +15 +16 +21 +22 +23 +24 +25 +5 +6 +7 +14 +15 +16 +23 +24 +25 +5 +6 +7 +8 +14 +15 +16 +17 +23 +24 +25 +26 +7 +8 +16 +17 +25 +26 +0 +1 +9 +10 +18 +19 +0 +1 +2 +3 +9 +10 +11 +12 +18 +19 +20 +21 +1 +2 +3 +10 +11 +12 +19 +20 +21 +1 +2 +3 +4 +5 +10 +11 +12 +13 +14 +19 +20 +21 +22 +23 +3 +4 +5 +12 +13 +14 +21 +22 +23 +3 +4 +5 +6 +7 +12 +13 +14 +15 +16 +21 +22 +23 +24 +25 +5 +6 +7 +14 +15 +16 +23 +24 +25 +5 +6 +7 +8 +14 +15 +16 +17 +23 +24 +25 +26 +7 +8 +16 +17 +25 +26 +0 +1 +9 +10 +18 +19 +0 +1 +2 +3 +9 +10 +11 +12 +18 +19 +20 +21 +1 +2 +3 +10 +11 +12 +19 +20 +21 +1 +2 +3 +4 +5 +10 +11 +12 +13 +14 +19 +20 +21 +22 +23 +3 +4 +5 +12 +13 +14 +21 +22 +23 +3 +4 +5 +6 +7 +12 +13 +14 +15 +16 +21 +22 +23 +24 +25 +5 +6 +7 +14 +15 +16 +23 +24 +25 +5 +6 +7 +8 +14 +15 +16 +17 +23 +24 +25 +26 +7 +8 +16 +17 +25 +26 +1.03704e+06 +259259 +-1.18519e+06 +-296297 +148148 +37037.1 +259259 +296298 +259259 +-18518.6 +-296297 +-148149 +-296297 +-74074 +37037.1 +-148148 +37037.1 +92592.6 +259259 +1.03704e+06 +259259 +-296297 +-1.18519e+06 +-296297 +37037.1 +148148 +37037.1 +-18518.6 +259259 +296298 +259259 +-18518.6 +-74074 +-296297 +-148149 +-296297 +-74074 +92592.6 +37037.1 +-148148 +37037.1 +92592.6 +259259 +1.03704e+06 +259259 +-296297 +-1.18519e+06 +-296297 +37037.1 +148148 +37037.1 +-18518.6 +259259 +296298 +259259 +-18518.6 +-74074 +-296297 +-148149 +-296297 +-74074 +92592.6 +37037.1 +-148148 +37037.1 +92592.6 +259259 +1.03704e+06 +259259 +-296297 +-1.18519e+06 +-296297 +37037.1 +148148 +37037.1 +-18518.6 +259259 +296298 +259259 +-74074 +-296297 +-148149 +-296297 +92592.6 +37037.1 +-148148 +37037.1 +259259 +1.03704e+06 +-296297 +-1.18519e+06 +37037.1 +148148 +-1.18519e+06 +-296297 +2.37038e+06 +592592 +-1.18519e+06 +-296297 +-296297 +-148149 +-296297 +-74074 +592592 +296300 +592592 +148148 +-296297 +-148149 +-296297 +-74074 +-296297 +-1.18519e+06 +-296297 +592592 +2.37038e+06 +592592 +-296297 +-1.18519e+06 +-296297 +-74074 +-296297 +-148149 +-296297 +-74074 +148148 +592592 +296300 +592592 +148148 +-74074 +-296297 +-148149 +-296297 +-74074 +-296297 +-1.18519e+06 +-296297 +592592 +2.37038e+06 +592592 +-296297 +-1.18519e+06 +-296297 +-74074 +-296297 +-148149 +-296297 +-74074 +148148 +592592 +296300 +592592 +148148 +-74074 +-296297 +-148149 +-296297 +-74074 +-296297 +-1.18519e+06 +-296297 +592592 +2.37038e+06 +592592 +-296297 +-1.18519e+06 +-296297 +-74074 +-296297 +-148149 +-296297 +148148 +592592 +296300 +592592 +-74074 +-296297 +-148149 +-296297 +-296297 +-1.18519e+06 +592592 +2.37038e+06 +-296297 +-1.18519e+06 +148148 +37037.1 +-1.18519e+06 +-296297 +1.03704e+06 +259259 +37037.1 +-148148 +37037.1 +92592.6 +-296297 +-148149 +-296297 +-74074 +259259 +296298 +259259 +-18518.6 +37037.1 +148148 +37037.1 +-296297 +-1.18519e+06 +-296297 +259259 +1.03704e+06 +259259 +92592.6 +37037.1 +-148148 +37037.1 +92592.6 +-74074 +-296297 +-148149 +-296297 +-74074 +-18518.6 +259259 +296298 +259259 +-18518.6 +37037.1 +148148 +37037.1 +-296297 +-1.18519e+06 +-296297 +259259 +1.03704e+06 +259259 +92592.6 +37037.1 +-148148 +37037.1 +92592.6 +-74074 +-296297 +-148149 +-296297 +-74074 +-18518.6 +259259 +296298 +259259 +-18518.6 +37037.1 +148148 +37037.1 +-296297 +-1.18519e+06 +-296297 +259259 +1.03704e+06 +259259 +92592.6 +37037.1 +-148148 +37037.1 +-74074 +-296297 +-148149 +-296297 +-18518.6 +259259 +296298 +259259 +37037.1 +148148 +-296297 +-1.18519e+06 +259259 +1.03704e+06 +8 +17 +26 +0 +9 +18 +1 +2 +10 +11 +20 +19 +3 +4 +12 +13 +22 +21 +5 +6 +7 +14 +15 +16 +24 +25 +23 diff --git a/external/ldl/Matrix/A12 b/external/ldl/Matrix/A12 new file mode 100644 index 00000000..5c23fd89 --- /dev/null +++ b/external/ldl/Matrix/A12 @@ -0,0 +1,707 @@ +name: FIDAP/ex5 n: 27 entries: 325 (jumbled version) +27 1 +0 +6 +19 +31 +47 +57 +76 +87 +101 +109 +115 +127 +139 +158 +168 +186 +196 +211 +217 +223 +236 +247 +265 +275 +293 +303 +318 +325 +19 +9 +10 +18 +1 +0 +0 +2 +12 +9 +12 +3 +1 +11 +21 +19 +10 +18 +20 +21 +1 +20 +12 +2 +3 +11 +12 +21 +10 +11 +19 +22 +20 +23 +19 +21 +13 +19 +10 +14 +11 +3 +2 +12 +4 +1 +5 +13 +5 +22 +4 +23 +21 +14 +22 +3 +12 +13 +14 +7 +23 +15 +4 +7 +3 +24 +21 +25 +16 +12 +5 +6 +12 +14 +6 +22 +5 +16 +25 +5 +23 +23 +6 +14 +15 +24 +7 +5 +26 +24 +25 +17 +8 +5 +14 +16 +8 +15 +23 +7 +6 +25 +17 +16 +26 +7 +25 +8 +7 +9 +1 +0 +10 +19 +18 +18 +9 +10 +11 +19 +2 +1 +21 +3 +12 +20 +0 +11 +12 +10 +21 +19 +21 +20 +1 +2 +2 +20 +3 +5 +2 +20 +22 +12 +4 +14 +2 +11 +1 +5 +1 +19 +13 +23 +12 +3 +10 +21 +14 +23 +23 +5 +22 +21 +13 +4 +12 +3 +4 +6 +24 +22 +3 +16 +15 +16 +21 +12 +23 +21 +13 +5 +25 +7 +14 +5 +5 +7 +16 +14 +23 +6 +25 +15 +25 +24 +6 +14 +5 +7 +26 +15 +24 +26 +24 +25 +17 +8 +23 +14 +16 +16 +8 +17 +25 +26 +7 +18 +1 +10 +9 +19 +0 +1 +12 +11 +18 +3 +21 +0 +19 +9 +2 +10 +3 +20 +11 +19 +21 +20 +3 +10 +2 +20 +11 +1 +12 +22 +11 +13 +4 +14 +20 +19 +11 +2 +23 +1 +3 +10 +21 +5 +12 +2 +14 +12 +3 +23 +13 +21 +4 +4 +14 +5 +22 +6 +15 +13 +23 +3 +5 +24 +22 +14 +16 +6 +7 +25 +25 +21 +4 +13 +12 +7 +15 +5 +24 +14 +6 +16 +25 +23 +16 +5 +8 +6 +26 +14 +23 +17 +23 +15 +24 +15 +7 +8 +25 +16 +16 +7 +25 +16 +26 +17 +8 +37037.1 +-1.18519e+06 +-296297 +148148 +259259 +1.03704e+06 +259259 +259259 +-74074 +-296297 +0.440353 +-18518.6 +296298 +-296297 +92592.6 +-148148 +-148149 +37037.1 +37037.1 +37037.1 +259259 +148148 +-296297 +1.03704e+06 +259259 +0.280408 +0.33095 +0.483351 +-296297 +-1.18519e+06 +37037.1 +37037.1 +37037.1 +92592.6 +92592.6 +-148148 +-296297 +0.293848 +-74074 +-74074 +-296297 +296298 +259259 +-148149 +259259 +-18518.6 +-18518.6 +-1.18519e+06 +259259 +0.0325172 +1.03704e+06 +37037.1 +37037.1 +-296297 +148148 +259259 +-296297 +-296297 +-148149 +0.401515 +-148148 +-296297 +259259 +-18518.6 +-18518.6 +37037.1 +92592.6 +92592.6 +-74074 +-74074 +296298 +0.158875 +0.22728 +0.0651008 +259259 +37037.1 +259259 +-296297 +37037.1 +0.158875 +0.333923 +37037.1 +1.03704e+06 +-296297 +-1.18519e+06 +148148 +259259 +-18518.6 +37037.1 +37037.1 +-148148 +-296297 +0.308317 +0.401515 +-74074 +-148149 +259259 +-296297 +92592.6 +296298 +259259 +37037.1 +-1.18519e+06 +-296297 +148148 +0.308317 +0.255077 +1.03704e+06 +259259 +2.37038e+06 +-296297 +-1.18519e+06 +592592 +-296297 +-1.18519e+06 +-296297 +592592 +296300 +592592 +-148149 +-296297 +-148149 +-74074 +-74074 +148148 +-296297 +-296297 +2.37038e+06 +592592 +592592 +-296297 +-296297 +0.520633 +0.49806 +-296297 +0.280408 +-1.18519e+06 +-1.18519e+06 +-296297 +0.22728 +0.33095 +-296297 +-296297 +0.904949 +-296297 +148148 +-296297 +592592 +0.440353 +-74074 +-74074 +-74074 +592592 +-74074 +296300 +-148149 +148148 +-148149 +592592 +0.166548 +-296297 +-296297 +-1.18519e+06 +-296297 +2.37038e+06 +-1.18519e+06 +592592 +-296297 +-296297 +-296297 +-296297 +-296297 +-74074 +0.411059 +592592 +148148 +-74074 +148148 +-148149 +0.238296 +592592 +-148149 +-74074 +-74074 +296300 +0.0651008 +-296297 +-296297 +592592 +592592 +-296297 +-1.18519e+06 +-296297 +2.37038e+06 +0.34257 +-1.18519e+06 +-296297 +0.411059 +-74074 +-148149 +0.610887 +592592 +0.257604 +-296297 +-296297 +-148149 +592592 +-296297 +-74074 +148148 +296300 +592592 +-1.18519e+06 +2.37038e+06 +-296297 +-1.18519e+06 +-296297 +1.03704e+06 +37037.1 +-296297 +-1.18519e+06 +259259 +148148 +-148148 +-74074 +-296297 +259259 +0.293848 +-18518.6 +37037.1 +296298 +-296297 +37037.1 +-148149 +92592.6 +259259 +0.49806 +259259 +259259 +0.0136264 +37037.1 +-296297 +148148 +1.03704e+06 +-1.18519e+06 +37037.1 +-296297 +259259 +0.520633 +-296297 +37037.1 +0.238296 +259259 +-18518.6 +-296297 +0.483351 +-18518.6 +92592.6 +-148148 +-74074 +296298 +92592.6 +-148149 +37037.1 +-74074 +-296297 +37037.1 +259259 +-1.18519e+06 +259259 +0.0325172 +148148 +-296297 +37037.1 +1.03704e+06 +37037.1 +-296297 +-296297 +296298 +92592.6 +-148148 +259259 +259259 +-148149 +-74074 +0.333923 +92592.6 +-18518.6 +0.127177 +-18518.6 +37037.1 +0.166548 +-74074 +37037.1 +-1.18519e+06 +37037.1 +1.03704e+06 +-296297 +148148 +0.257604 +259259 +259259 +-296297 +92592.6 +37037.1 +37037.1 +259259 +-74074 +-18518.6 +-296297 +0.127177 +-296297 +259259 +0.34257 +-148148 +0.255077 +296298 +-148149 +0.610887 +37037.1 +259259 +-296297 +1.03704e+06 +-1.18519e+06 +148148 +8 +17 +26 +0 +9 +18 +1 +2 +10 +11 +20 +19 +3 +4 +12 +13 +22 +21 +5 +6 +7 +14 +15 +16 +24 +25 +23 diff --git a/external/ldl/Matrix/A13 b/external/ldl/Matrix/A13 new file mode 100644 index 00000000..afdeba09 --- /dev/null +++ b/external/ldl/Matrix/A13 @@ -0,0 +1,899 @@ +name: HB/bcsstk01 n: 48 entries: 400 +48 0 +0 +8 +16 +24 +32 +40 +48 +56 +64 +72 +80 +88 +96 +107 +119 +131 +142 +154 +166 +174 +182 +190 +198 +206 +214 +221 +226 +231 +238 +243 +248 +256 +264 +272 +280 +288 +296 +304 +312 +320 +328 +336 +344 +354 +363 +372 +382 +391 +400 +0 +4 +5 +6 +10 +18 +24 +29 +1 +3 +5 +7 +9 +19 +23 +25 +2 +3 +4 +8 +20 +22 +26 +27 +1 +2 +3 +7 +9 +21 +26 +27 +0 +2 +4 +6 +10 +20 +22 +28 +0 +1 +5 +11 +19 +23 +24 +29 +0 +4 +6 +10 +11 +12 +30 +35 +1 +3 +7 +9 +11 +13 +17 +31 +2 +8 +9 +10 +14 +16 +32 +33 +1 +3 +7 +8 +9 +15 +32 +33 +0 +4 +6 +8 +10 +14 +16 +34 +5 +6 +7 +11 +13 +17 +30 +35 +6 +12 +16 +17 +18 +22 +36 +41 +42 +46 +47 +7 +11 +13 +14 +15 +17 +19 +21 +37 +43 +44 +45 +8 +10 +13 +14 +15 +16 +20 +38 +39 +43 +44 +45 +9 +13 +14 +15 +19 +21 +38 +39 +43 +44 +45 +8 +10 +12 +14 +16 +17 +18 +22 +40 +42 +46 +47 +7 +11 +12 +13 +16 +17 +23 +36 +41 +42 +46 +47 +0 +12 +16 +18 +22 +23 +42 +47 +1 +5 +13 +15 +19 +21 +23 +43 +2 +4 +14 +20 +21 +22 +44 +45 +3 +13 +15 +19 +20 +21 +44 +45 +2 +4 +12 +16 +18 +20 +22 +46 +1 +5 +17 +18 +19 +23 +42 +47 +0 +5 +24 +28 +29 +30 +34 +1 +25 +27 +31 +33 +2 +3 +26 +27 +32 +2 +3 +25 +26 +27 +31 +33 +4 +24 +28 +30 +34 +0 +5 +24 +29 +35 +6 +11 +24 +28 +30 +34 +35 +36 +7 +25 +27 +31 +33 +35 +37 +41 +8 +9 +26 +32 +33 +34 +38 +40 +8 +9 +25 +27 +31 +32 +33 +39 +10 +24 +28 +30 +32 +34 +38 +40 +6 +11 +29 +30 +31 +35 +37 +41 +12 +17 +30 +36 +40 +41 +42 +46 +13 +31 +35 +37 +39 +41 +43 +45 +14 +15 +32 +34 +38 +39 +40 +44 +14 +15 +33 +37 +38 +39 +43 +45 +16 +32 +34 +36 +38 +40 +42 +46 +12 +17 +31 +35 +36 +37 +41 +47 +12 +16 +17 +18 +23 +36 +40 +42 +46 +47 +13 +14 +15 +19 +37 +39 +43 +44 +45 +13 +14 +15 +20 +21 +38 +43 +44 +45 +13 +14 +15 +20 +21 +37 +39 +43 +44 +45 +12 +16 +17 +22 +36 +40 +42 +46 +47 +12 +16 +17 +18 +23 +41 +42 +46 +47 +2.83227e+06 +1e+06 +2.08333e+06 +-3333.33 +1e+06 +-2.8e+06 +-28935.2 +2.08333e+06 +1.63545e+06 +-2e+06 +5.55556e+06 +-6666.67 +-2e+06 +-30864.2 +5.55556e+06 +-1.59792e+06 +1.72437e+06 +-2.08333e+06 +-2.77778e+06 +-1.68e+06 +-15432.1 +-2.77778e+06 +-28935.2 +-2.08333e+06 +-2e+06 +-2.08333e+06 +1.00333e+09 +2e+06 +4e+08 +-3.33333e+06 +2.08333e+06 +1e+08 +1e+06 +-2.77778e+06 +1.0675e+09 +-1e+06 +2e+08 +2.77778e+06 +3.33333e+08 +-833333 +2.08333e+06 +5.55556e+06 +1.53533e+09 +-2e+06 +-5.55556e+06 +6.66667e+08 +-2.08333e+06 +1e+08 +-3333.33 +-1e+06 +2.83227e+06 +-1e+06 +2.08333e+06 +-2.8e+06 +-28935.2 +2.08333e+06 +-6666.67 +2e+06 +1.63545e+06 +2e+06 +5.55556e+06 +-30864.2 +5.55556e+06 +-1.59792e+06 +-1.68e+06 +1.72437e+06 +-2.08333e+06 +-2.77778e+06 +-15432.1 +-2.77778e+06 +-28935.2 +-2.08333e+06 +-2e+06 +4e+08 +2e+06 +-2.08333e+06 +1.00333e+09 +-3.33333e+06 +2.08333e+06 +1e+08 +1e+06 +2e+08 +-1e+06 +-2.77778e+06 +1.0675e+09 +2.77778e+06 +3.33333e+08 +-833333 +-2e+06 +2.08333e+06 +5.55556e+06 +1.53533e+09 +-5.55556e+06 +6.66667e+08 +-2.08333e+06 +1e+08 +-2.8e+06 +2.8361e+06 +-2.14929e+06 +2.35916e+06 +-3333.33 +-1e+06 +-28935.2 +2.08333e+06 +-3830.95 +-1.14929e+06 +275828 +-30864.2 +-5.55556e+06 +1.76741e+06 +517922 +4.29857e+06 +-5.55556e+06 +-6666.67 +2e+06 +-1.59792e+06 +-131963 +-517922 +2.29857e+06 +-15432.1 +2.77778e+06 +517922 +3.89004e+06 +-2.63499e+06 +2.77778e+06 +-1.68e+06 +-28935.2 +-2.08333e+06 +-517922 +-2.16567e+06 +-551657 +-3.33333e+06 +4.29857e+06 +-2.63499e+06 +1.97572e+09 +-2e+06 +4e+08 +2.08333e+06 +1e+08 +-2.29857e+06 +551657 +4.86194e+08 +-2.77778e+06 +3.33333e+08 +-2.14929e+06 +2.77778e+06 +1.52735e+09 +-1.0978e+08 +1e+06 +2e+08 +-833333 +1.14929e+06 +2.29725e+08 +-5.57174e+07 +5.55556e+06 +6.66667e+08 +2.35916e+06 +-5.55556e+06 +-1.0978e+08 +1.56411e+09 +-2e+06 +-2.08333e+06 +1e+08 +-275828 +-5.57174e+07 +1.09412e+07 +-2.8e+06 +-3333.33 +1e+06 +2.83227e+06 +1e+06 +2.08333e+06 +-28935.2 +2.08333e+06 +-30864.2 +-5.55556e+06 +-6666.67 +-2e+06 +1.63545e+06 +-2e+06 +-5.55556e+06 +-1.59792e+06 +-15432.1 +2.77778e+06 +-1.68e+06 +1.72437e+06 +-2.08333e+06 +2.77778e+06 +-28935.2 +-2.08333e+06 +-3.33333e+06 +2e+06 +4e+08 +-2e+06 +-2.08333e+06 +1.00333e+09 +2.08333e+06 +1e+08 +-2.77778e+06 +3.33333e+08 +-1e+06 +2e+08 +1e+06 +2.77778e+06 +1.0675e+09 +-833333 +5.55556e+06 +6.66667e+08 +-2e+06 +2.08333e+06 +-5.55556e+06 +1.53533e+09 +-2.08333e+06 +1e+08 +-28935.2 +-2.08333e+06 +60879.6 +1.25e+06 +416667 +-4166.67 +1.25e+06 +-1.59792e+06 +3.37292e+06 +-2.5e+06 +-8333.33 +-2.5e+06 +-28935.2 +2.08333e+06 +2.41171e+06 +-416667 +-2.355e+06 +-2.08333e+06 +1e+08 +-2.5e+06 +-416667 +1.5e+09 +2.5e+06 +5e+08 +-833333 +1.25e+06 +5.01833e+08 +-1.25e+06 +2.5e+08 +2.08333e+06 +1e+08 +416667 +5.025e+08 +-2.5e+06 +-28935.2 +-2.08333e+06 +-4166.67 +-1.25e+06 +3.98588e+06 +-1.25e+06 +416667 +-3.925e+06 +-1.59792e+06 +-8333.33 +2.5e+06 +3.4115e+06 +2.5e+06 +6.94444e+06 +-38580.2 +6.94444e+06 +-28935.2 +2.08333e+06 +-2.355e+06 +2.431e+06 +-416667 +-3.47222e+06 +-19290.1 +-3.47222e+06 +-2.08333e+06 +1e+08 +-2.5e+06 +5e+08 +2.5e+06 +-416667 +1.50417e+09 +-4.16667e+06 +-833333 +1.25e+06 +2.5e+08 +-1.25e+06 +-3.47222e+06 +1.33517e+09 +3.47222e+06 +4.16667e+08 +2.08333e+06 +1e+08 +-2.5e+06 +416667 +6.94444e+06 +2.16917e+09 +-6.94444e+06 +8.33333e+08 +-28935.2 +-2.08333e+06 +-3.925e+06 +3.98588e+06 +-1.25e+06 +416667 +-4166.67 +-1.25e+06 +-1.59792e+06 +-38580.2 +-6.94444e+06 +3.4115e+06 +2.5e+06 +-6.94444e+06 +-8333.33 +2.5e+06 +-28935.2 +2.08333e+06 +-19290.1 +3.47222e+06 +2.431e+06 +-416667 +3.47222e+06 +-2.355e+06 +-2.08333e+06 +1e+08 +-4.16667e+06 +2.5e+06 +-416667 +1.50417e+09 +-2.5e+06 +5e+08 +-833333 +-3.47222e+06 +4.16667e+08 +-1.25e+06 +3.47222e+06 +1.33517e+09 +1.25e+06 +2.5e+08 +2.08333e+06 +1e+08 +6.94444e+06 +8.33333e+08 +416667 +-6.94444e+06 +2.16917e+09 +-2.5e+06 +-3830.95 +1.14929e+06 +-275828 +-28935.2 +-2.08333e+06 +-4166.67 +1.25e+06 +64710.6 +2.39929e+06 +140838 +-131963 +-517922 +-2.29857e+06 +-1.59792e+06 +-8333.33 +-2.5e+06 +3.50488e+06 +517922 +-4.79857e+06 +-517922 +-2.16567e+06 +551657 +-28935.2 +2.08333e+06 +-2.355e+06 +517922 +4.57738e+06 +134990 +2.29857e+06 +-551657 +4.86194e+08 +-2.08333e+06 +1e+08 +2.5e+06 +5e+08 +-4.79857e+06 +134990 +2.47239e+09 +-1.14929e+06 +2.29725e+08 +-5.57174e+07 +-833333 +-1.25e+06 +2.5e+08 +2.39929e+06 +9.6168e+08 +-1.0978e+08 +275828 +-5.57174e+07 +1.09412e+07 +2.08333e+06 +1e+08 +-2.5e+06 +140838 +-1.0978e+08 +5.31278e+08 +25 +26 +27 +9 +39 +21 +44 +45 +43 +15 +3 +33 +41 +11 +28 +29 +24 +10 +0 +30 +6 +23 +22 +40 +46 +42 +4 +16 +18 +34 +5 +1 +2 +8 +12 +13 +14 +17 +19 +20 +31 +32 +35 +36 +37 +38 +47 +7 diff --git a/external/ldl/Matrix/A14 b/external/ldl/Matrix/A14 new file mode 100644 index 00000000..26013e50 --- /dev/null +++ b/external/ldl/Matrix/A14 @@ -0,0 +1,1043 @@ +name: HB/bcsstk01 n: 48 entries: 472 (jumbled version) +48 1 +0 +9 +18 +29 +40 +50 +58 +67 +77 +87 +98 +106 +114 +128 +142 +154 +166 +181 +195 +203 +213 +222 +235 +244 +252 +261 +266 +272 +282 +289 +294 +304 +316 +325 +336 +344 +353 +363 +372 +382 +391 +401 +410 +420 +430 +441 +452 +462 +472 +18 +5 +0 +10 +24 +0 +29 +4 +6 +9 +3 +7 +19 +5 +1 +25 +23 +19 +3 +26 +4 +27 +4 +22 +2 +27 +20 +3 +8 +2 +7 +26 +21 +27 +9 +1 +21 +3 +26 +2 +28 +28 +4 +22 +10 +6 +2 +0 +20 +2 +29 +24 +0 +11 +19 +5 +1 +23 +30 +12 +6 +4 +30 +0 +10 +35 +11 +17 +11 +13 +31 +9 +3 +7 +1 +9 +31 +14 +32 +9 +33 +9 +8 +16 +16 +10 +2 +3 +32 +15 +8 +8 +33 +33 +7 +7 +1 +9 +8 +4 +14 +0 +16 +34 +10 +6 +7 +13 +35 +30 +6 +5 +11 +17 +17 +36 +12 +6 +17 +16 +12 +22 +41 +42 +46 +47 +16 +18 +11 +21 +14 +15 +17 +44 +21 +37 +13 +7 +45 +43 +19 +43 +38 +15 +16 +44 +45 +13 +8 +43 +20 +14 +10 +39 +13 +9 +14 +38 +45 +39 +21 +19 +44 +15 +44 +43 +42 +22 +8 +22 +46 +16 +40 +14 +12 +17 +10 +8 +47 +18 +12 +36 +12 +46 +42 +16 +47 +41 +12 +17 +11 +7 +36 +13 +23 +22 +42 +47 +12 +23 +0 +18 +16 +21 +5 +1 +13 +43 +21 +19 +23 +15 +1 +21 +45 +21 +4 +14 +20 +22 +44 +2 +3 +20 +13 +3 +20 +45 +19 +15 +19 +44 +44 +21 +13 +18 +4 +16 +46 +22 +2 +20 +16 +12 +17 +19 +23 +47 +5 +42 +18 +1 +28 +0 +5 +30 +28 +30 +34 +29 +24 +27 +1 +31 +33 +25 +3 +3 +27 +32 +26 +2 +2 +26 +33 +25 +31 +31 +3 +27 +33 +2 +24 +4 +28 +34 +4 +30 +24 +0 +5 +35 +29 +24 +36 +24 +6 +11 +34 +30 +35 +6 +28 +24 +25 +31 +35 +41 +35 +41 +7 +33 +27 +7 +37 +27 +26 +38 +32 +34 +40 +8 +9 +33 +38 +32 +33 +27 +31 +39 +9 +27 +9 +8 +39 +25 +34 +24 +40 +32 +28 +30 +10 +38 +35 +6 +30 +11 +31 +29 +41 +37 +31 +46 +36 +40 +12 +40 +30 +17 +41 +17 +42 +35 +45 +45 +31 +43 +37 +39 +41 +13 +44 +15 +32 +34 +38 +39 +14 +32 +40 +40 +15 +38 +14 +45 +39 +33 +37 +43 +33 +46 +40 +42 +38 +34 +36 +32 +38 +16 +36 +37 +47 +36 +31 +41 +31 +12 +17 +35 +23 +46 +40 +42 +47 +18 +16 +36 +17 +12 +19 +43 +39 +44 +14 +37 +13 +13 +45 +15 +38 +13 +45 +21 +20 +15 +43 +21 +44 +15 +14 +39 +43 +14 +15 +20 +37 +37 +44 +21 +13 +45 +47 +16 +46 +47 +40 +17 +12 +36 +22 +42 +47 +46 +17 +16 +23 +42 +46 +18 +41 +12 +-2.8e+06 +2.08333e+06 +0.437734 +1e+06 +-28935.2 +2.83227e+06 +2.08333e+06 +1e+06 +-3333.33 +-2e+06 +-2e+06 +-6666.67 +0.156277 +5.55556e+06 +1.63545e+06 +-1.59792e+06 +5.55556e+06 +-30864.2 +-2.08333e+06 +-28935.2 +-2.77778e+06 +0.0553259 +0.317221 +-2.77778e+06 +1.72437e+06 +-2.08333e+06 +-15432.1 +0.10277 +-1.68e+06 +0.10277 +2e+06 +2.08333e+06 +-3.33333e+06 +1e+08 +4e+08 +-2e+06 +0.591763 +1.00333e+09 +0.0184915 +-2.08333e+06 +0.295898 +-833333 +1.0675e+09 +3.33333e+08 +2e+08 +-1e+06 +-2.77778e+06 +1e+06 +2.77778e+06 +0.317221 +1e+08 +-2.08333e+06 +2.08333e+06 +-2e+06 +-5.55556e+06 +1.53533e+09 +5.55556e+06 +6.66667e+08 +0.163355 +-2.8e+06 +2.83227e+06 +-1e+06 +-28935.2 +-3333.33 +-1e+06 +2.08333e+06 +2.08333e+06 +5.55556e+06 +5.55556e+06 +-30864.2 +0.394396 +0.159583 +2e+06 +1.63545e+06 +-6666.67 +2e+06 +-1.59792e+06 +-15432.1 +-28935.2 +0.158939 +-2.08333e+06 +-2.08333e+06 +1.72437e+06 +-2.77778e+06 +0.358447 +-2.77778e+06 +-1.68e+06 +4e+08 +2.08333e+06 +-3.33333e+06 +0.158939 +-2.08333e+06 +0.182244 +1e+08 +2e+06 +0.159583 +-2e+06 +1.00333e+09 +-2.77778e+06 +2e+08 +2.77778e+06 +1e+06 +3.33333e+08 +-833333 +1.0675e+09 +-1e+06 +5.55556e+06 +-5.55556e+06 +1e+08 +-2.08333e+06 +2.08333e+06 +-2e+06 +1.53533e+09 +6.66667e+08 +2.35916e+06 +-28935.2 +2.8361e+06 +-2.8e+06 +0.0962234 +0.489896 +0.0971951 +-1e+06 +2.08333e+06 +-3830.95 +-1.14929e+06 +275828 +-2.14929e+06 +-3333.33 +-5.55556e+06 +0.447277 +517922 +4.29857e+06 +-5.55556e+06 +-517922 +2e+06 +-1.59792e+06 +1.76741e+06 +-30864.2 +2.29857e+06 +0.321655 +-6666.67 +-131963 +-28935.2 +-2.63499e+06 +2.77778e+06 +-2.16567e+06 +-551657 +517922 +-15432.1 +-517922 +-1.68e+06 +3.89004e+06 +2.77778e+06 +-2.08333e+06 +4.29857e+06 +-3.33333e+06 +-2.63499e+06 +2.08333e+06 +4.86194e+08 +1e+08 +4e+08 +-2e+06 +551657 +1.97572e+09 +0.481793 +-2.29857e+06 +1.14929e+06 +0.0572546 +-2.77778e+06 +2e+08 +2.29725e+08 +1.52735e+09 +-833333 +2.77778e+06 +-2.14929e+06 +-1.0978e+08 +3.33333e+08 +0.358447 +-5.57174e+07 +1e+06 +0.489896 +-2.08333e+06 +0.0962234 +-5.57174e+07 +-275828 +-1.0978e+08 +1.09412e+07 +1e+08 +2.35916e+06 +1.56411e+09 +6.66667e+08 +5.55556e+06 +0.293721 +-5.55556e+06 +-2e+06 +1e+06 +-28935.2 +2.08333e+06 +-3333.33 +2.08333e+06 +-2.8e+06 +2.83227e+06 +1e+06 +-2e+06 +-5.55556e+06 +0.156277 +-6666.67 +-1.59792e+06 +0.422995 +1.63545e+06 +-5.55556e+06 +-2e+06 +-30864.2 +-2.08333e+06 +-2.08333e+06 +0.268792 +2.77778e+06 +-1.68e+06 +1.72437e+06 +2.77778e+06 +-28935.2 +-15432.1 +0.591763 +0.268792 +0.447277 +-3.33333e+06 +-2.08333e+06 +1e+08 +0.422995 +4e+08 +-2e+06 +0.391284 +2.08333e+06 +1.00333e+09 +2e+06 +1e+06 +3.33333e+08 +2e+08 +-833333 +1.0675e+09 +-2.77778e+06 +2.77778e+06 +0.0572546 +-1e+06 +-2e+06 +-5.55556e+06 +1.53533e+09 +1e+08 +6.66667e+08 +-2.08333e+06 +2.08333e+06 +5.55556e+06 +1.25e+06 +-28935.2 +-2.08333e+06 +-4166.67 +0.165025 +0.116139 +1.25e+06 +416667 +60879.6 +-2.5e+06 +-1.59792e+06 +-8333.33 +-2.5e+06 +3.37292e+06 +2.08333e+06 +0.0184915 +-416667 +-2.355e+06 +2.41171e+06 +-28935.2 +0.0553259 +-416667 +0.146524 +-2.5e+06 +0.117318 +2.5e+06 +1e+08 +1.5e+09 +5e+08 +-2.08333e+06 +0.165025 +0.295898 +5.01833e+08 +2.5e+08 +-833333 +-1.25e+06 +1.25e+06 +2.08333e+06 +1e+08 +-2.5e+06 +5.025e+08 +416667 +-3.925e+06 +0.116139 +0.163355 +-2.08333e+06 +-1.25e+06 +3.98588e+06 +416667 +-28935.2 +-1.25e+06 +-4166.67 +-8333.33 +3.4115e+06 +6.94444e+06 +0.339354 +0.310927 +6.94444e+06 +-1.59792e+06 +2.5e+06 +0.117318 +0.394396 +-38580.2 +2.5e+06 +-2.355e+06 +-19290.1 +2.431e+06 +-3.47222e+06 +-3.47222e+06 +-28935.2 +2.08333e+06 +-416667 +0.947466 +-416667 +1.50417e+09 +0.146524 +2.5e+06 +0.233241 +0.182244 +5e+08 +1e+08 +-2.08333e+06 +-4.16667e+06 +-2.5e+06 +1.33517e+09 +1.25e+06 +4.16667e+08 +-3.47222e+06 +2.5e+08 +-1.25e+06 +-833333 +3.47222e+06 +2.16917e+09 +2.08333e+06 +416667 +1e+08 +6.94444e+06 +-2.5e+06 +8.33333e+08 +-6.94444e+06 +0.310927 +-1.25e+06 +3.98588e+06 +0.40864 +-28935.2 +-1.25e+06 +-3.925e+06 +-2.08333e+06 +416667 +0.293721 +-4166.67 +-6.94444e+06 +0.462092 +2.5e+06 +-38580.2 +-8333.33 +3.4115e+06 +2.5e+06 +-6.94444e+06 +-1.59792e+06 +-2.355e+06 +2.08333e+06 +0.947466 +3.47222e+06 +2.431e+06 +-416667 +-28935.2 +-19290.1 +3.47222e+06 +0.369374 +1e+08 +-416667 +-2.08333e+06 +5e+08 +1.50417e+09 +-4.16667e+06 +2.5e+06 +-2.5e+06 +0.233241 +2.5e+08 +1.33517e+09 +1.25e+06 +3.47222e+06 +4.16667e+08 +-1.25e+06 +-3.47222e+06 +0.369374 +-833333 +0.40864 +-6.94444e+06 +-2.5e+06 +416667 +6.94444e+06 +2.16917e+09 +0.339354 +2.08333e+06 +1e+08 +8.33333e+08 +-2.08333e+06 +2.39929e+06 +1.25e+06 +64710.6 +140838 +-28935.2 +1.14929e+06 +-4166.67 +-275828 +-3830.95 +-1.59792e+06 +3.50488e+06 +-2.5e+06 +517922 +-517922 +-8333.33 +-131963 +0.321655 +-4.79857e+06 +-2.29857e+06 +-2.355e+06 +-517922 +134990 +0.391284 +-28935.2 +0.481793 +517922 +2.08333e+06 +4.57738e+06 +551657 +-2.16567e+06 +5e+08 +-4.79857e+06 +-551657 +4.86194e+08 +-2.08333e+06 +2.5e+06 +0.462092 +134990 +1e+08 +2.29857e+06 +2.47239e+09 +0.329891 +2.29725e+08 +9.6168e+08 +-1.0978e+08 +2.5e+08 +-5.57174e+07 +-1.14929e+06 +-1.25e+06 +-833333 +2.39929e+06 +5.31278e+08 +-1.0978e+08 +1.09412e+07 +-5.57174e+07 +1e+08 +140838 +0.329891 +2.08333e+06 +-2.5e+06 +275828 +25 +26 +27 +9 +39 +21 +44 +45 +43 +15 +3 +33 +41 +11 +28 +29 +24 +10 +0 +30 +6 +23 +22 +40 +46 +42 +4 +16 +18 +34 +5 +1 +2 +8 +12 +13 +14 +17 +19 +20 +31 +32 +35 +36 +37 +38 +47 +7 diff --git a/external/ldl/Matrix/A15 b/external/ldl/Matrix/A15 new file mode 100644 index 00000000..d680ad56 --- /dev/null +++ b/external/ldl/Matrix/A15 @@ -0,0 +1,147 @@ +name: HB/bcsstm01 n: 48 entries: 24 +48 0 +0 +1 +2 +3 +3 +3 +3 +4 +5 +6 +6 +6 +6 +7 +8 +9 +9 +9 +9 +10 +11 +12 +12 +12 +12 +13 +14 +15 +15 +15 +15 +16 +17 +18 +18 +18 +18 +19 +20 +21 +21 +21 +21 +22 +23 +24 +24 +24 +24 +0 +1 +2 +6 +7 +8 +12 +13 +14 +18 +19 +20 +24 +25 +26 +30 +31 +32 +36 +37 +38 +42 +43 +44 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +100 +200 +200 +200 +200 +200 +200 +200 +200 +200 +200 +200 +200 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 diff --git a/external/ldl/Matrix/A16 b/external/ldl/Matrix/A16 new file mode 100644 index 00000000..abc5e113 --- /dev/null +++ b/external/ldl/Matrix/A16 @@ -0,0 +1,151 @@ +name: HB/bcsstm01 n: 48 entries: 26 (jumbled version) +48 1 +0 +1 +2 +3 +3 +3 +3 +4 +5 +7 +7 +7 +7 +8 +9 +10 +10 +10 +10 +11 +12 +13 +13 +13 +13 +14 +15 +16 +16 +16 +16 +17 +18 +19 +19 +19 +19 +20 +21 +22 +22 +22 +22 +24 +25 +26 +26 +26 +26 +0 +1 +2 +6 +7 +8 +8 +12 +13 +14 +18 +19 +20 +24 +25 +26 +30 +31 +32 +36 +37 +38 +42 +42 +43 +44 +100 +100 +100 +100 +100 +100 +0.700744 +100 +100 +100 +100 +100 +100 +200 +200 +200 +200 +200 +200 +200 +200 +200 +200 +0.803129 +200 +200 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 diff --git a/external/ldl/Matrix/A17 b/external/ldl/Matrix/A17 new file mode 100644 index 00000000..3eb30b08 --- /dev/null +++ b/external/ldl/Matrix/A17 @@ -0,0 +1,711 @@ +name: Pothen/mesh1e1 n: 48 entries: 306 +48 0 +0 +5 +12 +16 +22 +26 +32 +36 +42 +49 +54 +61 +68 +73 +79 +84 +90 +96 +103 +109 +117 +123 +131 +138 +144 +150 +158 +164 +171 +178 +184 +190 +197 +204 +211 +218 +224 +232 +238 +245 +251 +258 +266 +272 +279 +287 +294 +301 +306 +0 +1 +7 +44 +47 +0 +1 +2 +41 +42 +45 +47 +1 +2 +3 +45 +2 +3 +4 +36 +43 +45 +3 +4 +5 +43 +4 +5 +6 +40 +43 +46 +5 +6 +7 +46 +0 +6 +7 +34 +44 +46 +8 +9 +14 +17 +22 +29 +30 +8 +9 +10 +20 +22 +9 +10 +11 +20 +23 +24 +26 +10 +11 +12 +26 +33 +35 +37 +11 +12 +13 +18 +33 +12 +13 +14 +15 +16 +18 +8 +13 +14 +15 +17 +13 +14 +15 +16 +17 +19 +13 +15 +16 +18 +19 +21 +8 +14 +15 +17 +19 +30 +39 +12 +13 +16 +18 +21 +33 +15 +16 +17 +19 +21 +39 +41 +42 +9 +10 +20 +22 +23 +27 +16 +18 +19 +21 +33 +36 +42 +45 +8 +9 +20 +22 +27 +29 +32 +10 +20 +23 +24 +25 +27 +10 +23 +24 +25 +26 +28 +23 +24 +25 +27 +28 +34 +40 +46 +10 +11 +24 +26 +28 +37 +20 +22 +23 +25 +27 +32 +34 +24 +25 +26 +28 +37 +38 +40 +8 +22 +29 +30 +31 +32 +8 +17 +29 +30 +31 +39 +29 +30 +31 +32 +39 +41 +44 +22 +27 +29 +31 +32 +34 +44 +11 +12 +18 +21 +33 +35 +36 +7 +25 +27 +32 +34 +44 +46 +11 +33 +35 +36 +37 +38 +3 +21 +33 +35 +36 +38 +43 +45 +11 +26 +28 +35 +37 +38 +28 +35 +36 +37 +38 +40 +43 +17 +19 +30 +31 +39 +41 +5 +25 +28 +38 +40 +43 +46 +1 +19 +31 +39 +41 +42 +44 +47 +1 +19 +21 +41 +42 +45 +3 +4 +5 +36 +38 +40 +43 +0 +7 +31 +32 +34 +41 +44 +47 +1 +2 +3 +21 +36 +42 +45 +5 +6 +7 +25 +34 +40 +46 +0 +1 +41 +44 +47 +2.97757 +-0.405002 +0.156027 +0.210025 +1.20651 +-0.405002 +4.05851 +0.216812 +0.182615 +0.638841 +0.334952 +1.28029 +0.216812 +2.12411 +-0.0801154 +0.827181 +-0.0801154 +3.0314 +0.225935 +0.58612 +0.508613 +0.630613 +0.225935 +2.10771 +-0.0767794 +0.804992 +-0.0767794 +3.07853 +0.20558 +0.712866 +0.564706 +0.518599 +0.20558 +2.09489 +-0.0682339 +0.821071 +0.156027 +-0.0682339 +3.12635 +0.648631 +0.785688 +0.467767 +3.71365 +0.0804484 +0.0319802 +0.576484 +0.745579 +0.652559 +0.626599 +0.0804484 +3.00024 +0.277821 +1.21013 +0.43184 +0.277821 +4.94357 +-0.342455 +0.309926 +0.72918 +1.17578 +1.1084 +-0.342455 +5.01532 +0.382281 +0.83075 +0.126147 +1.10301 +1.23069 +0.382281 +2.84056 +0.139618 +0.405272 +0.913387 +0.139618 +4.11278 +0.564372 +0.231253 +0.686969 +1.49057 +0.0319802 +0.564372 +3.09088 +1.03355 +0.460981 +0.231253 +1.03355 +5.17655 +1.43119 +0.931275 +0.549274 +0.686969 +1.43119 +5.37487 +0.680945 +0.538425 +1.03734 +0.576484 +0.460981 +0.931275 +4.71344 +0.473941 +0.694966 +0.575795 +0.405272 +1.49057 +0.680945 +5.53917 +0.77629 +1.18609 +0.549274 +0.538425 +0.473941 +5.00599 +0.434392 +1.03075 +0.197977 +0.781231 +1.21013 +0.309926 +4.96278 +0.575195 +1.12812 +0.739411 +1.03734 +0.77629 +0.434392 +5.31945 +0.340036 +0.579572 +0.462808 +0.689014 +0.745579 +0.43184 +0.575195 +4.77471 +0.928992 +0.725312 +0.367796 +0.72918 +1.12812 +5.10028 +0.727205 +0.958298 +0.557475 +1.17578 +0.727205 +5.38101 +0.822331 +0.541164 +1.11452 +0.958298 +0.822331 +5.38342 +0.746836 +0.232295 +0.301369 +0.586612 +0.735675 +1.1084 +0.83075 +0.541164 +5.41981 +1.06827 +0.871223 +0.739411 +0.928992 +0.557475 +0.746836 +5.21091 +0.469623 +0.768575 +1.11452 +0.232295 +1.06827 +5.40175 +0.587584 +0.46828 +0.930797 +0.652559 +0.725312 +4.83636 +1.06091 +0.492282 +0.90529 +0.626599 +0.694966 +1.06091 +4.77845 +0.506239 +0.889729 +0.492282 +0.506239 +5.17327 +0.988156 +0.911091 +0.667618 +0.607887 +0.367796 +0.469623 +0.90529 +0.988156 +5.16295 +1.04802 +0.384062 +0.126147 +0.913387 +1.18609 +0.340036 +5.31264 +1.0098 +0.737174 +0.648631 +0.301369 +0.768575 +1.04802 +5.2574 +0.587907 +0.902901 +1.10301 +1.0098 +5.42794 +0.751991 +0.351124 +1.21202 +0.58612 +0.579572 +0.737174 +0.751991 +5.21087 +0.292738 +0.699639 +0.563635 +1.23069 +0.871223 +0.587584 +0.351124 +5.13196 +1.09135 +0.46828 +1.21202 +0.292738 +1.09135 +5.53358 +0.587688 +0.881508 +0.575795 +1.03075 +0.889729 +0.911091 +5.09571 +0.688341 +0.712866 +0.586612 +0.930797 +0.587688 +5.13316 +0.65952 +0.655675 +0.182615 +0.197977 +0.667618 +0.688341 +5.2111 +1.17521 +0.168889 +1.13045 +0.638841 +0.781231 +0.462808 +1.17521 +5.24342 +1.18532 +0.508613 +0.804992 +0.564706 +0.699639 +0.881508 +0.65952 +5.11898 +0.210025 +0.785688 +0.607887 +0.384062 +0.587907 +0.168889 +5.09565 +1.35119 +0.334952 +0.827181 +0.630613 +0.689014 +0.563635 +1.18532 +5.23072 +0.518599 +0.821071 +0.467767 +0.735675 +0.902901 +0.655675 +5.10169 +1.20651 +1.28029 +1.13045 +1.35119 +5.96844 +2 +45 +42 +47 +0 +44 +14 +15 +12 +18 +13 +16 +29 +39 +30 +17 +9 +20 +24 +23 +10 +27 +37 +35 +4 +43 +6 +46 +5 +40 +38 +25 +28 +26 +8 +11 +22 +33 +1 +3 +7 +19 +21 +31 +32 +34 +41 +36 diff --git a/external/ldl/Matrix/A18 b/external/ldl/Matrix/A18 new file mode 100644 index 00000000..085c0564 --- /dev/null +++ b/external/ldl/Matrix/A18 @@ -0,0 +1,817 @@ +name: Pothen/mesh1e1 n: 48 entries: 359 (jumbled version) +48 1 +0 +6 +14 +19 +27 +31 +37 +42 +50 +58 +66 +74 +82 +88 +94 +99 +106 +114 +121 +129 +139 +147 +157 +166 +173 +179 +187 +193 +202 +211 +217 +224 +232 +243 +250 +259 +266 +274 +282 +290 +297 +305 +313 +320 +328 +337 +344 +351 +359 +44 +7 +47 +0 +7 +1 +41 +2 +0 +1 +47 +45 +47 +42 +45 +2 +1 +3 +3 +2 +4 +43 +2 +43 +45 +36 +3 +4 +5 +3 +43 +43 +5 +4 +40 +46 +6 +7 +6 +5 +46 +7 +7 +6 +44 +0 +46 +0 +6 +34 +9 +22 +14 +8 +29 +17 +30 +9 +22 +10 +8 +9 +20 +22 +20 +8 +24 +26 +20 +9 +10 +23 +11 +11 +10 +37 +10 +35 +26 +11 +33 +12 +33 +13 +11 +12 +18 +18 +15 +16 +14 +18 +12 +13 +13 +15 +8 +17 +14 +17 +19 +13 +15 +16 +14 +16 +15 +16 +18 +21 +13 +15 +19 +16 +17 +14 +30 +15 +8 +19 +39 +16 +18 +21 +12 +33 +13 +21 +12 +17 +39 +21 +19 +21 +42 +16 +15 +41 +42 +27 +10 +9 +9 +23 +22 +20 +23 +42 +33 +19 +36 +16 +19 +21 +18 +18 +45 +20 +32 +9 +22 +9 +29 +27 +8 +32 +20 +24 +25 +27 +10 +23 +20 +28 +10 +23 +24 +26 +25 +46 +27 +23 +25 +34 +24 +40 +28 +11 +37 +10 +28 +24 +26 +32 +34 +23 +25 +22 +34 +27 +20 +32 +38 +26 +37 +37 +38 +28 +25 +24 +40 +30 +8 +29 +32 +31 +22 +30 +31 +8 +17 +39 +29 +31 +30 +30 +29 +31 +44 +32 +39 +41 +34 +32 +31 +32 +22 +34 +29 +27 +44 +22 +27 +36 +33 +35 +18 +21 +12 +11 +34 +44 +32 +27 +27 +46 +25 +32 +7 +38 +33 +35 +11 +36 +37 +35 +35 +43 +3 +33 +36 +38 +45 +21 +35 +38 +26 +28 +28 +11 +37 +37 +36 +35 +28 +28 +38 +37 +40 +43 +17 +41 +30 +31 +39 +39 +19 +25 +5 +40 +28 +46 +38 +43 +40 +39 +47 +44 +41 +31 +42 +19 +1 +19 +19 +1 +45 +41 +21 +42 +38 +3 +43 +3 +36 +40 +5 +4 +31 +7 +0 +47 +47 +41 +44 +34 +32 +42 +1 +3 +36 +21 +2 +45 +46 +34 +6 +40 +25 +5 +7 +0 +41 +47 +47 +44 +1 +1 +44 +0.210025 +0.355287 +1.20651 +2.97757 +0.156027 +-0.405002 +0.182615 +0.216812 +-0.405002 +4.05851 +1.28029 +0.334952 +0.0241885 +0.638841 +0.827181 +2.12411 +0.216812 +0.418053 +-0.0801154 +-0.0801154 +0.225935 +0.508613 +0.418053 +0.176586 +0.630613 +0.58612 +3.0314 +2.10771 +-0.0767794 +0.225935 +0.804992 +0.564706 +3.07853 +-0.0767794 +0.712866 +0.518599 +0.20558 +0.397089 +2.09489 +0.20558 +0.821071 +-0.0682339 +3.12635 +-0.0682339 +0.785688 +0.355287 +0.467767 +0.156027 +0.397089 +0.648631 +0.0336413 +0.745579 +0.0319802 +3.71365 +0.652559 +0.576484 +0.626599 +0.0804484 +0.43184 +0.277821 +0.0804484 +3.00024 +1.21013 +0.407516 +0.230467 +0.0336413 +1.17578 +1.1084 +0.309926 +0.277821 +4.94357 +0.72918 +0.246908 +-0.342455 +0.246908 +1.23069 +-0.342455 +1.10301 +0.83075 +5.01532 +0.126147 +0.382281 +0.913387 +0.139618 +0.382281 +2.84056 +0.244532 +0.405272 +0.231253 +0.686969 +0.564372 +1.49057 +0.139618 +4.11278 +0.564372 +1.03355 +0.0319802 +0.460981 +3.09088 +0.931275 +0.549274 +0.231253 +5.17655 +0.306724 +1.03355 +1.43119 +0.306724 +0.491744 +0.680945 +1.03734 +0.686969 +1.43119 +0.538425 +5.37487 +4.71344 +0.460981 +0.694966 +0.931275 +0.576484 +0.473941 +0.575795 +0.680945 +5.53917 +0.248088 +0.405272 +1.18609 +1.49057 +0.77629 +0.244532 +0.473941 +1.03075 +0.434392 +5.00599 +0.187041 +0.781231 +0.538425 +0.549274 +0.197977 +0.00546209 +0.739411 +0.309926 +1.21013 +0.230467 +1.12812 +0.575195 +4.96278 +0.0991541 +0.462808 +0.340036 +0.187041 +0.579572 +1.03734 +0.434392 +5.31945 +0.77629 +0.248088 +0.689014 +0.575195 +0.00218642 +0.407516 +4.77471 +0.43184 +0.725312 +0.928992 +0.745579 +0.367796 +0.0991541 +0.727205 +0.958298 +0.557475 +0.72918 +5.10028 +1.12812 +1.11452 +1.17578 +0.727205 +5.38101 +0.541164 +0.822331 +0.735675 +0.746836 +0.958298 +5.38342 +0.301369 +0.822331 +0.586612 +0.232295 +0.83075 +0.871223 +1.1084 +1.06827 +0.541164 +5.41981 +0.469623 +0.768575 +0.557475 +0.746836 +0.928992 +0.170003 +5.21091 +0.739411 +0.145845 +0.257947 +1.06827 +0.587584 +0.155089 +0.46828 +5.40175 +0.232295 +1.11452 +0.930797 +1.06091 +0.652559 +4.83636 +0.90529 +0.492282 +0.725312 +4.77845 +0.408389 +0.626599 +0.694966 +0.889729 +1.06091 +0.506239 +0.506239 +0.408389 +0.492282 +5.17327 +0.607887 +0.988156 +0.911091 +0.667618 +1.04802 +5.16295 +0.988156 +0.985062 +0.367796 +0.250634 +0.90529 +0.145845 +0.384062 +0.00218642 +0.469623 +0.737174 +5.31264 +1.0098 +1.18609 +0.340036 +0.913387 +0.126147 +5.2574 +0.587907 +0.250634 +0.170003 +0.768575 +0.902901 +0.301369 +1.04802 +0.648631 +1.21202 +1.0098 +0.695714 +1.10301 +0.751991 +0.351124 +5.42794 +0.751991 +0.699639 +0.58612 +0.737174 +5.21087 +0.292738 +0.563635 +0.579572 +0.351124 +1.09135 +0.871223 +0.155089 +0.587584 +1.23069 +5.13196 +0.834412 +0.292738 +1.21202 +0.257947 +0.46828 +5.53358 +1.09135 +0.587688 +0.881508 +0.575795 +0.688341 +0.889729 +0.911091 +0.73146 +5.09571 +1.03075 +0.586612 +0.712866 +0.621992 +0.930797 +0.655675 +0.587688 +0.65952 +5.13316 +0.688341 +1.13045 +0.168889 +5.2111 +0.667618 +1.17521 +0.197977 +0.182615 +0.00546209 +0.781231 +0.638841 +1.18532 +1.17521 +0.462808 +5.24342 +0.881508 +0.176586 +5.11898 +0.508613 +0.699639 +0.65952 +0.564706 +0.804992 +0.607887 +0.785688 +0.210025 +1.35119 +0.390013 +0.168889 +5.09565 +0.587907 +0.384062 +1.18532 +0.334952 +0.630613 +0.563635 +0.689014 +0.827181 +5.23072 +5.10169 +0.902901 +0.821071 +0.655675 +0.735675 +0.518599 +0.467767 +1.20651 +1.13045 +0.0137927 +5.96844 +0.390013 +0.0241885 +1.28029 +1.35119 +2 +45 +42 +47 +0 +44 +14 +15 +12 +18 +13 +16 +29 +39 +30 +17 +9 +20 +24 +23 +10 +27 +37 +35 +4 +43 +6 +46 +5 +40 +38 +25 +28 +26 +8 +11 +22 +33 +1 +3 +7 +19 +21 +31 +32 +34 +41 +36 diff --git a/external/ldl/Matrix/A19 b/external/ldl/Matrix/A19 new file mode 100644 index 00000000..77db38f1 --- /dev/null +++ b/external/ldl/Matrix/A19 @@ -0,0 +1,811 @@ +name: Bai/bfwb62 n: 62 entries: 342 +62 0 +0 +4 +9 +19 +26 +33 +41 +54 +61 +69 +76 +86 +93 +98 +102 +104 +109 +114 +116 +122 +127 +132 +137 +142 +147 +151 +157 +162 +166 +170 +177 +182 +189 +194 +201 +206 +213 +218 +225 +230 +234 +238 +245 +250 +256 +261 +268 +273 +280 +285 +291 +296 +300 +304 +309 +314 +318 +323 +328 +333 +338 +340 +342 +0 +3 +19 +23 +1 +2 +5 +20 +29 +1 +2 +4 +5 +6 +15 +27 +28 +31 +35 +0 +3 +7 +16 +24 +32 +36 +2 +4 +6 +8 +22 +33 +37 +1 +2 +5 +6 +9 +18 +33 +41 +2 +4 +5 +6 +8 +9 +10 +25 +29 +39 +40 +43 +47 +3 +7 +11 +26 +30 +44 +48 +4 +6 +8 +10 +12 +35 +45 +49 +5 +6 +9 +10 +31 +45 +53 +6 +8 +9 +10 +12 +37 +41 +51 +52 +58 +7 +11 +13 +38 +42 +55 +59 +8 +10 +12 +47 +56 +11 +13 +50 +54 +14 +15 +2 +14 +15 +18 +20 +3 +16 +17 +19 +21 +16 +17 +5 +15 +18 +20 +28 +29 +0 +16 +19 +21 +30 +1 +15 +18 +20 +22 +16 +19 +21 +23 +24 +4 +20 +22 +25 +27 +0 +21 +23 +24 +26 +3 +21 +23 +24 +6 +22 +25 +27 +33 +35 +7 +23 +26 +34 +36 +2 +22 +25 +27 +2 +18 +28 +29 +1 +6 +18 +28 +29 +31 +33 +7 +19 +30 +32 +34 +2 +9 +29 +31 +33 +40 +41 +3 +30 +32 +34 +42 +4 +5 +25 +29 +31 +33 +35 +26 +30 +32 +34 +36 +2 +8 +25 +33 +35 +37 +39 +3 +26 +34 +36 +38 +4 +10 +35 +37 +39 +45 +47 +11 +36 +38 +46 +48 +6 +35 +37 +39 +6 +31 +40 +41 +5 +10 +31 +40 +41 +43 +45 +11 +32 +42 +44 +46 +6 +41 +43 +45 +52 +53 +7 +42 +44 +46 +54 +8 +9 +37 +41 +43 +45 +47 +38 +42 +44 +46 +48 +6 +12 +37 +45 +47 +49 +51 +7 +38 +46 +48 +50 +8 +47 +49 +51 +56 +58 +13 +48 +50 +57 +59 +10 +47 +49 +51 +10 +43 +52 +53 +9 +43 +52 +53 +56 +13 +44 +54 +55 +57 +11 +54 +55 +57 +12 +49 +53 +56 +58 +50 +54 +55 +57 +59 +10 +49 +56 +58 +61 +11 +50 +57 +59 +60 +59 +60 +58 +61 +-1.14796e-05 +1.27551e-06 +2.55102e-06 +2.55102e-06 +-1.14796e-05 +1.27551e-06 +6.37755e-07 +2.55102e-06 +2.55102e-06 +1.27551e-06 +-2.29592e-05 +1.27551e-06 +1.27551e-06 +1.27551e-06 +2.55102e-06 +2.55102e-06 +2.55102e-06 +2.55102e-06 +2.55102e-06 +1.27551e-06 +-2.29592e-05 +1.27551e-06 +2.55102e-06 +2.55102e-06 +2.55102e-06 +2.55102e-06 +1.27551e-06 +-1.14796e-05 +1.27551e-06 +6.37755e-07 +2.55102e-06 +2.55102e-06 +2.55102e-06 +6.37755e-07 +1.27551e-06 +-1.70281e-05 +2.20026e-06 +1.5625e-06 +2.55102e-06 +2.55102e-06 +6.25e-06 +1.27551e-06 +1.27551e-06 +2.20026e-06 +-3.96046e-05 +2.20026e-06 +3.125e-06 +3.125e-06 +2.55102e-06 +2.55102e-06 +2.55102e-06 +6.25e-06 +6.25e-06 +6.25e-06 +1.27551e-06 +-3.96046e-05 +3.125e-06 +2.55102e-06 +2.55102e-06 +6.25e-06 +6.25e-06 +6.37755e-07 +2.20026e-06 +-2.25765e-05 +3.125e-06 +1.5625e-06 +2.55102e-06 +6.25e-06 +6.25e-06 +1.5625e-06 +3.125e-06 +-2.8125e-05 +3.125e-06 +6.25e-06 +6.25e-06 +6.25e-06 +3.125e-06 +3.125e-06 +3.125e-06 +-5.625e-05 +3.125e-06 +6.25e-06 +6.25e-06 +6.25e-06 +6.25e-06 +6.25e-06 +3.125e-06 +-5.625e-05 +3.125e-06 +6.25e-06 +6.25e-06 +6.25e-06 +6.25e-06 +1.5625e-06 +3.125e-06 +-2.8125e-05 +6.25e-06 +6.25e-06 +3.125e-06 +-2.8125e-05 +6.25e-06 +6.25e-06 +-2.04082e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-2.04082e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-2.04082e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-2.04082e-05 +2.55102e-06 +-1.02041e-05 +-2.04082e-05 +-1.02041e-05 +2.55102e-06 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +6.25e-06 +-1.02041e-05 +-7.04082e-05 +-1.02041e-05 +-2.5e-05 +-2.5e-05 +2.55102e-06 +-1.02041e-05 +-7.04082e-05 +-1.02041e-05 +-2.5e-05 +2.55102e-06 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +2.55102e-06 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +2.55102e-06 +6.25e-06 +-1.02041e-05 +-7.04082e-05 +-1.02041e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +-1.02041e-05 +-7.04082e-05 +-2.5e-05 +-2.5e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-2.04082e-05 +6.25e-06 +-2.5e-05 +-5e-05 +-2.5e-05 +6.25e-06 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +6.25e-06 +6.25e-06 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +6.25e-06 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-5e-05 +6.25e-06 +-2.5e-05 +-5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-5e-05 +-2.5e-05 +-5e-05 +17 +16 +24 +21 +0 +23 +19 +55 +60 +59 +57 +13 +54 +50 +46 +11 +44 +48 +42 +38 +34 +3 +7 +26 +30 +32 +36 +40 +41 +51 +61 +58 +49 +12 +52 +53 +56 +39 +37 +14 +15 +28 +18 +1 +27 +22 +20 +33 +2 +25 +29 +4 +35 +5 +6 +8 +9 +10 +31 +43 +47 +45 diff --git a/external/ldl/Matrix/A20 b/external/ldl/Matrix/A20 new file mode 100644 index 00000000..fd5e247c --- /dev/null +++ b/external/ldl/Matrix/A20 @@ -0,0 +1,941 @@ +name: Bai/bfwb62 n: 62 entries: 407 (jumbled version) +62 1 +0 +4 +9 +22 +30 +39 +49 +67 +75 +84 +93 +103 +112 +117 +123 +125 +131 +137 +140 +146 +152 +158 +164 +169 +174 +178 +184 +189 +193 +198 +205 +211 +218 +223 +230 +237 +247 +253 +262 +268 +273 +277 +284 +289 +296 +302 +313 +319 +329 +335 +343 +350 +355 +359 +364 +370 +376 +383 +390 +397 +402 +404 +407 +0 +23 +19 +3 +2 +20 +5 +29 +1 +28 +27 +35 +15 +6 +4 +4 +1 +2 +31 +28 +35 +5 +3 +7 +24 +16 +36 +7 +0 +32 +8 +33 +22 +6 +4 +37 +6 +2 +2 +9 +41 +5 +6 +5 +6 +18 +1 +33 +2 +6 +2 +29 +47 +5 +9 +4 +10 +39 +47 +5 +43 +39 +9 +40 +25 +8 +4 +3 +26 +3 +48 +7 +44 +11 +30 +35 +35 +6 +10 +12 +45 +49 +4 +8 +45 +6 +9 +45 +10 +5 +53 +6 +31 +10 +58 +9 +8 +12 +41 +52 +51 +37 +6 +55 +42 +13 +59 +11 +55 +38 +38 +7 +47 +8 +12 +56 +10 +50 +54 +50 +11 +54 +13 +15 +14 +15 +2 +20 +14 +20 +18 +19 +17 +16 +17 +3 +21 +16 +17 +16 +28 +29 +18 +20 +5 +15 +16 +19 +0 +30 +21 +21 +22 +18 +20 +15 +15 +1 +19 +24 +19 +21 +23 +16 +4 +27 +25 +22 +20 +24 +0 +23 +26 +21 +3 +24 +23 +21 +25 +27 +33 +22 +35 +6 +23 +7 +34 +36 +26 +27 +25 +2 +22 +28 +2 +29 +2 +18 +6 +1 +31 +18 +29 +28 +33 +19 +34 +30 +32 +7 +34 +41 +33 +2 +29 +31 +40 +9 +34 +30 +3 +32 +42 +25 +5 +4 +31 +35 +29 +33 +30 +26 +32 +30 +34 +36 +36 +35 +39 +2 +37 +33 +8 +8 +37 +2 +25 +38 +3 +36 +34 +34 +26 +4 +10 +47 +35 +35 +45 +37 +39 +45 +38 +46 +11 +36 +48 +11 +37 +39 +35 +6 +6 +40 +6 +31 +41 +5 +31 +41 +40 +45 +43 +10 +46 +42 +11 +32 +44 +41 +53 +45 +43 +45 +6 +52 +54 +7 +44 +46 +46 +42 +9 +8 +45 +43 +47 +37 +41 +43 +37 +47 +9 +44 +46 +48 +44 +42 +38 +49 +51 +45 +37 +6 +51 +45 +6 +47 +12 +50 +38 +46 +7 +50 +48 +49 +56 +8 +47 +49 +51 +58 +56 +48 +13 +48 +57 +50 +59 +13 +51 +49 +10 +47 +47 +43 +10 +53 +52 +9 +43 +52 +53 +56 +54 +13 +57 +44 +55 +13 +11 +54 +57 +55 +57 +11 +53 +58 +56 +49 +49 +58 +12 +57 +55 +59 +55 +54 +50 +57 +61 +58 +49 +56 +10 +56 +61 +11 +59 +60 +57 +50 +59 +60 +58 +61 +58 +-1.14796e-05 +2.55102e-06 +2.55102e-06 +1.27551e-06 +1.27551e-06 +2.55102e-06 +6.37755e-07 +2.55102e-06 +-1.14796e-05 +9.11109e-05 +2.55102e-06 +3.2896e-05 +2.55102e-06 +1.27551e-06 +1.58494e-05 +1.27551e-06 +1.27551e-06 +-2.29592e-05 +2.55102e-06 +2.55102e-06 +2.55102e-06 +1.27551e-06 +-2.29592e-05 +3.61393e-05 +2.55102e-06 +2.55102e-06 +2.55102e-06 +1.27551e-06 +1.27551e-06 +2.55102e-06 +6.37755e-07 +2.55102e-06 +2.55102e-06 +9.46304e-05 +-1.14796e-05 +2.55102e-06 +1.27551e-06 +1.27551e-06 +1.58494e-05 +1.5625e-06 +6.25e-06 +0.000151737 +2.20026e-06 +-1.70281e-05 +2.51752e-05 +2.55102e-06 +6.37755e-07 +2.55102e-06 +1.27551e-06 +-3.96046e-05 +1.27551e-06 +2.55102e-06 +6.25e-06 +2.20026e-06 +9.83044e-05 +9.46304e-05 +3.125e-06 +2.55102e-06 +7.59102e-05 +2.51752e-05 +6.25e-06 +5.96597e-05 +3.125e-06 +6.25e-06 +2.55102e-06 +2.20026e-06 +1.27551e-06 +3.61393e-05 +2.55102e-06 +1.27551e-06 +6.25e-06 +-3.96046e-05 +6.25e-06 +3.125e-06 +2.55102e-06 +2.14094e-05 +2.55102e-06 +2.20026e-06 +3.125e-06 +1.5625e-06 +6.25e-06 +6.25e-06 +6.37755e-07 +-2.25765e-05 +0.000105332 +9.83044e-05 +-2.8125e-05 +6.25e-06 +3.125e-06 +1.5625e-06 +6.25e-06 +3.125e-06 +6.25e-06 +-5.625e-05 +6.25e-06 +3.125e-06 +3.125e-06 +3.125e-06 +6.25e-06 +6.25e-06 +6.25e-06 +6.25e-06 +3.125e-06 +6.25e-06 +6.25e-06 +3.125e-06 +6.25e-06 +-5.625e-05 +5.05726e-05 +7.99479e-05 +6.25e-06 +3.125e-06 +6.25e-06 +1.5625e-06 +-2.8125e-05 +6.25e-06 +3.125e-06 +6.25e-06 +6.25e-06 +7.73089e-05 +3.125e-06 +6.48235e-05 +-2.8125e-05 +-1.02041e-05 +-2.04082e-05 +-4.08163e-05 +2.55102e-06 +2.7469e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +2.72501e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-2.04082e-05 +2.72501e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +2.55102e-06 +-1.02041e-05 +4.44591e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +2.7469e-05 +2.55102e-06 +4.44591e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-2.04082e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-2.04082e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-2.04082e-05 +9.11109e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +2.55102e-06 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +4.98855e-05 +-4.08163e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-2.5e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-7.04082e-05 +-2.5e-05 +6.25e-06 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-7.04082e-05 +-2.5e-05 +-1.02041e-05 +2.55102e-06 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +-4.08163e-05 +-1.02041e-05 +-1.02041e-05 +-1.02041e-05 +4.98855e-05 +-4.08163e-05 +-1.02041e-05 +8.85501e-05 +-4.08163e-05 +-1.02041e-05 +2.55102e-06 +-1.02041e-05 +-1.02041e-05 +2.14094e-05 +2.55102e-06 +2.91542e-05 +3.2896e-05 +-1.02041e-05 +-1.02041e-05 +2.55102e-06 +-4.08163e-05 +-1.02041e-05 +8.85501e-05 +-1.02041e-05 +2.55102e-06 +6.25e-06 +-2.5e-05 +2.91542e-05 +-1.02041e-05 +-2.5e-05 +-7.04082e-05 +-1.02041e-05 +1.1493e-05 +-7.04082e-05 +-2.5e-05 +6.25e-06 +-1.02041e-05 +-2.5e-05 +7.99479e-05 +-1.02041e-05 +-2.04082e-05 +-1.02041e-05 +2.55102e-06 +5.96597e-05 +-5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-0.0001 +6.25e-06 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +3.14119e-05 +-0.0001 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +6.25e-06 +-0.0001 +4.83544e-06 +-2.5e-05 +-2.5e-05 +6.25e-06 +6.25e-06 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +3.14119e-05 +1.1493e-05 +5.76103e-05 +0.000105332 +4.83544e-06 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +6.5083e-05 +5.76103e-05 +7.59102e-05 +-0.0001 +6.25e-06 +-2.5e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +1.09202e-05 +-0.0001 +0.000156832 +4.37582e-05 +6.25e-06 +-2.5e-05 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +7.73089e-05 +1.09202e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +6.25e-06 +-5e-05 +-2.5e-05 +6.25e-06 +6.5083e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +-2.5e-05 +-0.0001 +6.48235e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +6.25e-06 +5.05726e-05 +-2.5e-05 +4.03933e-05 +-5e-05 +-2.5e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +-0.0001 +4.37582e-05 +-2.5e-05 +4.74919e-05 +6.25e-06 +0.00016193 +-2.5e-05 +-2.5e-05 +4.03933e-05 +-2.5e-05 +-2.5e-05 +-0.0001 +7.02188e-05 +-0.0001 +-2.5e-05 +4.74919e-05 +6.25e-06 +-2.5e-05 +-2.5e-05 +6.25e-06 +-0.0001 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-2.5e-05 +-5e-05 +-2.5e-05 +-5e-05 +7.02188e-05 +17 +16 +24 +21 +0 +23 +19 +55 +60 +59 +57 +13 +54 +50 +46 +11 +44 +48 +42 +38 +34 +3 +7 +26 +30 +32 +36 +40 +41 +51 +61 +58 +49 +12 +52 +53 +56 +39 +37 +14 +15 +28 +18 +1 +27 +22 +20 +33 +2 +25 +29 +4 +35 +5 +6 +8 +9 +10 +31 +43 +47 +45 diff --git a/external/ldl/Matrix/A21 b/external/ldl/Matrix/A21 new file mode 100644 index 00000000..aa427b8c --- /dev/null +++ b/external/ldl/Matrix/A21 @@ -0,0 +1,8847 @@ +name: HB/bcsstk02 n: 66 entries: 4356 +66 0 +0 +66 +132 +198 +264 +330 +396 +462 +528 +594 +660 +726 +792 +858 +924 +990 +1056 +1122 +1188 +1254 +1320 +1386 +1452 +1518 +1584 +1650 +1716 +1782 +1848 +1914 +1980 +2046 +2112 +2178 +2244 +2310 +2376 +2442 +2508 +2574 +2640 +2706 +2772 +2838 +2904 +2970 +3036 +3102 +3168 +3234 +3300 +3366 +3432 +3498 +3564 +3630 +3696 +3762 +3828 +3894 +3960 +4026 +4092 +4158 +4224 +4290 +4356 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +1990.33 +567.912 +775.784 +-1386.8 +-0.267855 +-0.466904 +-1.13048 +0.392058 +0.0262199 +-490.288 +-490.205 +0.0251003 +-59.4381 +-38.6059 +-385.481 +0.0466086 +-0.07465 +-0.649846 +0.154605 +0.0447455 +0.0143036 +-0.021597 +-0.136564 +-0.225766 +5.06186 +-0.11502 +-0.606937 +0.42174 +-0.0787629 +-0.640284 +0.583363 +-0.146798 +-0.0871747 +-0.0304466 +0.00205195 +0.0243121 +-1.20473 +0.0507083 +0.179964 +-0.212499 +-0.00346643 +-0.0526655 +-0.0754533 +-0.0248233 +0.0108515 +-0.0125119 +0.0729971 +0.0242525 +0.0162955 +0.016102 +-0.0204115 +0.124351 +1.7046e-05 +-0.0389695 +0.0538814 +-0.00468958 +-0.0116852 +0.0292282 +-0.0201849 +-0.00931351 +0.0108272 +-0.0134893 +-0.00188099 +0.00488976 +0.0122115 +0.0116595 +567.912 +1990.33 +775.784 +0.392058 +-1.13048 +0.0262199 +-0.267855 +-1386.8 +-0.466904 +-490.205 +-490.288 +0.0251003 +-38.6059 +-59.4381 +-385.481 +0.0447455 +0.154605 +0.0143036 +-0.07465 +0.0466086 +-0.649846 +-0.136564 +-0.021597 +-0.225766 +-0.11502 +5.06186 +-0.606937 +-0.146798 +0.583363 +-0.0871747 +-0.0787629 +0.42174 +-0.640284 +0.00205195 +-0.0304466 +0.0243121 +0.0507083 +-1.20473 +0.179964 +-0.0248233 +-0.0754533 +0.0108515 +-0.00346643 +-0.212499 +-0.0526655 +0.0729971 +-0.0125119 +0.0242525 +0.016102 +0.0162955 +-0.0204115 +1.7046e-05 +0.124351 +-0.0389695 +-0.0201849 +0.0292282 +-0.00931351 +-0.00468958 +0.0538814 +-0.0116852 +-0.0134893 +0.0108272 +-0.00188099 +0.0122115 +0.00488976 +0.0116595 +775.784 +775.784 +7797.07 +-0.053135 +-0.00304816 +-1.02514 +-0.00304816 +-0.053135 +-1.02514 +-0.0251003 +-0.0251003 +-0.32666 +-388.557 +-388.557 +-3897.53 +-0.553346 +-0.027228 +-0.020746 +-0.027228 +-0.553346 +-0.020746 +-0.237089 +-0.237089 +-0.0465557 +-0.337238 +-0.337238 +0.079704 +0.110987 +-0.0277104 +0.074426 +-0.0277104 +0.110987 +0.074426 +0.037226 +0.037226 +0.00552773 +0.0764976 +0.0764976 +-0.0308651 +-0.00553496 +0.00236739 +6.17619e-05 +0.00236739 +-0.00553496 +6.17619e-05 +-0.0152097 +-0.0152097 +-0.00637744 +-0.00155356 +-0.00155356 +0.00410436 +-0.00778484 +-0.00778484 +0.00455579 +0.00131965 +-0.00105151 +0.0024964 +-0.00105151 +0.00131965 +0.0024964 +0.00126122 +0.00126122 +0.000995693 +-0.00103177 +-0.00103177 +-0.00220184 +-1386.8 +0.392058 +-0.053135 +3060.65 +-710.327 +-1533.01 +-490.356 +490.312 +0.0504023 +-1.13048 +-0.267855 +0.00304816 +-1066.01 +71.418 +710.379 +-58.5567 +38.6301 +386.582 +-0.0274214 +0.249666 +0.360423 +-5.37811 +70.5226 +47.1606 +0.248145 +-0.100585 +-0.0920349 +6.56901 +0.264895 +1.00508 +-0.0738641 +0.306412 +0.114551 +0.41147 +-0.000773718 +0.0549392 +-0.181382 +-0.00548262 +-0.154083 +-1.09651 +-0.0469509 +-0.160836 +-0.0140005 +-0.0455285 +-0.00651007 +-0.184547 +-0.0828652 +-0.0353681 +-0.0100963 +0.027968 +0.0294307 +0.0469962 +-0.00341712 +-0.0226327 +0.176759 +0.0183094 +0.0372451 +0.0052355 +0.0144878 +0.0141999 +0.0389266 +-0.0169269 +0.00836761 +-0.0188819 +0.0186254 +-0.0128916 +-0.267855 +-1.13048 +-0.00304816 +-710.327 +3060.65 +1533.01 +490.312 +-490.356 +-0.0504023 +0.392058 +-1386.8 +0.053135 +70.5226 +-5.37811 +-47.1606 +38.6301 +-58.5567 +-386.582 +0.249666 +-0.0274214 +-0.360423 +71.418 +-1066.01 +-710.379 +-0.000773718 +0.41147 +-0.0549392 +0.264895 +6.56901 +-1.00508 +0.306412 +-0.0738641 +-0.114551 +-0.100585 +0.248145 +0.0920349 +-0.0828652 +-0.184547 +0.0353681 +-0.0469509 +-1.09651 +0.160836 +-0.0455285 +-0.0140005 +0.00651007 +-0.00548262 +-0.181382 +0.154083 +0.027968 +-0.0100963 +-0.0294307 +-0.0169269 +0.0389266 +-0.00836761 +0.0183094 +0.176759 +-0.0372451 +0.0144878 +0.0052355 +-0.0141999 +-0.00341712 +0.0469962 +0.0226327 +0.0186254 +-0.0188819 +0.0128916 +-0.466904 +0.0262199 +-1.02514 +-1533.01 +1533.01 +8746.03 +-0.0504023 +0.0504023 +-0.234861 +-0.0262199 +0.466904 +-1.02514 +710.389 +-47.476 +-474.485 +389.148 +-389.148 +-3897.23 +0.164121 +-0.164121 +-0.00505008 +47.476 +-710.389 +-474.485 +0.460779 +-0.0404939 +-0.0532046 +0.380074 +-0.380074 +-0.0064657 +0.0077342 +-0.0077342 +0.010514 +0.0404939 +-0.460779 +-0.0532046 +-0.117741 +0.0161033 +0.00676233 +-0.074228 +0.074228 +-0.0264454 +0.00311767 +-0.00311767 +-0.00052924 +-0.0161033 +0.117741 +0.00676233 +-0.00185284 +0.00185284 +-0.000119449 +0.0154433 +-0.00305095 +-0.00441524 +0.0136511 +-0.0136511 +0.00200577 +0.00300295 +-0.00300295 +0.00035693 +0.00305095 +-0.0154433 +-0.00441524 +-0.00248795 +0.00248795 +0.000528505 +-1.13048 +-0.267855 +-0.00304816 +-490.356 +490.312 +-0.0504023 +3060.65 +-710.327 +1533.01 +-1386.8 +0.392058 +0.053135 +-5.37811 +70.5226 +-47.1606 +-0.0274214 +0.249666 +-0.360423 +-58.5567 +38.6301 +-386.582 +-1066.01 +71.418 +-710.379 +0.41147 +-0.000773718 +-0.0549392 +-0.0738641 +0.306412 +-0.114551 +6.56901 +0.264895 +-1.00508 +0.248145 +-0.100585 +0.0920349 +-0.184547 +-0.0828652 +0.0353681 +-0.0140005 +-0.0455285 +0.00651007 +-1.09651 +-0.0469509 +0.160836 +-0.181382 +-0.00548262 +0.154083 +-0.0100963 +0.027968 +-0.0294307 +0.0389266 +-0.0169269 +-0.00836761 +0.0052355 +0.0144878 +-0.0141999 +0.176759 +0.0183094 +-0.0372451 +0.0469962 +-0.00341712 +0.0226327 +-0.0188819 +0.0186254 +0.0128916 +0.392058 +-1386.8 +-0.053135 +490.312 +-490.356 +0.0504023 +-710.327 +3060.65 +-1533.01 +-0.267855 +-1.13048 +0.00304816 +71.418 +-1066.01 +710.379 +0.249666 +-0.0274214 +0.360423 +38.6301 +-58.5567 +386.582 +70.5226 +-5.37811 +47.1606 +-0.100585 +0.248145 +-0.0920349 +0.306412 +-0.0738641 +0.114551 +0.264895 +6.56901 +1.00508 +-0.000773718 +0.41147 +0.0549392 +-0.00548262 +-0.181382 +-0.154083 +-0.0455285 +-0.0140005 +-0.00651007 +-0.0469509 +-1.09651 +-0.160836 +-0.0828652 +-0.184547 +-0.0353681 +0.027968 +-0.0100963 +0.0294307 +-0.00341712 +0.0469962 +-0.0226327 +0.0144878 +0.0052355 +0.0141999 +0.0183094 +0.176759 +0.0372451 +-0.0169269 +0.0389266 +0.00836761 +0.0186254 +-0.0188819 +-0.0128916 +0.0262199 +-0.466904 +-1.02514 +0.0504023 +-0.0504023 +-0.234861 +1533.01 +-1533.01 +8746.03 +0.466904 +-0.0262199 +-1.02514 +-47.476 +710.389 +-474.485 +-0.164121 +0.164121 +-0.00505008 +-389.148 +389.148 +-3897.23 +-710.389 +47.476 +-474.485 +-0.0404939 +0.460779 +-0.0532046 +-0.0077342 +0.0077342 +0.010514 +-0.380074 +0.380074 +-0.0064657 +-0.460779 +0.0404939 +-0.0532046 +0.0161033 +-0.117741 +0.00676233 +-0.00311767 +0.00311767 +-0.00052924 +0.074228 +-0.074228 +-0.0264454 +0.117741 +-0.0161033 +0.00676233 +0.00185284 +-0.00185284 +-0.000119449 +-0.00305095 +0.0154433 +-0.00441524 +-0.00300295 +0.00300295 +0.00035693 +-0.0136511 +0.0136511 +0.00200577 +-0.0154433 +0.00305095 +-0.00441524 +0.00248795 +-0.00248795 +0.000528505 +-490.288 +-490.205 +-0.0251003 +-1.13048 +0.392058 +-0.0262199 +-1386.8 +-0.267855 +0.466904 +1990.33 +567.912 +-775.784 +-0.021597 +-0.136564 +0.225766 +0.154605 +0.0447455 +-0.0143036 +0.0466086 +-0.07465 +0.649846 +-59.4381 +-38.6059 +385.481 +-0.0304466 +0.00205195 +-0.0243121 +0.583363 +-0.146798 +0.0871747 +0.42174 +-0.0787629 +0.640284 +5.06186 +-0.11502 +0.606937 +-0.0125119 +0.0729971 +-0.0242525 +-0.0754533 +-0.0248233 +-0.0108515 +-0.212499 +-0.00346643 +0.0526655 +-1.20473 +0.0507083 +-0.179964 +0.0162955 +0.016102 +0.0204115 +0.0108272 +-0.0134893 +0.00188099 +0.0292282 +-0.0201849 +0.00931351 +0.0538814 +-0.00468958 +0.0116852 +0.124351 +1.7046e-05 +0.0389695 +0.00488976 +0.0122115 +-0.0116595 +-490.205 +-490.288 +-0.0251003 +-0.267855 +-1386.8 +0.466904 +0.392058 +-1.13048 +-0.0262199 +567.912 +1990.33 +-775.784 +-0.136564 +-0.021597 +0.225766 +-0.07465 +0.0466086 +0.649846 +0.0447455 +0.154605 +-0.0143036 +-38.6059 +-59.4381 +385.481 +0.00205195 +-0.0304466 +-0.0243121 +-0.0787629 +0.42174 +0.640284 +-0.146798 +0.583363 +0.0871747 +-0.11502 +5.06186 +0.606937 +0.0729971 +-0.0125119 +-0.0242525 +-0.00346643 +-0.212499 +0.0526655 +-0.0248233 +-0.0754533 +-0.0108515 +0.0507083 +-1.20473 +-0.179964 +0.016102 +0.0162955 +0.0204115 +-0.0134893 +0.0108272 +0.00188099 +-0.00468958 +0.0538814 +0.0116852 +-0.0201849 +0.0292282 +0.00931351 +1.7046e-05 +0.124351 +0.0389695 +0.0122115 +0.00488976 +-0.0116595 +0.0251003 +0.0251003 +-0.32666 +0.00304816 +0.053135 +-1.02514 +0.053135 +0.00304816 +-1.02514 +-775.784 +-775.784 +7797.07 +0.237089 +0.237089 +-0.0465557 +0.027228 +0.553346 +-0.020746 +0.553346 +0.027228 +-0.020746 +388.557 +388.557 +-3897.53 +-0.037226 +-0.037226 +0.00552773 +0.0277104 +-0.110987 +0.074426 +-0.110987 +0.0277104 +0.074426 +0.337238 +0.337238 +0.079704 +0.0152097 +0.0152097 +-0.00637744 +-0.00236739 +0.00553496 +6.17619e-05 +0.00553496 +-0.00236739 +6.17619e-05 +-0.0764976 +-0.0764976 +-0.0308651 +0.00155356 +0.00155356 +0.00410436 +-0.00126122 +-0.00126122 +0.000995693 +0.00105151 +-0.00131965 +0.0024964 +-0.00131965 +0.00105151 +0.0024964 +0.00778484 +0.00778484 +0.00455579 +0.00103177 +0.00103177 +-0.00220184 +-59.4381 +-38.6059 +-388.557 +-1066.01 +70.5226 +710.389 +-5.37811 +71.418 +-47.476 +-0.021597 +-0.136564 +0.237089 +4392.03 +660.493 +993.176 +-1585.35 +-0.740773 +-0.0339266 +-1.78233 +0.475093 +0.0547535 +-560.649 +-560.722 +-0.0747833 +-57.7288 +-38.8699 +-387.225 +-1062.43 +-82.1391 +-816.16 +-7.00761 +-81.0473 +-62.6346 +-0.00362438 +-0.195686 +-0.196187 +6.65338 +-0.0972213 +-1.15425 +0.461214 +0.140634 +0.162896 +0.53653 +0.0945193 +-0.0839861 +-0.0439697 +-0.337222 +-0.177623 +-0.0740894 +-0.114823 +0.142988 +-0.713025 +0.0244686 +0.209259 +-0.160889 +0.00403492 +0.112973 +-0.167947 +0.1029 +0.0540287 +-0.0387499 +0.0475908 +0.00812452 +-0.0171316 +-0.0865195 +-0.0779926 +-38.6059 +-59.4381 +-388.557 +71.418 +-5.37811 +-47.476 +70.5226 +-1066.01 +710.389 +-0.136564 +-0.021597 +0.237089 +660.493 +4392.03 +993.176 +0.475093 +-1.78233 +0.0547535 +-0.740773 +-1585.35 +-0.0339266 +-560.722 +-560.649 +-0.0747833 +-38.8699 +-57.7288 +-387.225 +-81.0473 +-7.00761 +-62.6346 +-82.1391 +-1062.43 +-816.16 +-0.195686 +-0.00362438 +-0.196187 +-0.0972213 +6.65338 +-1.15425 +0.0945193 +0.53653 +-0.0839861 +0.140634 +0.461214 +0.162896 +-0.337222 +-0.0439697 +-0.177623 +-0.114823 +-0.0740894 +0.142988 +0.0244686 +-0.713025 +0.209259 +0.1029 +-0.167947 +0.0540287 +0.00403492 +-0.160889 +0.112973 +0.0475908 +-0.0387499 +0.00812452 +-0.0865195 +-0.0171316 +-0.0779926 +-385.481 +-385.481 +-3897.53 +710.379 +-47.1606 +-474.485 +-47.1606 +710.379 +-474.485 +0.225766 +0.225766 +-0.0465557 +993.176 +993.176 +10005.4 +-0.0573311 +0.0503289 +-1.53545 +0.0503289 +-0.0573311 +-1.53545 +0.0747833 +0.0747833 +-0.268728 +-389.959 +-389.959 +-3896.92 +-816.667 +-63.0733 +-629.339 +-63.0733 +-816.667 +-629.339 +-0.190581 +-0.190581 +-0.0335171 +-0.248471 +-0.248471 +-0.0727184 +-0.498551 +-0.0283692 +-0.076313 +-0.0283692 +-0.498551 +-0.076313 +-0.0330982 +-0.0330982 +0.00266288 +0.00554188 +0.00554188 +0.0155029 +0.0360689 +0.0360689 +-0.0302927 +0.0844287 +0.0146399 +0.0165473 +0.0146399 +0.0844287 +0.0165473 +0.00139059 +0.00139059 +0.00205525 +-0.000503376 +-0.000503376 +-0.00568056 +0.0466086 +0.0447455 +-0.553346 +-58.5567 +38.6301 +389.148 +-0.0274214 +0.249666 +-0.164121 +0.154605 +-0.07465 +0.027228 +-1585.35 +0.475093 +-0.0573311 +2253.17 +-638.199 +-776.518 +-560.361 +560.313 +0.0158984 +-1.78233 +-0.740773 +-0.0503289 +0.254632 +0.0301724 +0.269511 +-58.2814 +38.6878 +385.877 +-0.0278594 +0.173959 +0.123827 +0.102477 +0.0175985 +0.0034759 +0.624486 +0.123809 +0.647462 +4.76759 +0.0121186 +0.726097 +-0.00139241 +-0.0731863 +0.00227585 +0.68789 +0.17083 +0.12819 +0.0342053 +-0.0319406 +-0.122696 +-0.17412 +-0.00293026 +0.0938044 +-0.808359 +-0.0544554 +-0.192594 +-0.0388056 +-0.00845262 +-0.0247343 +-0.101597 +0.0421317 +-0.0244629 +0.0570756 +-0.0262496 +0.0532159 +-0.07465 +0.154605 +-0.027228 +38.6301 +-58.5567 +-389.148 +0.249666 +-0.0274214 +0.164121 +0.0447455 +0.0466086 +0.553346 +-0.740773 +-1.78233 +0.0503289 +-638.199 +2253.17 +776.518 +560.313 +-560.361 +-0.0158984 +0.475093 +-1585.35 +0.0573311 +0.0175985 +0.102477 +-0.0034759 +38.6878 +-58.2814 +-385.877 +0.173959 +-0.0278594 +-0.123827 +0.0301724 +0.254632 +-0.269511 +0.17083 +0.68789 +-0.12819 +0.0121186 +4.76759 +-0.726097 +-0.0731863 +-0.00139241 +-0.00227585 +0.123809 +0.624486 +-0.647462 +-0.0319406 +0.0342053 +0.122696 +0.0421317 +-0.101597 +0.0244629 +-0.0544554 +-0.808359 +0.192594 +-0.00845262 +-0.0388056 +0.0247343 +-0.00293026 +-0.17412 +-0.0938044 +-0.0262496 +0.0570756 +-0.0532159 +-0.649846 +0.0143036 +-0.020746 +386.582 +-386.582 +-3897.23 +-0.360423 +0.360423 +-0.00505008 +-0.0143036 +0.649846 +-0.020746 +-0.0339266 +0.0547535 +-1.53545 +-776.518 +776.518 +7798.07 +-0.0158984 +0.0158984 +-0.437385 +-0.0547535 +0.0339266 +-1.53545 +0.648808 +-0.0270483 +-0.052545 +388.987 +-388.987 +-3897.43 +0.32913 +-0.32913 +-0.0863819 +0.0270483 +-0.648808 +-0.052545 +-0.133462 +-0.0231839 +0.078835 +0.261059 +-0.261059 +0.0748703 +-0.0442692 +0.0442692 +0.0158796 +0.0231839 +0.133462 +0.078835 +0.00189813 +-0.00189813 +-0.0220231 +0.00568033 +0.0017499 +-0.00020328 +-0.038754 +0.038754 +-0.027308 +0.0102927 +-0.0102927 +-0.00798257 +-0.0017499 +-0.00568033 +-0.00020328 +0.00215333 +-0.00215333 +0.0102405 +0.154605 +-0.07465 +-0.027228 +-0.0274214 +0.249666 +0.164121 +-58.5567 +38.6301 +-389.148 +0.0466086 +0.0447455 +0.553346 +-1.78233 +-0.740773 +0.0503289 +-560.361 +560.313 +-0.0158984 +2253.17 +-638.199 +776.518 +-1585.35 +0.475093 +0.0573311 +0.102477 +0.0175985 +-0.0034759 +-0.0278594 +0.173959 +-0.123827 +-58.2814 +38.6878 +-385.877 +0.254632 +0.0301724 +-0.269511 +0.68789 +0.17083 +-0.12819 +-0.00139241 +-0.0731863 +-0.00227585 +4.76759 +0.0121186 +-0.726097 +0.624486 +0.123809 +-0.647462 +0.0342053 +-0.0319406 +0.122696 +-0.101597 +0.0421317 +0.0244629 +-0.0388056 +-0.00845262 +0.0247343 +-0.808359 +-0.0544554 +0.192594 +-0.17412 +-0.00293026 +-0.0938044 +0.0570756 +-0.0262496 +-0.0532159 +0.0447455 +0.0466086 +-0.553346 +0.249666 +-0.0274214 +-0.164121 +38.6301 +-58.5567 +389.148 +-0.07465 +0.154605 +0.027228 +0.475093 +-1585.35 +-0.0573311 +560.313 +-560.361 +0.0158984 +-638.199 +2253.17 +-776.518 +-0.740773 +-1.78233 +-0.0503289 +0.0301724 +0.254632 +0.269511 +0.173959 +-0.0278594 +0.123827 +38.6878 +-58.2814 +385.877 +0.0175985 +0.102477 +0.0034759 +0.123809 +0.624486 +0.647462 +-0.0731863 +-0.00139241 +0.00227585 +0.0121186 +4.76759 +0.726097 +0.17083 +0.68789 +0.12819 +-0.0319406 +0.0342053 +-0.122696 +-0.00293026 +-0.17412 +0.0938044 +-0.00845262 +-0.0388056 +-0.0247343 +-0.0544554 +-0.808359 +-0.192594 +0.0421317 +-0.101597 +-0.0244629 +-0.0262496 +0.0570756 +0.0532159 +0.0143036 +-0.649846 +-0.020746 +0.360423 +-0.360423 +-0.00505008 +-386.582 +386.582 +-3897.23 +0.649846 +-0.0143036 +-0.020746 +0.0547535 +-0.0339266 +-1.53545 +0.0158984 +-0.0158984 +-0.437385 +776.518 +-776.518 +7798.07 +0.0339266 +-0.0547535 +-1.53545 +-0.0270483 +0.648808 +-0.052545 +-0.32913 +0.32913 +-0.0863819 +-388.987 +388.987 +-3897.43 +-0.648808 +0.0270483 +-0.052545 +-0.0231839 +-0.133462 +0.078835 +0.0442692 +-0.0442692 +0.0158796 +-0.261059 +0.261059 +0.0748703 +0.133462 +0.0231839 +0.078835 +-0.00189813 +0.00189813 +-0.0220231 +0.0017499 +0.00568033 +-0.00020328 +-0.0102927 +0.0102927 +-0.00798257 +0.038754 +-0.038754 +-0.027308 +-0.00568033 +-0.0017499 +-0.00020328 +-0.00215333 +0.00215333 +0.0102405 +-0.021597 +-0.136564 +-0.237089 +-5.37811 +71.418 +47.476 +-1066.01 +70.5226 +-710.389 +-59.4381 +-38.6059 +388.557 +-560.649 +-560.722 +0.0747833 +-1.78233 +0.475093 +-0.0547535 +-1585.35 +-0.740773 +0.0339266 +4392.03 +660.493 +-993.176 +-0.00362438 +-0.195686 +0.196187 +-7.00761 +-81.0473 +62.6346 +-1062.43 +-82.1391 +816.16 +-57.7288 +-38.8699 +387.225 +-0.0439697 +-0.337222 +0.177623 +0.53653 +0.0945193 +0.0839861 +0.461214 +0.140634 +-0.162896 +6.65338 +-0.0972213 +1.15425 +-0.0740894 +-0.114823 +-0.142988 +-0.0387499 +0.0475908 +-0.00812452 +-0.167947 +0.1029 +-0.0540287 +-0.160889 +0.00403492 +-0.112973 +-0.713025 +0.0244686 +-0.209259 +-0.0171316 +-0.0865195 +0.0779926 +-0.136564 +-0.021597 +-0.237089 +70.5226 +-1066.01 +-710.389 +71.418 +-5.37811 +47.476 +-38.6059 +-59.4381 +388.557 +-560.722 +-560.649 +0.0747833 +-0.740773 +-1585.35 +0.0339266 +0.475093 +-1.78233 +-0.0547535 +660.493 +4392.03 +-993.176 +-0.195686 +-0.00362438 +0.196187 +-82.1391 +-1062.43 +816.16 +-81.0473 +-7.00761 +62.6346 +-38.8699 +-57.7288 +387.225 +-0.337222 +-0.0439697 +0.177623 +0.140634 +0.461214 +-0.162896 +0.0945193 +0.53653 +0.0839861 +-0.0972213 +6.65338 +1.15425 +-0.114823 +-0.0740894 +-0.142988 +0.0475908 +-0.0387499 +-0.00812452 +0.00403492 +-0.160889 +-0.112973 +0.1029 +-0.167947 +-0.0540287 +0.0244686 +-0.713025 +-0.209259 +-0.0865195 +-0.0171316 +0.0779926 +-0.225766 +-0.225766 +-0.0465557 +47.1606 +-710.379 +-474.485 +-710.379 +47.1606 +-474.485 +385.481 +385.481 +-3897.53 +-0.0747833 +-0.0747833 +-0.268728 +-0.0503289 +0.0573311 +-1.53545 +0.0573311 +-0.0503289 +-1.53545 +-993.176 +-993.176 +10005.4 +0.190581 +0.190581 +-0.0335171 +63.0733 +816.667 +-629.339 +816.667 +63.0733 +-629.339 +389.959 +389.959 +-3896.92 +0.0330982 +0.0330982 +0.00266288 +0.0283692 +0.498551 +-0.076313 +0.498551 +0.0283692 +-0.076313 +0.248471 +0.248471 +-0.0727184 +-0.00554188 +-0.00554188 +0.0155029 +-0.00139059 +-0.00139059 +0.00205525 +-0.0146399 +-0.0844287 +0.0165473 +-0.0844287 +-0.0146399 +0.0165473 +-0.0360689 +-0.0360689 +-0.0302927 +0.000503376 +0.000503376 +-0.00568056 +5.06186 +-0.11502 +-0.337238 +0.248145 +-0.000773718 +0.460779 +0.41147 +-0.100585 +-0.0404939 +-0.0304466 +0.00205195 +-0.037226 +-57.7288 +-38.8699 +-389.959 +0.254632 +0.0175985 +0.648808 +0.102477 +0.0301724 +-0.0270483 +-0.00362438 +-0.195686 +0.190581 +1607.4 +469.247 +776.404 +-1108.36 +-0.183225 +-0.0252203 +-1.70748 +0.566816 +0.121913 +-391.559 +-391.5 +-0.00866082 +-57.6025 +-38.6618 +-385.371 +0.451009 +-0.0141539 +-0.406433 +0.18314 +-0.0667222 +0.0421279 +0.0214094 +-0.0306797 +0.0645324 +0.0678189 +-0.0778239 +-0.57432 +2.89767 +0.0234001 +-0.871894 +0.421527 +-0.0919603 +-0.462379 +0.685305 +-0.215989 +-0.20399 +0.0348205 +0.0425194 +-0.0164578 +0.0839516 +0.0944766 +0.314077 +-0.11502 +5.06186 +-0.337238 +-0.100585 +0.41147 +-0.0404939 +-0.000773718 +0.248145 +0.460779 +0.00205195 +-0.0304466 +-0.037226 +-38.8699 +-57.7288 +-389.959 +0.0301724 +0.102477 +-0.0270483 +0.0175985 +0.254632 +0.648808 +-0.195686 +-0.00362438 +0.190581 +469.247 +1607.4 +776.404 +0.566816 +-1.70748 +0.121913 +-0.183225 +-1108.36 +-0.0252203 +-391.5 +-391.559 +-0.00866082 +-38.6618 +-57.6025 +-385.371 +-0.0667222 +0.18314 +0.0421279 +-0.0141539 +0.451009 +-0.406433 +-0.0306797 +0.0214094 +0.0645324 +-0.0778239 +0.0678189 +-0.57432 +0.0234001 +2.89767 +-0.871894 +-0.215989 +0.685305 +-0.20399 +-0.0919603 +0.421527 +-0.462379 +0.0425194 +0.0348205 +-0.0164578 +0.0944766 +0.0839516 +0.314077 +-0.606937 +-0.606937 +0.079704 +-0.0920349 +-0.0549392 +-0.0532046 +-0.0549392 +-0.0920349 +-0.0532046 +-0.0243121 +-0.0243121 +0.00552773 +-387.225 +-387.225 +-3896.92 +0.269511 +-0.0034759 +-0.052545 +-0.0034759 +0.269511 +-0.052545 +0.196187 +0.196187 +-0.0335171 +776.404 +776.404 +7796.54 +0.0793758 +0.0930565 +-0.878158 +0.0930565 +0.0793758 +-0.878158 +0.00866082 +0.00866082 +-0.296703 +-388.46 +-388.46 +-3897.62 +-0.325255 +-0.0227143 +-0.0132897 +-0.0227143 +-0.325255 +-0.0132897 +-0.182641 +-0.182641 +-0.0732764 +0.00527268 +0.00527268 +0.112376 +-0.223009 +-0.223009 +0.128488 +0.0352938 +-0.0415334 +0.0697438 +-0.0415334 +0.0352938 +0.0697438 +0.0111965 +0.0111965 +0.0138805 +-0.0136747 +-0.0136747 +-0.0597699 +0.42174 +-0.146798 +0.110987 +6.56901 +0.264895 +0.380074 +-0.0738641 +0.306412 +-0.0077342 +0.583363 +-0.0787629 +0.0277104 +-1062.43 +-81.0473 +-816.667 +-58.2814 +38.6878 +388.987 +-0.0278594 +0.173959 +-0.32913 +-7.00761 +-82.1391 +63.0733 +-1108.36 +0.566816 +0.0793758 +3704.86 +-492.682 +-1033.72 +-391.91 +391.885 +0.0584443 +-1.70748 +-0.183225 +-0.0930565 +-1020.42 +93.1075 +926.149 +-56.913 +38.8 +386.539 +-0.0526068 +0.232665 +-0.0277623 +-9.20235 +91.7568 +83.888 +-0.00589175 +0.413315 +0.849592 +0.56814 +-0.137338 +-0.361101 +4.4773 +0.168613 +1.21083 +0.0793485 +0.0835317 +0.212446 +0.559866 +-0.154137 +0.162958 +-0.271408 +0.221032 +-0.383596 +-0.0787629 +0.583363 +-0.0277104 +0.264895 +6.56901 +-0.380074 +0.306412 +-0.0738641 +0.0077342 +-0.146798 +0.42174 +-0.110987 +-82.1391 +-7.00761 +-63.0733 +38.6878 +-58.2814 +-388.987 +0.173959 +-0.0278594 +0.32913 +-81.0473 +-1062.43 +816.667 +-0.183225 +-1.70748 +0.0930565 +-492.682 +3704.86 +1033.72 +391.885 +-391.91 +-0.0584443 +0.566816 +-1108.36 +-0.0793758 +91.7568 +-9.20235 +-83.888 +38.8 +-56.913 +-386.539 +0.232665 +-0.0526068 +0.0277623 +93.1075 +-1020.42 +-926.149 +0.413315 +-0.00589175 +-0.849592 +-0.154137 +0.559866 +-0.162958 +0.168613 +4.4773 +-1.21083 +0.0835317 +0.0793485 +-0.212446 +-0.137338 +0.56814 +0.361101 +0.221032 +-0.271408 +0.383596 +-0.640284 +-0.0871747 +0.074426 +1.00508 +-1.00508 +-0.0064657 +-0.114551 +0.114551 +0.010514 +0.0871747 +0.640284 +0.074426 +-816.16 +-62.6346 +-629.339 +385.877 +-385.877 +-3897.43 +-0.123827 +0.123827 +-0.0863819 +62.6346 +816.16 +-629.339 +-0.0252203 +0.121913 +-0.878158 +-1033.72 +1033.72 +10743.1 +-0.0584443 +0.0584443 +-0.201006 +-0.121913 +0.0252203 +-0.878158 +926.189 +-84.5177 +-843.805 +389.812 +-389.812 +-3897.08 +0.103225 +-0.103225 +-0.0115568 +84.5177 +-926.189 +-843.805 +0.00516548 +-0.00516548 +-0.0909791 +0.411145 +-0.0317089 +-0.125467 +0.216071 +-0.216071 +-0.0427843 +0.110541 +-0.110541 +-0.0308923 +0.0317089 +-0.411145 +-0.125467 +-0.0183012 +0.0183012 +0.0556577 +0.583363 +-0.0787629 +-0.0277104 +-0.0738641 +0.306412 +0.0077342 +6.56901 +0.264895 +-0.380074 +0.42174 +-0.146798 +-0.110987 +-7.00761 +-82.1391 +-63.0733 +-0.0278594 +0.173959 +0.32913 +-58.2814 +38.6878 +-388.987 +-1062.43 +-81.0473 +816.667 +-1.70748 +-0.183225 +0.0930565 +-391.91 +391.885 +-0.0584443 +3704.86 +-492.682 +1033.72 +-1108.36 +0.566816 +-0.0793758 +-9.20235 +91.7568 +-83.888 +-0.0526068 +0.232665 +0.0277623 +-56.913 +38.8 +-386.539 +-1020.42 +93.1075 +-926.149 +-0.00589175 +0.413315 +-0.849592 +0.559866 +-0.154137 +-0.162958 +0.0793485 +0.0835317 +-0.212446 +4.4773 +0.168613 +-1.21083 +0.56814 +-0.137338 +0.361101 +-0.271408 +0.221032 +0.383596 +-0.146798 +0.42174 +0.110987 +0.306412 +-0.0738641 +-0.0077342 +0.264895 +6.56901 +0.380074 +-0.0787629 +0.583363 +0.0277104 +-81.0473 +-1062.43 +-816.667 +0.173959 +-0.0278594 +-0.32913 +38.6878 +-58.2814 +388.987 +-82.1391 +-7.00761 +63.0733 +0.566816 +-1108.36 +0.0793758 +391.885 +-391.91 +0.0584443 +-492.682 +3704.86 +-1033.72 +-0.183225 +-1.70748 +-0.0930565 +93.1075 +-1020.42 +926.149 +0.232665 +-0.0526068 +-0.0277623 +38.8 +-56.913 +386.539 +91.7568 +-9.20235 +83.888 +0.413315 +-0.00589175 +0.849592 +-0.137338 +0.56814 +-0.361101 +0.0835317 +0.0793485 +0.212446 +0.168613 +4.4773 +1.21083 +-0.154137 +0.559866 +0.162958 +0.221032 +-0.271408 +-0.383596 +-0.0871747 +-0.640284 +0.074426 +0.114551 +-0.114551 +0.010514 +-1.00508 +1.00508 +-0.0064657 +0.640284 +0.0871747 +0.074426 +-62.6346 +-816.16 +-629.339 +0.123827 +-0.123827 +-0.0863819 +-385.877 +385.877 +-3897.43 +816.16 +62.6346 +-629.339 +0.121913 +-0.0252203 +-0.878158 +0.0584443 +-0.0584443 +-0.201006 +1033.72 +-1033.72 +10743.1 +0.0252203 +-0.121913 +-0.878158 +-84.5177 +926.189 +-843.805 +-0.103225 +0.103225 +-0.0115568 +-389.812 +389.812 +-3897.08 +-926.189 +84.5177 +-843.805 +-0.00516548 +0.00516548 +-0.0909791 +-0.0317089 +0.411145 +-0.125467 +-0.110541 +0.110541 +-0.0308923 +-0.216071 +0.216071 +-0.0427843 +-0.411145 +0.0317089 +-0.125467 +0.0183012 +-0.0183012 +0.0556577 +-0.0304466 +0.00205195 +0.037226 +0.41147 +-0.100585 +0.0404939 +0.248145 +-0.000773718 +-0.460779 +5.06186 +-0.11502 +0.337238 +-0.00362438 +-0.195686 +-0.190581 +0.102477 +0.0301724 +0.0270483 +0.254632 +0.0175985 +-0.648808 +-57.7288 +-38.8699 +389.959 +-391.559 +-391.5 +0.00866082 +-1.70748 +0.566816 +-0.121913 +-1108.36 +-0.183225 +0.0252203 +1607.4 +469.247 +-776.404 +0.0214094 +-0.0306797 +-0.0645324 +0.18314 +-0.0667222 +-0.0421279 +0.451009 +-0.0141539 +0.406433 +-57.6025 +-38.6618 +385.371 +0.0678189 +-0.0778239 +0.57432 +0.0348205 +0.0425194 +0.0164578 +0.685305 +-0.215989 +0.20399 +0.421527 +-0.0919603 +0.462379 +2.89767 +0.0234001 +0.871894 +0.0839516 +0.0944766 +-0.314077 +0.00205195 +-0.0304466 +0.037226 +-0.000773718 +0.248145 +-0.460779 +-0.100585 +0.41147 +0.0404939 +-0.11502 +5.06186 +0.337238 +-0.195686 +-0.00362438 +-0.190581 +0.0175985 +0.254632 +-0.648808 +0.0301724 +0.102477 +0.0270483 +-38.8699 +-57.7288 +389.959 +-391.5 +-391.559 +0.00866082 +-0.183225 +-1108.36 +0.0252203 +0.566816 +-1.70748 +-0.121913 +469.247 +1607.4 +-776.404 +-0.0306797 +0.0214094 +-0.0645324 +-0.0141539 +0.451009 +0.406433 +-0.0667222 +0.18314 +-0.0421279 +-38.6618 +-57.6025 +385.371 +-0.0778239 +0.0678189 +0.57432 +0.0425194 +0.0348205 +0.0164578 +-0.0919603 +0.421527 +0.462379 +-0.215989 +0.685305 +0.20399 +0.0234001 +2.89767 +0.871894 +0.0944766 +0.0839516 +-0.314077 +0.0243121 +0.0243121 +0.00552773 +0.0549392 +0.0920349 +-0.0532046 +0.0920349 +0.0549392 +-0.0532046 +0.606937 +0.606937 +0.079704 +-0.196187 +-0.196187 +-0.0335171 +0.0034759 +-0.269511 +-0.052545 +-0.269511 +0.0034759 +-0.052545 +387.225 +387.225 +-3896.92 +-0.00866082 +-0.00866082 +-0.296703 +-0.0930565 +-0.0793758 +-0.878158 +-0.0793758 +-0.0930565 +-0.878158 +-776.404 +-776.404 +7796.54 +0.182641 +0.182641 +-0.0732764 +0.0227143 +0.325255 +-0.0132897 +0.325255 +0.0227143 +-0.0132897 +388.46 +388.46 +-3897.62 +-0.00527268 +-0.00527268 +0.112376 +-0.0111965 +-0.0111965 +0.0138805 +0.0415334 +-0.0352938 +0.0697438 +-0.0352938 +0.0415334 +0.0697438 +0.223009 +0.223009 +0.128488 +0.0136747 +0.0136747 +-0.0597699 +-1.20473 +0.0507083 +0.0764976 +-0.181382 +-0.0828652 +-0.117741 +-0.184547 +-0.00548262 +0.0161033 +-0.0125119 +0.0729971 +0.0152097 +6.65338 +-0.0972213 +-0.248471 +0.624486 +0.17083 +-0.133462 +0.68789 +0.123809 +-0.0231839 +-0.0439697 +-0.337222 +0.0330982 +-57.6025 +-38.6618 +-388.46 +-1020.42 +91.7568 +926.189 +-9.20235 +93.1075 +-84.5177 +0.0214094 +-0.0306797 +0.182641 +4334.65 +1037.52 +1069.1 +-1330.96 +-1.33531 +-0.0481398 +-1.81114 +1.25534 +0.0960574 +-0.521198 +-1.54 +-0.197646 +-941.584 +-938.113 +0.0375201 +-47.2244 +-38.8124 +-385.388 +-919.993 +-102.357 +-1021.61 +-11.8759 +-101.139 +-112.779 +-0.181416 +0.0100031 +0.110102 +0.0111675 +-1.5288 +-2.30787 +0.0507083 +-1.20473 +0.0764976 +-0.00548262 +-0.184547 +0.0161033 +-0.0828652 +-0.181382 +-0.117741 +0.0729971 +-0.0125119 +0.0152097 +-0.0972213 +6.65338 +-0.248471 +0.123809 +0.68789 +-0.0231839 +0.17083 +0.624486 +-0.133462 +-0.337222 +-0.0439697 +0.0330982 +-38.6618 +-57.6025 +-388.46 +93.1075 +-9.20235 +-84.5177 +91.7568 +-1020.42 +926.189 +-0.0306797 +0.0214094 +0.182641 +1037.52 +4334.65 +1069.1 +1.25534 +-1.81114 +0.0960574 +-1.33531 +-1330.96 +-0.0481398 +-1.54 +-0.521198 +-0.197646 +-938.113 +-941.584 +0.0375201 +-38.8124 +-47.2244 +-385.388 +-101.139 +-11.8759 +-112.779 +-102.357 +-919.993 +-1021.61 +0.0100031 +-0.181416 +0.110102 +-1.5288 +0.0111675 +-2.30787 +0.179964 +0.179964 +-0.0308651 +-0.154083 +0.0353681 +0.00676233 +0.0353681 +-0.154083 +0.00676233 +-0.0242525 +-0.0242525 +-0.00637744 +-1.15425 +-1.15425 +-0.0727184 +0.647462 +-0.12819 +0.078835 +-0.12819 +0.647462 +0.078835 +0.177623 +0.177623 +0.00266288 +-385.371 +-385.371 +-3897.62 +926.149 +-83.888 +-843.805 +-83.888 +926.149 +-843.805 +-0.0645324 +-0.0645324 +-0.0732764 +1069.1 +1069.1 +11761.3 +0.530108 +0.177773 +-1.43166 +0.177773 +0.530108 +-1.43166 +0.197646 +0.197646 +1.00606 +0.40851 +0.40851 +-4.19182 +-390.383 +-390.383 +-3896.99 +-1022.1 +-113.893 +-1136.29 +-113.893 +-1022.1 +-1136.29 +0.0372216 +0.0372216 +-0.0765286 +-0.471714 +-0.471714 +-0.391224 +-0.212499 +-0.0248233 +-0.00553496 +-1.09651 +-0.0469509 +-0.074228 +-0.0140005 +-0.0455285 +-0.00311767 +-0.0754533 +-0.00346643 +-0.00236739 +0.461214 +0.0945193 +-0.498551 +4.76759 +0.0121186 +0.261059 +-0.00139241 +-0.0731863 +0.0442692 +0.53653 +0.140634 +0.0283692 +0.451009 +-0.0667222 +-0.325255 +-56.913 +38.8 +389.812 +-0.0526068 +0.232665 +-0.103225 +0.18314 +-0.0141539 +0.0227143 +-1330.96 +1.25534 +0.530108 +2374.33 +-1016.59 +-776.648 +0.159235 +0.613513 +0.0593587 +-1.81114 +-1.33531 +-0.177773 +-941.473 +937.916 +-0.0890923 +-0.403487 +0.0781599 +1.08711 +-48.6372 +38.1621 +384.764 +-0.144843 +0.0341797 +-0.17162 +0.143585 +-0.123433 +-0.158027 +0.482601 +0.955785 +1.62894 +-0.00346643 +-0.0754533 +0.00236739 +-0.0469509 +-1.09651 +0.074228 +-0.0455285 +-0.0140005 +0.00311767 +-0.0248233 +-0.212499 +0.00553496 +0.140634 +0.53653 +-0.0283692 +0.0121186 +4.76759 +-0.261059 +-0.0731863 +-0.00139241 +-0.0442692 +0.0945193 +0.461214 +0.498551 +-0.0141539 +0.18314 +-0.0227143 +38.8 +-56.913 +-389.812 +0.232665 +-0.0526068 +0.103225 +-0.0667222 +0.451009 +0.325255 +-1.33531 +-1.81114 +0.177773 +-1016.59 +2374.33 +776.648 +0.613513 +0.159235 +-0.0593587 +1.25534 +-1330.96 +-0.530108 +937.916 +-941.473 +0.0890923 +-0.123433 +0.143585 +0.158027 +38.1621 +-48.6372 +-384.764 +0.0341797 +-0.144843 +0.17162 +0.0781599 +-0.403487 +-1.08711 +0.955785 +0.482601 +-1.62894 +-0.0526655 +0.0108515 +6.17619e-05 +-0.160836 +0.160836 +-0.0264454 +0.00651007 +-0.00651007 +-0.00052924 +-0.0108515 +0.0526655 +6.17619e-05 +0.162896 +-0.0839861 +-0.076313 +0.726097 +-0.726097 +0.0748703 +-0.00227585 +0.00227585 +0.0158796 +0.0839861 +-0.162896 +-0.076313 +-0.406433 +0.0421279 +-0.0132897 +386.539 +-386.539 +-3897.08 +0.0277623 +-0.0277623 +-0.0115568 +-0.0421279 +0.406433 +-0.0132897 +-0.0481398 +0.0960574 +-1.43166 +-776.648 +776.648 +7800.77 +-0.0593587 +0.0593587 +1.10347 +-0.0960574 +0.0481398 +-1.43166 +-0.397309 +0.397309 +-4.55593 +0.260267 +-0.0333222 +-0.0296088 +389.721 +-389.721 +-3897.27 +0.010797 +-0.010797 +-0.142526 +0.0333222 +-0.260267 +-0.0296088 +0.308417 +-0.308417 +0.217768 +-0.0754533 +-0.00346643 +0.00236739 +-0.0140005 +-0.0455285 +0.00311767 +-1.09651 +-0.0469509 +0.074228 +-0.212499 +-0.0248233 +0.00553496 +0.53653 +0.140634 +-0.0283692 +-0.00139241 +-0.0731863 +-0.0442692 +4.76759 +0.0121186 +-0.261059 +0.461214 +0.0945193 +0.498551 +0.18314 +-0.0141539 +-0.0227143 +-0.0526068 +0.232665 +0.103225 +-56.913 +38.8 +-389.812 +0.451009 +-0.0667222 +0.325255 +-1.81114 +-1.33531 +0.177773 +0.159235 +0.613513 +-0.0593587 +2374.33 +-1016.59 +776.648 +-1330.96 +1.25534 +-0.530108 +-941.473 +937.916 +0.0890923 +0.143585 +-0.123433 +0.158027 +-0.144843 +0.0341797 +0.17162 +-48.6372 +38.1621 +-384.764 +-0.403487 +0.0781599 +-1.08711 +0.482601 +0.955785 +-1.62894 +-0.0248233 +-0.212499 +-0.00553496 +-0.0455285 +-0.0140005 +-0.00311767 +-0.0469509 +-1.09651 +-0.074228 +-0.00346643 +-0.0754533 +-0.00236739 +0.0945193 +0.461214 +-0.498551 +-0.0731863 +-0.00139241 +0.0442692 +0.0121186 +4.76759 +0.261059 +0.140634 +0.53653 +0.0283692 +-0.0667222 +0.451009 +-0.325255 +0.232665 +-0.0526068 +-0.103225 +38.8 +-56.913 +389.812 +-0.0141539 +0.18314 +0.0227143 +1.25534 +-1330.96 +0.530108 +0.613513 +0.159235 +0.0593587 +-1016.59 +2374.33 +-776.648 +-1.33531 +-1.81114 +-0.177773 +937.916 +-941.473 +-0.0890923 +0.0781599 +-0.403487 +1.08711 +0.0341797 +-0.144843 +-0.17162 +38.1621 +-48.6372 +384.764 +-0.123433 +0.143585 +-0.158027 +0.955785 +0.482601 +1.62894 +0.0108515 +-0.0526655 +6.17619e-05 +-0.00651007 +0.00651007 +-0.00052924 +0.160836 +-0.160836 +-0.0264454 +0.0526655 +-0.0108515 +6.17619e-05 +-0.0839861 +0.162896 +-0.076313 +0.00227585 +-0.00227585 +0.0158796 +-0.726097 +0.726097 +0.0748703 +-0.162896 +0.0839861 +-0.076313 +0.0421279 +-0.406433 +-0.0132897 +-0.0277623 +0.0277623 +-0.0115568 +-386.539 +386.539 +-3897.08 +0.406433 +-0.0421279 +-0.0132897 +0.0960574 +-0.0481398 +-1.43166 +0.0593587 +-0.0593587 +1.10347 +776.648 +-776.648 +7800.77 +0.0481398 +-0.0960574 +-1.43166 +0.397309 +-0.397309 +-4.55593 +-0.0333222 +0.260267 +-0.0296088 +-0.010797 +0.010797 +-0.142526 +-389.721 +389.721 +-3897.27 +-0.260267 +0.0333222 +-0.0296088 +-0.308417 +0.308417 +0.217768 +-0.0125119 +0.0729971 +-0.0152097 +-0.184547 +-0.00548262 +-0.0161033 +-0.181382 +-0.0828652 +0.117741 +-1.20473 +0.0507083 +-0.0764976 +-0.0439697 +-0.337222 +-0.0330982 +0.68789 +0.123809 +0.0231839 +0.624486 +0.17083 +0.133462 +6.65338 +-0.0972213 +0.248471 +0.0214094 +-0.0306797 +-0.182641 +-9.20235 +93.1075 +84.5177 +-1020.42 +91.7568 +-926.189 +-57.6025 +-38.6618 +388.46 +-0.521198 +-1.54 +0.197646 +-1.81114 +1.25534 +-0.0960574 +-1330.96 +-1.33531 +0.0481398 +4334.65 +1037.52 +-1069.1 +-941.584 +-938.113 +-0.0375201 +-0.181416 +0.0100031 +-0.110102 +-11.8759 +-101.139 +112.779 +-919.993 +-102.357 +1021.61 +-47.2244 +-38.8124 +385.388 +0.0111675 +-1.5288 +2.30787 +0.0729971 +-0.0125119 +-0.0152097 +-0.0828652 +-0.181382 +0.117741 +-0.00548262 +-0.184547 +-0.0161033 +0.0507083 +-1.20473 +-0.0764976 +-0.337222 +-0.0439697 +-0.0330982 +0.17083 +0.624486 +0.133462 +0.123809 +0.68789 +0.0231839 +-0.0972213 +6.65338 +0.248471 +-0.0306797 +0.0214094 +-0.182641 +91.7568 +-1020.42 +-926.189 +93.1075 +-9.20235 +84.5177 +-38.6618 +-57.6025 +388.46 +-1.54 +-0.521198 +0.197646 +-1.33531 +-1330.96 +0.0481398 +1.25534 +-1.81114 +-0.0960574 +1037.52 +4334.65 +-1069.1 +-938.113 +-941.584 +-0.0375201 +0.0100031 +-0.181416 +-0.110102 +-102.357 +-919.993 +1021.61 +-101.139 +-11.8759 +112.779 +-38.8124 +-47.2244 +385.388 +-1.5288 +0.0111675 +2.30787 +0.0242525 +0.0242525 +-0.00637744 +-0.0353681 +0.154083 +0.00676233 +0.154083 +-0.0353681 +0.00676233 +-0.179964 +-0.179964 +-0.0308651 +-0.177623 +-0.177623 +0.00266288 +0.12819 +-0.647462 +0.078835 +-0.647462 +0.12819 +0.078835 +1.15425 +1.15425 +-0.0727184 +0.0645324 +0.0645324 +-0.0732764 +83.888 +-926.149 +-843.805 +-926.149 +83.888 +-843.805 +385.371 +385.371 +-3897.62 +-0.197646 +-0.197646 +1.00606 +-0.177773 +-0.530108 +-1.43166 +-0.530108 +-0.177773 +-1.43166 +-1069.1 +-1069.1 +11761.3 +-0.40851 +-0.40851 +-4.19182 +-0.0372216 +-0.0372216 +-0.0765286 +113.893 +1022.1 +-1136.29 +1022.1 +113.893 +-1136.29 +390.383 +390.383 +-3896.99 +0.471714 +0.471714 +-0.391224 +0.0162955 +0.016102 +-0.00155356 +-0.0100963 +0.027968 +-0.00185284 +-0.0100963 +0.027968 +0.00185284 +0.0162955 +0.016102 +0.00155356 +-0.0740894 +-0.114823 +0.00554188 +0.0342053 +-0.0319406 +0.00189813 +0.0342053 +-0.0319406 +-0.00189813 +-0.0740894 +-0.114823 +-0.00554188 +0.0678189 +-0.0778239 +0.00527268 +-0.00589175 +0.413315 +0.00516548 +-0.00589175 +0.413315 +-0.00516548 +0.0678189 +-0.0778239 +-0.00527268 +-941.584 +-938.113 +0.40851 +-941.473 +937.916 +-0.397309 +-941.473 +937.916 +0.397309 +-941.584 +-938.113 +-0.40851 +3767.74 +-0.37335 +8.41514e-16 +0.0398147 +-0.28458 +0.484504 +-0.0133142 +0.446446 +-0.583477 +-0.0133142 +0.446446 +0.583477 +0.0398147 +-0.28458 +-0.484504 +-1.73201 +-0.00154004 +-6.32833e-16 +0.016102 +0.0162955 +-0.00155356 +0.027968 +-0.0100963 +0.00185284 +0.027968 +-0.0100963 +-0.00185284 +0.016102 +0.0162955 +0.00155356 +-0.114823 +-0.0740894 +0.00554188 +-0.0319406 +0.0342053 +-0.00189813 +-0.0319406 +0.0342053 +0.00189813 +-0.114823 +-0.0740894 +-0.00554188 +-0.0778239 +0.0678189 +0.00527268 +0.413315 +-0.00589175 +-0.00516548 +0.413315 +-0.00589175 +0.00516548 +-0.0778239 +0.0678189 +-0.00527268 +-938.113 +-941.584 +0.40851 +937.916 +-941.473 +0.397309 +937.916 +-941.473 +-0.397309 +-938.113 +-941.584 +-0.40851 +-0.37335 +3767.74 +2.37769e-15 +-0.28458 +0.0398147 +0.484504 +0.446446 +-0.0133142 +0.583477 +0.446446 +-0.0133142 +-0.583477 +-0.28458 +0.0398147 +-0.484504 +-0.00154004 +-1.73201 +2.02581e-15 +-0.0204115 +-0.0204115 +0.00410436 +0.0294307 +-0.0294307 +-0.000119449 +-0.0294307 +0.0294307 +-0.000119449 +0.0204115 +0.0204115 +0.00410436 +0.142988 +0.142988 +0.0155029 +-0.122696 +0.122696 +-0.0220231 +0.122696 +-0.122696 +-0.0220231 +-0.142988 +-0.142988 +0.0155029 +-0.57432 +-0.57432 +0.112376 +0.849592 +-0.849592 +-0.0909791 +-0.849592 +0.849592 +-0.0909791 +0.57432 +0.57432 +0.112376 +0.0375201 +0.0375201 +-4.19182 +-0.0890923 +0.0890923 +-4.55593 +0.0890923 +-0.0890923 +-4.55593 +-0.0375201 +-0.0375201 +-4.19182 +8.41514e-16 +2.37769e-15 +1347.13 +0.346281 +0.346281 +-0.168908 +-0.585219 +0.585219 +-0.518555 +0.585219 +-0.585219 +-0.518555 +-0.346281 +-0.346281 +-0.168908 +-8.90424e-17 +-8.73228e-16 +-1328.29 +0.124351 +1.7046e-05 +-0.00778484 +0.0469962 +-0.0169269 +0.0154433 +0.0389266 +-0.00341712 +-0.00305095 +0.0108272 +-0.0134893 +-0.00126122 +-0.713025 +0.0244686 +0.0360689 +-0.17412 +0.0421317 +0.00568033 +-0.101597 +-0.00293026 +0.0017499 +-0.0387499 +0.0475908 +-0.00139059 +2.89767 +0.0234001 +-0.223009 +0.56814 +-0.154137 +0.411145 +0.559866 +-0.137338 +-0.0317089 +0.0348205 +0.0425194 +-0.0111965 +-47.2244 +-38.8124 +-390.383 +-0.403487 +-0.123433 +0.260267 +0.143585 +0.0781599 +-0.0333222 +-0.181416 +0.0100031 +-0.0372216 +0.0398147 +-0.28458 +0.346281 +2714.38 +1211.09 +386.24 +-1492.65 +-0.824388 +1.91922 +-0.0449153 +0.803843 +-0.243475 +0.466903 +-0.647139 +-0.358846 +-1177.74 +-1171.15 +2.09744 +1.7046e-05 +0.124351 +-0.00778484 +-0.00341712 +0.0389266 +-0.00305095 +-0.0169269 +0.0469962 +0.0154433 +-0.0134893 +0.0108272 +-0.00126122 +0.0244686 +-0.713025 +0.0360689 +-0.00293026 +-0.101597 +0.0017499 +0.0421317 +-0.17412 +0.00568033 +0.0475908 +-0.0387499 +-0.00139059 +0.0234001 +2.89767 +-0.223009 +-0.137338 +0.559866 +-0.0317089 +-0.154137 +0.56814 +0.411145 +0.0425194 +0.0348205 +-0.0111965 +-38.8124 +-47.2244 +-390.383 +0.0781599 +0.143585 +-0.0333222 +-0.123433 +-0.403487 +0.260267 +0.0100031 +-0.181416 +-0.0372216 +-0.28458 +0.0398147 +0.346281 +1211.09 +2714.38 +386.24 +0.803843 +-0.0449153 +-0.243475 +-0.824388 +-1492.65 +1.91922 +-0.647139 +0.466903 +-0.358846 +-1171.15 +-1177.74 +2.09744 +-0.0389695 +-0.0389695 +0.00455579 +-0.0226327 +-0.00836761 +-0.00441524 +-0.00836761 +-0.0226327 +-0.00441524 +0.00188099 +0.00188099 +0.000995693 +0.209259 +0.209259 +-0.0302927 +0.0938044 +0.0244629 +-0.00020328 +0.0244629 +0.0938044 +-0.00020328 +-0.00812452 +-0.00812452 +0.00205525 +-0.871894 +-0.871894 +0.128488 +-0.361101 +-0.162958 +-0.125467 +-0.162958 +-0.361101 +-0.125467 +0.0164578 +0.0164578 +0.0138805 +-385.388 +-385.388 +-3896.99 +1.08711 +0.158027 +-0.0296088 +0.158027 +1.08711 +-0.0296088 +-0.110102 +-0.110102 +-0.0765286 +0.484504 +0.484504 +-0.168908 +386.24 +386.24 +3908.78 +-1.22162 +-0.0316826 +-2.40273 +-0.0316826 +-1.22162 +-2.40273 +0.358846 +0.358846 +2.18802 +-0.463774 +-0.463774 +-8.72164 +0.0538814 +-0.0201849 +0.00131965 +0.176759 +0.0183094 +0.0136511 +0.0052355 +0.0144878 +-0.00300295 +0.0292282 +-0.00468958 +0.00105151 +-0.160889 +0.1029 +0.0844287 +-0.808359 +-0.0544554 +-0.038754 +-0.0388056 +-0.00845262 +-0.0102927 +-0.167947 +0.00403492 +-0.0146399 +0.421527 +-0.215989 +0.0352938 +4.4773 +0.168613 +0.216071 +0.0793485 +0.0835317 +-0.110541 +0.685305 +-0.0919603 +0.0415334 +-919.993 +-101.139 +-1022.1 +-48.6372 +38.1621 +389.721 +-0.144843 +0.0341797 +-0.010797 +-11.8759 +-102.357 +113.893 +-0.0133142 +0.446446 +-0.585219 +-1492.65 +0.803843 +-1.22162 +3646.59 +-1006.75 +521.724 +0.413395 +0.831819 +0.296378 +-0.0449153 +-0.824388 +0.0316826 +-1178.34 +1170.79 +-1.96468 +-0.00468958 +0.0292282 +-0.00105151 +0.0183094 +0.176759 +-0.0136511 +0.0144878 +0.0052355 +0.00300295 +-0.0201849 +0.0538814 +-0.00131965 +0.00403492 +-0.167947 +0.0146399 +-0.0544554 +-0.808359 +0.038754 +-0.00845262 +-0.0388056 +0.0102927 +0.1029 +-0.160889 +-0.0844287 +-0.0919603 +0.685305 +-0.0415334 +0.168613 +4.4773 +-0.216071 +0.0835317 +0.0793485 +0.110541 +-0.215989 +0.421527 +-0.0352938 +-102.357 +-11.8759 +-113.893 +38.1621 +-48.6372 +-389.721 +0.0341797 +-0.144843 +0.010797 +-101.139 +-919.993 +1022.1 +0.446446 +-0.0133142 +0.585219 +-0.824388 +-0.0449153 +-0.0316826 +-1006.75 +3646.59 +-521.724 +0.831819 +0.413395 +-0.296378 +0.803843 +-1492.65 +1.22162 +1170.79 +-1178.34 +1.96468 +-0.0116852 +-0.00931351 +0.0024964 +0.0372451 +-0.0372451 +0.00200577 +-0.0141999 +0.0141999 +0.00035693 +0.00931351 +0.0116852 +0.0024964 +0.112973 +0.0540287 +0.0165473 +-0.192594 +0.192594 +-0.027308 +0.0247343 +-0.0247343 +-0.00798257 +-0.0540287 +-0.112973 +0.0165473 +-0.462379 +-0.20399 +0.0697438 +1.21083 +-1.21083 +-0.0427843 +-0.212446 +0.212446 +-0.0308923 +0.20399 +0.462379 +0.0697438 +-1021.61 +-112.779 +-1136.29 +384.764 +-384.764 +-3897.27 +0.17162 +-0.17162 +-0.142526 +112.779 +1021.61 +-1136.29 +-0.583477 +0.583477 +-0.518555 +1.91922 +-0.243475 +-2.40273 +521.724 +-521.724 +6181.68 +-0.296378 +0.296378 +2.0673 +0.243475 +-1.91922 +-2.40273 +0.242306 +-0.242306 +-8.49839 +0.0292282 +-0.00468958 +-0.00105151 +0.0052355 +0.0144878 +0.00300295 +0.176759 +0.0183094 +-0.0136511 +0.0538814 +-0.0201849 +-0.00131965 +-0.167947 +0.00403492 +0.0146399 +-0.0388056 +-0.00845262 +0.0102927 +-0.808359 +-0.0544554 +0.038754 +-0.160889 +0.1029 +-0.0844287 +0.685305 +-0.0919603 +-0.0415334 +0.0793485 +0.0835317 +0.110541 +4.4773 +0.168613 +-0.216071 +0.421527 +-0.215989 +-0.0352938 +-11.8759 +-102.357 +-113.893 +-0.144843 +0.0341797 +0.010797 +-48.6372 +38.1621 +-389.721 +-919.993 +-101.139 +1022.1 +-0.0133142 +0.446446 +0.585219 +-0.0449153 +-0.824388 +-0.0316826 +0.413395 +0.831819 +-0.296378 +3646.59 +-1006.75 +-521.724 +-1492.65 +0.803843 +1.22162 +-1178.34 +1170.79 +1.96468 +-0.0201849 +0.0538814 +0.00131965 +0.0144878 +0.0052355 +-0.00300295 +0.0183094 +0.176759 +0.0136511 +-0.00468958 +0.0292282 +0.00105151 +0.1029 +-0.160889 +0.0844287 +-0.00845262 +-0.0388056 +-0.0102927 +-0.0544554 +-0.808359 +-0.038754 +0.00403492 +-0.167947 +-0.0146399 +-0.215989 +0.421527 +0.0352938 +0.0835317 +0.0793485 +-0.110541 +0.168613 +4.4773 +0.216071 +-0.0919603 +0.685305 +0.0415334 +-101.139 +-919.993 +-1022.1 +0.0341797 +-0.144843 +-0.010797 +38.1621 +-48.6372 +389.721 +-102.357 +-11.8759 +113.893 +0.446446 +-0.0133142 +-0.585219 +0.803843 +-1492.65 +-1.22162 +0.831819 +0.413395 +0.296378 +-1006.75 +3646.59 +521.724 +-0.824388 +-0.0449153 +0.0316826 +1170.79 +-1178.34 +-1.96468 +-0.00931351 +-0.0116852 +0.0024964 +0.0141999 +-0.0141999 +0.00035693 +-0.0372451 +0.0372451 +0.00200577 +0.0116852 +0.00931351 +0.0024964 +0.0540287 +0.112973 +0.0165473 +-0.0247343 +0.0247343 +-0.00798257 +0.192594 +-0.192594 +-0.027308 +-0.112973 +-0.0540287 +0.0165473 +-0.20399 +-0.462379 +0.0697438 +0.212446 +-0.212446 +-0.0308923 +-1.21083 +1.21083 +-0.0427843 +0.462379 +0.20399 +0.0697438 +-112.779 +-1021.61 +-1136.29 +-0.17162 +0.17162 +-0.142526 +-384.764 +384.764 +-3897.27 +1021.61 +112.779 +-1136.29 +0.583477 +-0.583477 +-0.518555 +-0.243475 +1.91922 +-2.40273 +0.296378 +-0.296378 +2.0673 +-521.724 +521.724 +6181.68 +-1.91922 +0.243475 +-2.40273 +-0.242306 +0.242306 +-8.49839 +0.0108272 +-0.0134893 +0.00126122 +0.0389266 +-0.00341712 +0.00305095 +0.0469962 +-0.0169269 +-0.0154433 +0.124351 +1.7046e-05 +0.00778484 +-0.0387499 +0.0475908 +0.00139059 +-0.101597 +-0.00293026 +-0.0017499 +-0.17412 +0.0421317 +-0.00568033 +-0.713025 +0.0244686 +-0.0360689 +0.0348205 +0.0425194 +0.0111965 +0.559866 +-0.137338 +0.0317089 +0.56814 +-0.154137 +-0.411145 +2.89767 +0.0234001 +0.223009 +-0.181416 +0.0100031 +0.0372216 +0.143585 +0.0781599 +0.0333222 +-0.403487 +-0.123433 +-0.260267 +-47.2244 +-38.8124 +390.383 +0.0398147 +-0.28458 +-0.346281 +0.466903 +-0.647139 +0.358846 +-0.0449153 +0.803843 +0.243475 +-1492.65 +-0.824388 +-1.91922 +2714.38 +1211.09 +-386.24 +-1177.74 +-1171.15 +-2.09744 +-0.0134893 +0.0108272 +0.00126122 +-0.0169269 +0.0469962 +-0.0154433 +-0.00341712 +0.0389266 +0.00305095 +1.7046e-05 +0.124351 +0.00778484 +0.0475908 +-0.0387499 +0.00139059 +0.0421317 +-0.17412 +-0.00568033 +-0.00293026 +-0.101597 +-0.0017499 +0.0244686 +-0.713025 +-0.0360689 +0.0425194 +0.0348205 +0.0111965 +-0.154137 +0.56814 +-0.411145 +-0.137338 +0.559866 +0.0317089 +0.0234001 +2.89767 +0.223009 +0.0100031 +-0.181416 +0.0372216 +-0.123433 +-0.403487 +-0.260267 +0.0781599 +0.143585 +0.0333222 +-38.8124 +-47.2244 +390.383 +-0.28458 +0.0398147 +-0.346281 +-0.647139 +0.466903 +0.358846 +-0.824388 +-1492.65 +-1.91922 +0.803843 +-0.0449153 +0.243475 +1211.09 +2714.38 +-386.24 +-1171.15 +-1177.74 +-2.09744 +-0.00188099 +-0.00188099 +0.000995693 +0.00836761 +0.0226327 +-0.00441524 +0.0226327 +0.00836761 +-0.00441524 +0.0389695 +0.0389695 +0.00455579 +0.00812452 +0.00812452 +0.00205525 +-0.0244629 +-0.0938044 +-0.00020328 +-0.0938044 +-0.0244629 +-0.00020328 +-0.209259 +-0.209259 +-0.0302927 +-0.0164578 +-0.0164578 +0.0138805 +0.162958 +0.361101 +-0.125467 +0.361101 +0.162958 +-0.125467 +0.871894 +0.871894 +0.128488 +0.110102 +0.110102 +-0.0765286 +-0.158027 +-1.08711 +-0.0296088 +-1.08711 +-0.158027 +-0.0296088 +385.388 +385.388 +-3896.99 +-0.484504 +-0.484504 +-0.168908 +-0.358846 +-0.358846 +2.18802 +0.0316826 +1.22162 +-2.40273 +1.22162 +0.0316826 +-2.40273 +-386.24 +-386.24 +3908.78 +0.463774 +0.463774 +-8.72164 +0.00488976 +0.0122115 +-0.00103177 +-0.0188819 +0.0186254 +-0.00248795 +-0.0188819 +0.0186254 +0.00248795 +0.00488976 +0.0122115 +0.00103177 +-0.0171316 +-0.0865195 +-0.000503376 +0.0570756 +-0.0262496 +0.00215333 +0.0570756 +-0.0262496 +-0.00215333 +-0.0171316 +-0.0865195 +0.000503376 +0.0839516 +0.0944766 +-0.0136747 +-0.271408 +0.221032 +-0.0183012 +-0.271408 +0.221032 +0.0183012 +0.0839516 +0.0944766 +0.0136747 +0.0111675 +-1.5288 +-0.471714 +0.482601 +0.955785 +0.308417 +0.482601 +0.955785 +-0.308417 +0.0111675 +-1.5288 +0.471714 +-1.73201 +-0.00154004 +-8.90424e-17 +-1177.74 +-1171.15 +-0.463774 +-1178.34 +1170.79 +0.242306 +-1178.34 +1170.79 +-0.242306 +-1177.74 +-1171.15 +0.463774 +4713.21 +1.40761 +-1.45664e-15 +0.0122115 +0.00488976 +-0.00103177 +0.0186254 +-0.0188819 +0.00248795 +0.0186254 +-0.0188819 +-0.00248795 +0.0122115 +0.00488976 +0.00103177 +-0.0865195 +-0.0171316 +-0.000503376 +-0.0262496 +0.0570756 +-0.00215333 +-0.0262496 +0.0570756 +0.00215333 +-0.0865195 +-0.0171316 +0.000503376 +0.0944766 +0.0839516 +-0.0136747 +0.221032 +-0.271408 +0.0183012 +0.221032 +-0.271408 +-0.0183012 +0.0944766 +0.0839516 +0.0136747 +-1.5288 +0.0111675 +-0.471714 +0.955785 +0.482601 +-0.308417 +0.955785 +0.482601 +0.308417 +-1.5288 +0.0111675 +0.471714 +-0.00154004 +-1.73201 +-8.73228e-16 +-1171.15 +-1177.74 +-0.463774 +1170.79 +-1178.34 +-0.242306 +1170.79 +-1178.34 +0.242306 +-1171.15 +-1177.74 +0.463774 +1.40761 +4713.21 +-3.14819e-15 +0.0116595 +0.0116595 +-0.00220184 +-0.0128916 +0.0128916 +0.000528505 +0.0128916 +-0.0128916 +0.000528505 +-0.0116595 +-0.0116595 +-0.00220184 +-0.0779926 +-0.0779926 +-0.00568056 +0.0532159 +-0.0532159 +0.0102405 +-0.0532159 +0.0532159 +0.0102405 +0.0779926 +0.0779926 +-0.00568056 +0.314077 +0.314077 +-0.0597699 +-0.383596 +0.383596 +0.0556577 +0.383596 +-0.383596 +0.0556577 +-0.314077 +-0.314077 +-0.0597699 +-2.30787 +-2.30787 +-0.391224 +1.62894 +-1.62894 +0.217768 +-1.62894 +1.62894 +0.217768 +2.30787 +2.30787 +-0.391224 +-6.32833e-16 +2.02581e-15 +-1328.29 +2.09744 +2.09744 +-8.72164 +-1.96468 +1.96468 +-8.49839 +1.96468 +-1.96468 +-8.49839 +-2.09744 +-2.09744 +-8.72164 +-1.45664e-15 +-3.14819e-15 +1363.08 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 diff --git a/external/ldl/Matrix/A22 b/external/ldl/Matrix/A22 new file mode 100644 index 00000000..c6d98e0d --- /dev/null +++ b/external/ldl/Matrix/A22 @@ -0,0 +1,10485 @@ +name: HB/bcsstk02 n: 66 entries: 5175 (jumbled version) +66 1 +0 +81 +156 +235 +317 +395 +471 +543 +621 +703 +776 +854 +934 +1011 +1090 +1168 +1243 +1322 +1400 +1476 +1556 +1633 +1712 +1788 +1862 +1940 +2024 +2106 +2184 +2262 +2349 +2434 +2511 +2593 +2674 +2748 +2831 +2915 +2991 +3073 +3151 +3229 +3310 +3390 +3473 +3549 +3631 +3708 +3786 +3860 +3939 +4010 +4086 +4162 +4241 +4321 +4404 +4479 +4555 +4632 +4712 +4793 +4871 +4943 +5021 +5098 +5175 +57 +60 +38 +54 +9 +2 +33 +39 +45 +3 +0 +13 +35 +30 +64 +22 +8 +48 +31 +52 +44 +43 +19 +59 +18 +20 +16 +37 +28 +49 +28 +7 +62 +41 +21 +63 +12 +23 +29 +34 +4 +11 +33 +20 +21 +54 +52 +27 +17 +13 +32 +63 +16 +40 +6 +25 +24 +47 +14 +10 +55 +42 +53 +5 +58 +61 +26 +60 +56 +15 +36 +50 +51 +65 +42 +22 +6 +37 +1 +48 +46 +24 +51 +5 +39 +38 +14 +46 +6 +30 +42 +56 +40 +31 +32 +57 +12 +41 +25 +60 +3 +20 +0 +13 +4 +43 +62 +29 +23 +35 +64 +2 +31 +28 +64 +33 +63 +32 +9 +17 +58 +10 +36 +25 +13 +55 +54 +48 +61 +1 +7 +11 +53 +49 +22 +21 +45 +18 +59 +47 +16 +54 +8 +37 +19 +52 +34 +15 +50 +27 +53 +45 +65 +28 +26 +44 +21 +47 +35 +13 +63 +5 +35 +52 +42 +36 +48 +12 +46 +59 +33 +43 +51 +15 +30 +26 +9 +55 +52 +54 +57 +7 +22 +17 +38 +32 +44 +58 +39 +33 +49 +65 +24 +41 +19 +62 +53 +60 +39 +41 +18 +34 +32 +28 +34 +16 +14 +2 +61 +11 +1 +50 +3 +46 +10 +37 +28 +4 +25 +20 +8 +23 +55 +45 +64 +56 +13 +31 +40 +59 +27 +4 +29 +0 +6 +62 +27 +43 +61 +3 +26 +37 +39 +25 +0 +10 +20 +17 +33 +47 +56 +7 +60 +39 +1 +64 +32 +34 +15 +47 +21 +10 +52 +38 +65 +8 +49 +54 +57 +13 +45 +3 +11 +55 +31 +29 +48 +42 +4 +9 +12 +6 +24 +30 +58 +5 +29 +57 +55 +18 +35 +14 +53 +17 +2 +16 +19 +56 +41 +28 +19 +44 +42 +22 +23 +40 +59 +32 +38 +36 +7 +51 +41 +46 +50 +4 +63 +13 +0 +54 +43 +60 +16 +39 +12 +41 +19 +53 +57 +42 +25 +27 +36 +31 +60 +18 +20 +9 +64 +23 +17 +53 +49 +15 +52 +50 +58 +14 +30 +63 +7 +45 +10 +44 +21 +3 +34 +35 +1 +62 +56 +6 +38 +29 +55 +48 +3 +55 +59 +8 +33 +2 +47 +35 +24 +37 +40 +22 +51 +46 +5 +57 +4 +54 +4 +32 +65 +26 +11 +7 +28 +5 +2 +48 +61 +42 +45 +62 +4 +40 +25 +39 +8 +15 +30 +2 +33 +43 +59 +13 +0 +28 +53 +30 +17 +24 +54 +49 +35 +64 +10 +46 +9 +50 +63 +22 +19 +58 +41 +55 +12 +26 +33 +38 +18 +58 +56 +48 +29 +47 +60 +57 +1 +3 +34 +12 +14 +4 +27 +7 +16 +53 +5 +51 +11 +43 +32 +52 +44 +65 +6 +31 +20 +36 +21 +40 +37 +23 +32 +37 +61 +27 +42 +54 +46 +38 +19 +36 +0 +20 +15 +34 +21 +62 +2 +30 +51 +32 +61 +59 +7 +49 +33 +63 +40 +22 +58 +43 +37 +25 +35 +4 +0 +53 +23 +44 +18 +16 +64 +12 +26 +65 +3 +24 +11 +25 +9 +47 +36 +1 +39 +57 +27 +28 +50 +5 +62 +41 +13 +31 +56 +55 +42 +52 +45 +60 +8 +14 +17 +48 +29 +10 +6 +60 +36 +36 +59 +0 +65 +16 +41 +18 +20 +54 +25 +61 +15 +29 +18 +21 +37 +1 +3 +3 +63 +19 +29 +47 +44 +46 +27 +51 +62 +35 +4 +6 +32 +12 +56 +14 +15 +28 +64 +11 +61 +24 +8 +42 +9 +34 +58 +2 +41 +10 +52 +7 +13 +5 +30 +39 +46 +33 +7 +4 +17 +50 +26 +28 +48 +40 +49 +31 +57 +38 +23 +55 +43 +53 +22 +49 +45 +35 +22 +28 +19 +57 +8 +10 +58 +64 +38 +45 +65 +4 +28 +29 +19 +7 +21 +41 +47 +5 +1 +36 +62 +24 +58 +20 +30 +9 +36 +18 +55 +63 +48 +33 +32 +43 +39 +51 +16 +26 +60 +25 +6 +14 +46 +13 +27 +53 +15 +3 +35 +38 +61 +47 +56 +31 +23 +17 +12 +54 +52 +50 +42 +0 +14 +39 +49 +2 +59 +13 +57 +20 +21 +37 +44 +34 +25 +29 +15 +40 +11 +47 +28 +14 +2 +38 +33 +31 +20 +42 +35 +8 +59 +52 +23 +1 +5 +27 +0 +56 +34 +16 +26 +51 +61 +37 +25 +60 +19 +13 +29 +24 +15 +12 +41 +4 +17 +30 +7 +62 +21 +57 +65 +9 +26 +53 +57 +53 +32 +48 +45 +39 +40 +43 +6 +51 +39 +3 +44 +36 +18 +49 +58 +64 +54 +11 +46 +55 +50 +14 +60 +22 +63 +10 +42 +3 +48 +8 +45 +19 +14 +31 +51 +59 +25 +6 +16 +12 +54 +49 +47 +28 +32 +24 +23 +33 +33 +37 +35 +55 +34 +38 +62 +11 +58 +57 +10 +29 +41 +0 +7 +9 +13 +17 +64 +27 +52 +20 +3 +22 +40 +56 +44 +2 +37 +64 +5 +51 +46 +39 +21 +61 +30 +18 +58 +26 +45 +60 +44 +26 +43 +4 +55 +1 +50 +36 +35 +15 +34 +65 +53 +63 +1 +22 +12 +32 +17 +19 +4 +10 +59 +13 +30 +64 +53 +3 +57 +21 +18 +36 +40 +20 +63 +51 +34 +57 +25 +6 +49 +37 +46 +51 +5 +40 +15 +56 +59 +47 +48 +55 +38 +45 +16 +58 +2 +28 +43 +29 +0 +30 +32 +31 +60 +39 +26 +63 +23 +62 +14 +27 +44 +36 +42 +16 +52 +11 +41 +9 +42 +24 +61 +8 +19 +64 +29 +50 +65 +35 +7 +43 +54 +33 +43 +53 +35 +6 +54 +13 +43 +36 +5 +16 +32 +47 +3 +41 +0 +39 +19 +9 +45 +55 +45 +26 +44 +59 +17 +15 +28 +12 +31 +64 +22 +8 +58 +48 +41 +40 +23 +58 +24 +30 +49 +42 +53 +2 +14 +21 +25 +64 +4 +27 +62 +60 +32 +15 +11 +52 +51 +46 +63 +38 +19 +37 +20 +1 +5 +50 +34 +61 +57 +18 +33 +10 +7 +56 +65 +55 +29 +61 +43 +54 +15 +40 +57 +56 +4 +35 +39 +13 +8 +49 +55 +34 +17 +43 +20 +64 +16 +14 +2 +31 +16 +63 +53 +24 +58 +0 +52 +36 +19 +33 +28 +20 +6 +26 +2 +22 +25 +37 +5 +8 +62 +42 +45 +21 +32 +65 +55 +10 +12 +1 +0 +23 +7 +27 +50 +33 +3 +47 +19 +25 +29 +38 +18 +14 +48 +44 +9 +41 +1 +51 +11 +30 +46 +22 +59 +60 +20 +15 +59 +60 +51 +21 +54 +30 +38 +23 +32 +52 +2 +47 +57 +27 +45 +35 +65 +4 +14 +33 +56 +18 +36 +41 +29 +37 +53 +0 +8 +48 +44 +9 +58 +38 +3 +7 +26 +9 +17 +55 +46 +39 +25 +62 +31 +34 +24 +24 +43 +8 +25 +5 +22 +42 +10 +27 +13 +63 +16 +12 +64 +28 +40 +45 +30 +6 +36 +13 +1 +16 +11 +49 +56 +61 +19 +50 +56 +45 +60 +64 +26 +51 +58 +13 +50 +19 +61 +20 +59 +10 +24 +62 +22 +57 +14 +15 +39 +9 +63 +48 +34 +41 +18 +21 +31 +33 +2 +53 +21 +42 +0 +24 +11 +46 +47 +30 +5 +3 +38 +43 +4 +6 +35 +23 +44 +12 +54 +36 +12 +32 +25 +42 +35 +8 +16 +49 +27 +1 +28 +65 +7 +52 +37 +29 +17 +41 +7 +36 +40 +8 +55 +20 +64 +62 +41 +52 +54 +36 +58 +59 +13 +4 +14 +36 +11 +16 +22 +1 +29 +11 +21 +53 +43 +24 +2 +45 +57 +64 +15 +49 +27 +38 +6 +5 +35 +13 +32 +25 +63 +46 +32 +23 +21 +55 +37 +26 +7 +28 +0 +24 +34 +31 +39 +50 +17 +19 +12 +8 +38 +60 +44 +18 +33 +61 +60 +48 +0 +9 +40 +30 +14 +47 +51 +3 +65 +10 +56 +35 +61 +42 +14 +55 +40 +0 +1 +5 +6 +46 +31 +13 +8 +48 +43 +17 +16 +28 +37 +58 +25 +38 +54 +65 +30 +62 +57 +44 +64 +35 +45 +7 +18 +24 +34 +52 +9 +41 +20 +30 +50 +63 +26 +15 +26 +23 +21 +32 +57 +19 +63 +51 +12 +60 +3 +2 +33 +51 +42 +49 +53 +31 +62 +27 +4 +47 +11 +10 +3 +56 +60 +36 +61 +50 +35 +59 +29 +29 +39 +22 +19 +44 +53 +30 +29 +3 +18 +38 +34 +37 +21 +2 +28 +46 +49 +32 +60 +21 +1 +20 +22 +7 +4 +16 +11 +7 +58 +17 +6 +39 +63 +64 +52 +40 +51 +26 +41 +55 +54 +47 +23 +9 +15 +57 +47 +27 +31 +43 +14 +59 +25 +26 +49 +8 +10 +55 +61 +39 +65 +45 +35 +36 +48 +42 +5 +56 +41 +62 +33 +24 +12 +29 +13 +0 +50 +25 +6 +56 +25 +57 +60 +22 +24 +27 +17 +62 +14 +52 +20 +47 +8 +61 +41 +29 +54 +51 +11 +9 +59 +65 +61 +31 +42 +28 +35 +38 +39 +0 +64 +1 +55 +5 +25 +58 +59 +23 +2 +40 +16 +3 +34 +21 +32 +60 +20 +45 +33 +18 +30 +8 +26 +50 +7 +48 +46 +19 +10 +29 +37 +44 +12 +11 +43 +36 +4 +13 +36 +63 +15 +13 +53 +12 +40 +3 +43 +49 +10 +4 +15 +0 +58 +33 +62 +29 +63 +11 +22 +0 +8 +38 +24 +45 +45 +8 +6 +16 +1 +61 +43 +32 +49 +26 +34 +5 +2 +32 +41 +55 +59 +13 +52 +35 +40 +46 +12 +13 +53 +19 +39 +50 +31 +17 +37 +51 +23 +18 +27 +44 +65 +56 +30 +21 +60 +48 +31 +14 +7 +20 +49 +47 +24 +3 +41 +19 +28 +42 +57 +59 +9 +25 +36 +54 +64 +62 +59 +17 +52 +30 +31 +14 +22 +23 +15 +0 +5 +1 +18 +41 +55 +49 +12 +65 +10 +0 +56 +37 +28 +21 +29 +36 +26 +34 +48 +27 +8 +38 +51 +39 +54 +38 +25 +28 +18 +50 +33 +64 +24 +13 +4 +36 +19 +3 +60 +43 +42 +47 +63 +46 +53 +6 +16 +45 +61 +7 +49 +58 +16 +30 +40 +57 +43 +15 +60 +9 +31 +2 +11 +8 +32 +44 +35 +20 +11 +52 +49 +47 +31 +39 +58 +13 +18 +0 +47 +6 +25 +53 +1 +34 +45 +42 +14 +60 +24 +46 +5 +7 +37 +2 +30 +52 +22 +0 +33 +38 +56 +15 +44 +59 +54 +26 +36 +43 +17 +51 +41 +63 +10 +23 +59 +16 +55 +29 +19 +21 +28 +50 +12 +61 +40 +30 +60 +32 +65 +4 +31 +8 +57 +27 +35 +13 +39 +9 +64 +48 +55 +20 +3 +62 +33 +12 +13 +6 +53 +43 +5 +25 +59 +19 +2 +10 +49 +38 +57 +60 +51 +32 +35 +8 +46 +30 +49 +4 +52 +62 +63 +22 +24 +23 +63 +28 +64 +61 +55 +34 +58 +48 +33 +26 +41 +14 +37 +50 +56 +55 +65 +44 +7 +40 +36 +15 +45 +47 +27 +16 +3 +20 +1 +17 +36 +58 +45 +18 +11 +21 +37 +42 +29 +0 +39 +54 +9 +31 +65 +36 +37 +7 +14 +48 +19 +46 +23 +26 +56 +33 +27 +34 +3 +61 +45 +28 +10 +50 +22 +13 +30 +32 +64 +38 +57 +2 +55 +35 +53 +47 +29 +49 +15 +11 +44 +63 +64 +6 +31 +25 +16 +1 +4 +32 +20 +43 +14 +42 +20 +52 +51 +8 +54 +37 +15 +40 +62 +24 +30 +0 +58 +39 +25 +52 +41 +60 +59 +12 +17 +18 +40 +5 +21 +9 +49 +16 +14 +1 +2 +49 +24 +57 +5 +23 +46 +50 +59 +34 +26 +32 +54 +42 +24 +26 +13 +28 +63 +6 +19 +0 +38 +8 +48 +27 +7 +53 +39 +20 +47 +52 +36 +25 +41 +1 +31 +54 +15 +55 +19 +56 +3 +43 +12 +10 +11 +44 +61 +16 +9 +46 +22 +13 +17 +14 +30 +8 +62 +61 +32 +42 +64 +41 +6 +40 +21 +45 +29 +33 +37 +18 +4 +65 +29 +18 +60 +51 +58 +35 +36 +39 +29 +56 +36 +44 +59 +37 +54 +17 +18 +2 +34 +32 +47 +8 +47 +45 +3 +19 +51 +9 +5 +9 +49 +61 +28 +40 +31 +1 +35 +18 +55 +59 +13 +15 +23 +17 +20 +10 +25 +30 +38 +14 +36 +50 +11 +58 +52 +46 +65 +0 +64 +21 +45 +50 +41 +53 +42 +27 +24 +10 +33 +48 +57 +43 +22 +29 +33 +4 +26 +40 +25 +16 +12 +27 +30 +39 +7 +60 +63 +6 +43 +62 +23 +26 +57 +7 +34 +59 +47 +0 +21 +22 +25 +11 +54 +43 +6 +32 +14 +51 +8 +12 +38 +27 +6 +49 +65 +61 +24 +9 +53 +15 +5 +62 +19 +20 +53 +37 +64 +41 +29 +18 +55 +58 +2 +30 +56 +33 +63 +52 +45 +60 +33 +38 +1 +46 +26 +4 +31 +45 +36 +35 +35 +50 +42 +50 +10 +39 +17 +28 +48 +16 +13 +59 +65 +44 +14 +40 +55 +3 +44 +27 +1 +65 +57 +36 +22 +38 +20 +60 +54 +11 +58 +16 +30 +42 +34 +12 +35 +2 +30 +28 +26 +43 +53 +61 +5 +50 +52 +48 +18 +47 +19 +45 +29 +13 +32 +25 +8 +42 +3 +39 +31 +2 +49 +56 +0 +17 +62 +32 +63 +64 +51 +23 +55 +8 +4 +9 +31 +15 +46 +21 +41 +10 +21 +59 +24 +1 +40 +33 +37 +61 +6 +60 +14 +7 +0 +7 +5 +41 +21 +37 +60 +47 +17 +30 +15 +36 +28 +58 +49 +50 +53 +45 +52 +7 +32 +37 +6 +23 +58 +18 +27 +54 +40 +43 +7 +44 +18 +20 +64 +57 +45 +34 +17 +31 +59 +35 +10 +26 +61 +63 +25 +42 +48 +22 +16 +40 +9 +46 +33 +24 +65 +51 +12 +26 +29 +51 +0 +57 +19 +38 +19 +14 +62 +63 +56 +65 +25 +8 +13 +36 +11 +3 +11 +30 +8 +3 +41 +43 +4 +39 +1 +2 +55 +34 +46 +14 +48 +40 +21 +26 +24 +52 +43 +16 +39 +12 +44 +62 +10 +59 +42 +36 +49 +22 +4 +64 +17 +33 +26 +47 +11 +54 +55 +11 +56 +17 +1 +22 +45 +57 +31 +47 +34 +50 +29 +7 +0 +45 +21 +35 +41 +53 +3 +38 +8 +37 +30 +32 +6 +38 +58 +2 +65 +28 +39 +5 +51 +19 +61 +20 +59 +61 +5 +60 +13 +63 +65 +9 +28 +18 +14 +25 +37 +24 +27 +29 +15 +23 +16 +60 +31 +65 +43 +24 +32 +1 +8 +27 +54 +12 +36 +45 +5 +55 +37 +17 +3 +61 +22 +20 +1 +42 +10 +53 +62 +41 +11 +20 +30 +38 +35 +28 +58 +14 +9 +64 +50 +15 +48 +60 +52 +63 +44 +13 +49 +34 +33 +17 +29 +51 +26 +39 +7 +19 +34 +47 +23 +25 +59 +2 +46 +40 +18 +53 +6 +21 +4 +63 +28 +56 +21 +0 +22 +57 +47 +41 +29 +14 +5 +34 +58 +11 +64 +1 +38 +48 +18 +35 +47 +40 +16 +19 +0 +44 +51 +23 +21 +4 +65 +10 +26 +8 +3 +1 +59 +2 +24 +42 +57 +37 +56 +30 +24 +60 +22 +20 +16 +25 +47 +6 +31 +49 +63 +32 +58 +2 +17 +43 +7 +45 +46 +52 +3 +63 +11 +12 +52 +9 +53 +39 +28 +33 +62 +20 +54 +12 +13 +32 +5 +15 +61 +27 +28 +36 +25 +50 +55 +38 +6 +52 +15 +64 +49 +34 +50 +13 +51 +33 +27 +16 +4 +57 +21 +32 +5 +31 +62 +63 +27 +60 +55 +59 +26 +25 +18 +41 +19 +43 +17 +40 +58 +12 +20 +10 +10 +40 +47 +1 +8 +3 +36 +28 +56 +11 +39 +42 +58 +30 +22 +14 +36 +23 +44 +48 +54 +7 +26 +24 +2 +37 +13 +35 +0 +9 +2 +23 +43 +46 +46 +5 +49 +0 +42 +65 +61 +45 +53 +29 +42 +12 +7 +54 +41 +47 +2 +28 +44 +46 +55 +5 +18 +58 +1 +29 +52 +9 +21 +51 +62 +17 +24 +11 +13 +16 +26 +3 +25 +8 +14 +52 +27 +10 +33 +23 +10 +31 +30 +53 +55 +51 +22 +30 +65 +43 +50 +60 +31 +56 +2 +32 +36 +38 +0 +4 +39 +40 +45 +6 +34 +15 +57 +20 +61 +63 +49 +19 +48 +37 +59 +35 +64 +60 +34 +60 +25 +58 +43 +1 +20 +17 +2 +44 +54 +23 +65 +21 +47 +14 +0 +27 +51 +13 +57 +36 +16 +64 +42 +59 +45 +27 +18 +5 +26 +46 +41 +15 +39 +15 +4 +52 +10 +62 +33 +24 +40 +29 +31 +35 +54 +48 +8 +64 +4 +22 +63 +61 +6 +32 +52 +11 +16 +50 +9 +37 +46 +53 +7 +2 +17 +49 +12 +28 +38 +55 +56 +30 +10 +45 +3 +43 +62 +8 +56 +19 +49 +6 +25 +31 +50 +29 +35 +65 +10 +59 +25 +45 +5 +29 +58 +8 +16 +12 +36 +56 +15 +49 +6 +18 +21 +52 +19 +9 +19 +41 +15 +32 +48 +33 +23 +28 +42 +38 +14 +2 +4 +46 +8 +33 +55 +11 +51 +61 +30 +26 +61 +63 +44 +14 +62 +47 +7 +27 +53 +43 +38 +3 +0 +65 +26 +1 +17 +37 +64 +11 +16 +60 +7 +40 +57 +23 +22 +21 +46 +39 +24 +34 +13 +20 +54 +39 +0 +50 +29 +49 +10 +1 +48 +38 +28 +23 +46 +65 +24 +10 +61 +65 +33 +16 +31 +63 +47 +32 +62 +23 +20 +21 +41 +29 +45 +2 +8 +38 +53 +6 +30 +40 +26 +30 +18 +13 +64 +7 +9 +27 +34 +60 +24 +22 +57 +42 +44 +3 +0 +25 +52 +54 +35 +55 +37 +4 +15 +51 +5 +36 +43 +56 +59 +14 +58 +5 +19 +62 +11 +12 +17 +43 +3 +48 +17 +39 +25 +47 +38 +33 +6 +37 +49 +46 +37 +36 +1 +43 +21 +9 +15 +29 +64 +52 +16 +7 +53 +20 +40 +12 +42 +19 +30 +51 +59 +65 +34 +50 +26 +47 +11 +56 +24 +39 +28 +21 +5 +14 +60 +63 +31 +3 +32 +27 +61 +36 +18 +54 +58 +0 +57 +23 +62 +59 +44 +2 +22 +13 +51 +55 +30 +44 +16 +27 +60 +14 +45 +8 +41 +4 +8 +10 +35 +53 +27 +2 +37 +20 +3 +34 +23 +9 +39 +11 +21 +46 +45 +9 +7 +10 +25 +42 +17 +54 +28 +62 +44 +48 +65 +31 +25 +51 +2 +22 +57 +47 +6 +52 +1 +64 +56 +30 +18 +8 +32 +51 +49 +15 +43 +35 +55 +60 +58 +14 +22 +5 +3 +61 +50 +38 +19 +33 +8 +40 +59 +36 +13 +63 +26 +53 +4 +24 +38 +29 +30 +41 +60 +16 +18 +0 +12 +25 +15 +3 +36 +44 +60 +24 +6 +55 +16 +26 +20 +41 +37 +11 +60 +44 +22 +17 +54 +5 +14 +19 +28 +38 +32 +46 +34 +33 +11 +53 +4 +54 +27 +29 +59 +35 +56 +48 +58 +49 +51 +26 +9 +8 +7 +63 +29 +21 +62 +61 +42 +30 +5 +52 +0 +47 +19 +62 +40 +43 +1 +24 +33 +18 +45 +12 +23 +13 +50 +31 +65 +64 +39 +10 +57 +65 +2 +11 +8 +15 +12 +40 +45 +29 +18 +36 +46 +25 +4 +2 +41 +14 +38 +21 +61 +33 +26 +10 +7 +63 +52 +39 +31 +64 +1 +15 +54 +34 +41 +18 +63 +29 +56 +17 +51 +27 +43 +19 +57 +49 +53 +3 +47 +42 +46 +12 +30 +62 +7 +25 +60 +6 +54 +24 +43 +59 +35 +22 +28 +23 +55 +50 +2 +20 +44 +58 +3 +64 +37 +20 +48 +5 +13 +16 +65 +0 +9 +32 +54 +24 +8 +44 +34 +2 +64 +15 +62 +28 +15 +4 +5 +3 +44 +40 +0 +21 +53 +48 +31 +63 +9 +26 +33 +56 +25 +3 +11 +49 +6 +46 +57 +17 +39 +41 +27 +18 +36 +0 +11 +58 +52 +1 +32 +16 +50 +43 +45 +13 +28 +33 +23 +25 +49 +65 +42 +14 +38 +37 +30 +12 +29 +10 +6 +56 +51 +22 +35 +55 +47 +57 +60 +59 +20 +48 +65 +61 +19 +7 +33 +10 +22 +47 +61 +62 +4 +45 +48 +0 +14 +58 +55 +23 +54 +27 +59 +13 +59 +15 +6 +5 +46 +54 +35 +28 +1 +19 +57 +51 +17 +7 +24 +18 +53 +20 +33 +52 +26 +41 +40 +42 +31 +44 +12 +64 +12 +38 +46 +29 +9 +29 +16 +49 +11 +19 +25 +35 +13 +21 +21 +60 +30 +64 +8 +38 +39 +65 +50 +56 +26 +63 +32 +36 +11 +43 +37 +41 +2 +60 +34 +3 +5 +46 +27 +4 +28 +59 +24 +40 +0 +7 +62 +64 +42 +18 +42 +63 +54 +53 +21 +6 +15 +37 +31 +19 +23 +52 +58 +48 +17 +61 +10 +60 +65 +65 +22 +13 +12 +30 +10 +16 +9 +1 +34 +57 +55 +48 +32 +5 +57 +50 +40 +25 +20 +2 +26 +47 +41 +33 +49 +39 +51 +43 +38 +35 +8 +56 +38 +44 +54 +58 +29 +45 +3 +36 +11 +14 +63 +42 +59 +1 +53 +5 +14 +56 +49 +28 +55 +27 +6 +10 +35 +12 +43 +36 +18 +23 +52 +20 +51 +32 +46 +54 +0 +65 +30 +15 +50 +58 +26 +45 +12 +25 +62 +56 +48 +20 +8 +37 +63 +47 +17 +9 +14 +59 +40 +61 +11 +30 +39 +33 +52 +49 +23 +44 +27 +38 +34 +64 +60 +13 +7 +57 +21 +24 +35 +31 +41 +19 +2 +29 +4 +16 +10 +22 +54 +1 +3 +26 +29 +49 +37 +47 +22 +10 +60 +15 +6 +45 +4 +25 +54 +35 +17 +28 +57 +16 +2 +23 +24 +51 +33 +20 +59 +0 +33 +41 +55 +26 +21 +48 +50 +65 +3 +35 +18 +14 +34 +2 +38 +43 +46 +29 +25 +31 +7 +9 +27 +61 +44 +56 +36 +36 +1 +64 +51 +30 +8 +39 +43 +58 +62 +13 +5 +63 +32 +50 +7 +41 +40 +11 +12 +19 +52 +63 +42 +53 +30 +26 +24 +17 +11 +44 +31 +59 +6 +32 +22 +52 +23 +49 +47 +8 +16 +45 +3 +10 +63 +53 +46 +58 +56 +2 +42 +15 +57 +32 +4 +41 +22 +65 +55 +56 +19 +36 +37 +26 +29 +50 +54 +1 +30 +49 +43 +31 +62 +20 +64 +21 +18 +48 +40 +9 +38 +14 +61 +39 +13 +35 +12 +33 +18 +38 +27 +60 +34 +54 +8 +7 +51 +5 +0 +3 +25 +28 +4 +18 +37 +62 +52 +7 +44 +26 +40 +6 +42 +15 +46 +65 +47 +29 +49 +45 +36 +10 +25 +33 +53 +43 +27 +55 +4 +11 +16 +59 +54 +64 +0 +21 +58 +57 +14 +61 +3 +51 +28 +0 +50 +41 +13 +23 +61 +1 +42 +34 +39 +44 +2 +53 +63 +32 +20 +48 +24 +35 +52 +30 +17 +64 +38 +5 +19 +9 +56 +60 +8 +22 +12 +31 +42 +7 +36 +16 +26 +20 +10 +55 +38 +53 +13 +19 +65 +20 +49 +64 +44 +28 +3 +21 +47 +40 +58 +50 +15 +30 +22 +24 +37 +18 +63 +9 +35 +41 +27 +14 +5 +59 +57 +31 +33 +21 +43 +51 +56 +6 +24 +53 +60 +1 +29 +63 +12 +54 +8 +48 +23 +45 +17 +2 +23 +45 +25 +61 +18 +11 +62 +39 +32 +47 +35 +42 +33 +7 +52 +34 +0 +4 +46 +64 +45 +26 +58 +53 +37 +52 +12 +41 +27 +19 +30 +48 +60 +7 +56 +35 +24 +51 +27 +42 +26 +49 +20 +9 +0 +10 +39 +25 +40 +31 +17 +65 +46 +32 +11 +65 +34 +13 +43 +15 +36 +50 +57 +6 +59 +23 +4 +47 +1 +33 +22 +14 +21 +18 +5 +62 +44 +55 +2 +46 +63 +16 +17 +29 +54 +3 +28 +38 +61 +8 +28 +37 +65 +57 +23 +55 +43 +9 +17 +33 +39 +1 +30 +15 +46 +45 +26 +16 +22 +29 +31 +9 +2 +24 +14 +11 +47 +20 +7 +36 +4 +12 +8 +54 +38 +63 +10 +13 +46 +25 +41 +59 +39 +51 +10 +62 +60 +21 +5 +49 +35 +40 +48 +53 +61 +29 +11 +52 +19 +58 +42 +34 +50 +64 +18 +38 +44 +0 +34 +6 +27 +3 +17 +32 +58 +56 +33 +40 +60 +47 +30 +25 +48 +34 +22 +51 +50 +55 +2 +0 +20 +27 +34 +44 +45 +7 +8 +63 +37 +41 +59 +55 +35 +12 +18 +57 +1 +64 +46 +15 +3 +35 +14 +17 +13 +36 +24 +42 +38 +49 +23 +56 +5 +31 +29 +53 +16 +22 +62 +24 +0 +9 +61 +4 +48 +28 +32 +32 +21 +52 +10 +58 +65 +54 +45 +43 +19 +26 +11 +6 +2 +39 +55 +8 +25 +60 +27 +39 +32 +29 +31 +12 +5 +3 +14 +22 +50 +48 +61 +57 +59 +65 +30 +1 +11 +9 +51 +45 +20 +34 +10 +18 +2 +39 +4 +54 +42 +47 +36 +64 +38 +49 +27 +62 +13 +46 +5 +19 +24 +35 +58 +26 +21 +33 +40 +41 +15 +44 +53 +7 +63 +55 +9 +4 +0 +28 +6 +16 +53 +17 +12 +56 +52 +31 +1 +43 +37 +23 +48 +64 +49 +7 +55 +50 +57 +30 +36 +45 +59 +4 +29 +63 +59 +11 +0 +42 +14 +27 +51 +23 +56 +41 +38 +60 +47 +16 +44 +20 +12 +2 +5 +4 +21 +19 +40 +34 +43 +61 +31 +22 +35 +26 +45 +56 +65 +25 +13 +43 +32 +37 +10 +8 +17 +9 +0 +61 +39 +40 +6 +33 +15 +64 +54 +53 +18 +62 +52 +46 +1 +35 +24 +44 +3 +58 +28 +25 +48 +41 +49 +47 +1 +8 +52 +51 +14 +19 +24 +27 +18 +39 +49 +4 +63 +42 +59 +4 +33 +7 +16 +22 +50 +34 +15 +17 +30 +27 +60 +64 +36 +28 +35 +23 +45 +44 +53 +26 +12 +34 +55 +46 +10 +23 +56 +65 +37 +57 +58 +2 +13 +22 +43 +61 +18 +65 +41 +3 +0 +13 +38 +56 +25 +21 +58 +11 +63 +62 +31 +40 +1 +48 +29 +10 +2 +32 +20 +47 +54 +53 +5 +3 +12 +9 +52 +6 +18 +59 +19 +1 +7 +55 +0 +20 +3 +60 +52 +25 +23 +61 +57 +44 +58 +30 +17 +40 +8 +63 +64 +9 +13 +53 +38 +10 +62 +31 +54 +50 +26 +24 +22 +15 +14 +36 +35 +33 +48 +21 +37 +34 +56 +27 +49 +4 +5 +43 +55 +51 +45 +59 +42 +54 +12 +47 +35 +41 +2 +42 +39 +6 +45 +28 +65 +46 +47 +11 +16 +29 +32 +14 +3 +49 +46 +64 +8 +35 +39 +16 +23 +42 +53 +61 +3 +14 +21 +43 +20 +10 +63 +59 +3 +51 +4 +27 +13 +38 +33 +44 +60 +44 +61 +17 +0 +31 +40 +54 +57 +50 +30 +12 +26 +5 +62 +37 +36 +9 +19 +2 +17 +11 +56 +18 +25 +58 +47 +42 +52 +29 +1 +32 +28 +22 +9 +55 +41 +11 +15 +7 +65 +4 +29 +6 +48 +34 +45 +24 +8 +32 +0 +2 +54 +13 +11 +38 +44 +10 +49 +5 +51 +29 +55 +5 +41 +35 +55 +19 +40 +46 +47 +9 +36 +48 +51 +22 +45 +61 +1 +37 +10 +7 +26 +8 +60 +64 +43 +12 +52 +33 +56 +31 +53 +16 +33 +15 +65 +25 +57 +14 +44 +62 +20 +18 +58 +50 +8 +4 +29 +6 +63 +39 +59 +23 +42 +21 +24 +27 +32 +12 +3 +30 +23 +28 +17 +34 +25 +27 +21 +27 +43 +52 +23 +8 +1 +40 +59 +18 +20 +7 +20 +46 +45 +22 +12 +62 +45 +26 +19 +63 +37 +51 +28 +50 +26 +41 +24 +11 +9 +33 +61 +13 +43 +49 +60 +65 +30 +29 +19 +54 +2 +36 +10 +56 +17 +58 +6 +14 +44 +16 +0 +11 +34 +31 +56 +39 +3 +38 +35 +57 +4 +64 +55 +30 +53 +42 +61 +38 +48 +2 +54 +15 +47 +32 +5 +22 +21 +28 +16 +15 +46 +50 +39 +57 +23 +18 +62 +54 +25 +31 +55 +51 +47 +43 +28 +38 +12 +19 +4 +8 +38 +9 +0 +52 +27 +14 +5 +65 +40 +32 +36 +10 +58 +44 +39 +53 +34 +0 +21 +31 +48 +17 +9 +13 +1 +29 +30 +35 +41 +64 +33 +34 +16 +22 +49 +56 +2 +60 +59 +6 +24 +45 +37 +3 +22 +61 +40 +20 +11 +17 +7 +42 +4 +19 +26 +63 +43 +12 +20 +50 +8 +21 +44 +65 +51 +29 +9 +22 +7 +43 +65 +42 +54 +5 +30 +52 +16 +0 +46 +61 +6 +34 +45 +18 +4 +55 +41 +63 +16 +62 +15 +59 +24 +57 +53 +11 +28 +64 +35 +19 +30 +57 +58 +47 +36 +54 +13 +28 +26 +27 +39 +36 +37 +48 +19 +17 +60 +1 +31 +56 +48 +25 +33 +49 +2 +3 +40 +7 +59 +10 +25 +32 +14 +38 +23 +37 +6 +50 +17 +27 +8 +18 +36 +15 +1 +7 +0 +21 +29 +64 +62 +52 +4 +37 +47 +20 +49 +63 +40 +41 +45 +3 +28 +58 +39 +54 +33 +56 +51 +60 +55 +42 +62 +43 +53 +38 +40 +31 +35 +44 +57 +2 +11 +61 +10 +26 +46 +16 +32 +23 +48 +24 +9 +17 +13 +65 +19 +14 +35 +22 +34 +6 +30 +5 +59 +25 +12 +41 +49 +61 +0 +44 +23 +46 +60 +15 +24 +57 +27 +52 +59 +55 +43 +19 +41 +32 +16 +28 +8 +36 +31 +7 +20 +18 +25 +63 +11 +12 +23 +37 +3 +40 +33 +31 +48 +32 +22 +29 +53 +13 +42 +17 +1 +30 +51 +54 +49 +38 +4 +55 +26 +50 +9 +6 +34 +46 +58 +47 +21 +62 +2 +65 +39 +0 +17 +11 +56 +64 +5 +45 +44 +14 +29 +10 +35 +12 +6 +40 +43 +41 +32 +35 +57 +47 +48 +59 +45 +42 +17 +4 +1 +20 +19 +26 +51 +50 +11 +60 +27 +48 +43 +64 +49 +10 +5 +52 +39 +55 +1 +63 +41 +0 +11 +23 +56 +24 +12 +31 +25 +9 +54 +10 +46 +37 +38 +35 +16 +24 +16 +53 +65 +8 +62 +14 +36 +15 +21 +29 +61 +22 +3 +44 +33 +28 +34 +53 +30 +58 +13 +18 +7 +2 +12 +5 +1 +36 +40 +43 +58 +2 +9 +51 +30 +4 +60 +8 +36 +64 +44 +29 +25 +37 +3 +42 +11 +23 +29 +55 +30 +50 +14 +7 +49 +15 +18 +35 +59 +16 +65 +28 +40 +27 +20 +52 +37 +39 +13 +31 +10 +61 +47 +61 +34 +56 +62 +63 +0 +38 +21 +53 +6 +44 +55 +57 +50 +32 +17 +24 +33 +42 +27 +54 +41 +22 +48 +19 +46 +45 +26 +0.0292282 +0.0523879 +0.179964 +0.0538814 +-490.288 +775.784 +0.454294 +-0.212499 +-0.0125119 +-1386.8 +1990.33 +0.466706 +0.0243121 +0.583363 +0.0122115 +0.0254577 +0.0262199 +0.0162955 +-0.146798 +1.7046e-05 +0.0108515 +-0.0248233 +0.0447455 +-0.00931351 +0.154605 +0.0553696 +0.0378071 +0.487612 +0.368168 +0.016102 +-0.0787629 +0.392058 +-0.00188099 +-0.0526655 +0.222991 +0.28082 +-59.4381 +-0.225766 +-0.640284 +0.00205195 +-0.267855 +0.0251003 +-0.0304466 +0.0143036 +-0.021597 +0.0770916 +0.326135 +0.42174 +-0.649846 +-38.6059 +-0.0871747 +0.00488976 +-0.07465 +-0.00346643 +0.24295 +-0.11502 +5.06186 +0.0242525 +-385.481 +-490.205 +-0.00468958 +-0.0754533 +-0.0389695 +-0.466904 +-0.0201849 +-0.0134893 +-0.606937 +0.0108272 +-0.0116852 +0.0466086 +-1.20473 +-0.0204115 +0.124351 +0.0116595 +0.169042 +-0.136564 +-1.13048 +0.0507083 +567.912 +0.0982632 +0.0729971 +-0.11502 +1.7046e-05 +0.0262199 +-0.0248233 +0.179964 +-385.481 +-0.0125119 +-0.267855 +-0.0787629 +-0.00346643 +-0.00931351 +-0.0754533 +0.427368 +0.269971 +-0.00468958 +-38.6059 +0.0108515 +5.06186 +-0.0134893 +0.392058 +-0.649846 +567.912 +-59.4381 +-1.13048 +-0.212499 +-0.00188099 +-0.0871747 +-0.225766 +0.0243121 +0.00488976 +775.784 +0.42174 +0.583363 +0.403491 +0.00205195 +0.0122115 +-0.640284 +-490.205 +0.0143036 +0.0538814 +-490.288 +0.0507083 +0.0918258 +0.248216 +0.0292282 +0.272957 +0.016102 +0.0108272 +1990.33 +-1386.8 +0.0251003 +-0.0389695 +0.0162955 +-0.021597 +-0.136564 +0.363613 +-0.07465 +-0.0116852 +0.0242525 +0.154605 +-0.0201849 +-0.466904 +-1.20473 +0.0466086 +0.124351 +-0.0304466 +0.0447455 +-0.0204115 +-0.146798 +0.0278642 +0.0729971 +0.0116595 +0.394284 +-0.606937 +-0.0526655 +-0.237089 +-0.00637744 +0.00552773 +-388.557 +-0.00103177 +-1.02514 +0.0982647 +0.320816 +0.00236739 +0.0764976 +-0.00155356 +-388.557 +-0.0152097 +0.0024964 +0.207596 +-0.00553496 +-0.00778484 +-0.553346 +-0.0277104 +0.079704 +-0.0251003 +-0.00105151 +-0.00778484 +0.00131965 +-0.00105151 +-0.053135 +-0.237089 +-0.020746 +-0.0308651 +0.0181363 +6.17619e-05 +0.00131965 +0.08285 +0.037226 +-0.00155356 +-0.00220184 +-0.337238 +0.513225 +-0.553346 +0.000995693 +0.00455579 +0.00126122 +-0.00553496 +6.17619e-05 +-0.027228 +0.308368 +0.074426 +0.489823 +0.037226 +-0.027228 +-3897.53 +7797.07 +0.00126122 +-0.32666 +775.784 +0.00410436 +-0.053135 +0.347194 +-0.0251003 +0.0764976 +-0.0277104 +0.262994 +-0.337238 +-0.020746 +-1.02514 +-0.0465557 +0.485244 +-0.0152097 +-0.00103177 +0.0024964 +0.108702 +0.110987 +0.00236739 +0.05414 +0.110987 +-0.00304816 +0.074426 +775.784 +-0.00304816 +0.00836761 +6.56901 +-0.0455285 +-0.0169269 +0.548507 +-0.0920349 +-0.00548262 +0.387137 +-0.100585 +-1386.8 +-0.267855 +0.360423 +386.582 +0.41147 +0.0551165 +0.0372451 +490.312 +0.0389266 +-1.09651 +0.392058 +0.0186254 +0.114551 +-0.000773718 +-58.5567 +-0.0353681 +-5.37811 +0.369009 +-0.00341712 +-0.154083 +-0.0128916 +0.0504023 +0.027968 +0.176759 +0.0386458 +71.418 +-0.184547 +3060.65 +0.00304816 +0.0183094 +0.306412 +0.480116 +-0.0100963 +0.306128 +-710.327 +-1.13048 +-1066.01 +-490.356 +0.248145 +-0.0738641 +0.0144878 +-1533.01 +1.00508 +0.0052355 +0.0952533 +-0.0274214 +0.0549392 +710.379 +-0.0226327 +0.790862 +-0.053135 +38.6301 +0.468472 +0.358928 +-0.160836 +0.264895 +0.249666 +-0.00651007 +-0.0140005 +70.5226 +47.1606 +-0.0469509 +0.0141999 +0.313659 +0.490299 +-0.181382 +0.410699 +0.0469962 +0.304008 +-0.0828652 +0.0294307 +0.41656 +-0.0188819 +-5.37811 +-0.267855 +0.181698 +-0.0140005 +0.381262 +-58.5567 +-0.0469509 +70.5226 +0.160836 +-0.0274214 +0.286048 +0.362853 +-0.0455285 +0.41147 +0.264895 +-0.0828652 +-0.0738641 +-0.00341712 +0.249666 +-0.360423 +0.392058 +-0.0188819 +-710.379 +-386.582 +-0.00836761 +-0.0100963 +38.6301 +0.0389266 +-0.0294307 +0.0052355 +-47.1606 +0.306412 +0.0186254 +0.0994972 +-0.00548262 +-1386.8 +0.00651007 +71.418 +-710.327 +0.248145 +0.0920349 +-1.13048 +0.0226327 +-0.0372451 +490.312 +0.0353681 +-1.00508 +0.176759 +0.027968 +0.41656 +0.46413 +-0.0141999 +-0.0504023 +-0.100585 +0.262994 +0.154083 +0.330058 +-0.000773718 +-0.184547 +-1.09651 +-1066.01 +-0.0169269 +-0.181382 +1533.01 +0.0144878 +3060.65 +0.0183094 +0.131259 +-0.114551 +0.0128916 +-0.0549392 +0.053135 +-490.356 +6.56901 +0.242268 +-0.00304816 +0.959843 +0.0469962 +0.00311767 +-0.0161033 +-0.00441524 +0.242268 +0.074228 +-0.0404939 +-0.074228 +-0.234861 +389.148 +0.0077342 +-1.02514 +0.250792 +0.101339 +0.00035693 +-47.476 +-0.466904 +-0.380074 +0.335053 +0.132127 +-3897.23 +0.460779 +0.0136511 +0.00185284 +-0.0532046 +0.00248795 +0.466904 +0.117741 +-0.0262199 +-0.000119449 +-0.00248795 +-710.389 +-0.164121 +0.137856 +-0.0264454 +-0.0136511 +0.212123 +-0.0532046 +0.0404939 +0.00676233 +0.164121 +-0.00300295 +0.00200577 +-0.00185284 +-0.0064657 +0.00676233 +0.00305095 +0.00300295 +0.0262199 +-1533.01 +-0.460779 +710.389 +-474.485 +1533.01 +0.380074 +0.0504023 +-389.148 +-0.00441524 +8746.03 +0.0154433 +-1.02514 +-0.00311767 +0.485022 +-0.00305095 +-0.00052924 +0.000528505 +-0.0504023 +-0.0077342 +-0.00505008 +-0.117741 +47.476 +0.367349 +0.258363 +-474.485 +0.010514 +0.0161033 +-0.0154433 +-0.0738641 +-1.09651 +0.0052355 +-0.00548262 +0.0353681 +38.6301 +-0.184547 +-1.13048 +-386.582 +-0.0274214 +-0.100585 +-1066.01 +0.0226327 +-0.00304816 +6.56901 +0.0389266 +-1.00508 +-0.00341712 +-0.0372451 +-710.327 +0.027968 +0.248145 +-0.0188819 +-0.0455285 +71.418 +0.0183094 +-0.0469509 +-0.0828652 +-0.000773718 +0.0920349 +490.312 +0.24295 +-0.00836761 +-710.379 +0.160836 +-58.5567 +0.249666 +0.0186254 +-5.37811 +-0.0549392 +0.0128916 +-490.356 +0.41147 +0.053135 +0.162088 +-1386.8 +0.154083 +0.146815 +-0.267855 +-0.0140005 +0.176759 +0.11888 +0.306412 +-0.0294307 +-0.0504023 +0.380577 +0.00651007 +70.5226 +0.264895 +-0.0141999 +0.0144878 +0.192857 +-0.0169269 +-0.181382 +0.0469962 +1533.01 +-47.1606 +-0.360423 +-0.0100963 +-0.114551 +0.392058 +3060.65 +-0.0169269 +0.0697775 +-0.00548262 +0.0372451 +0.392058 +-0.0128916 +-0.0274214 +0.343451 +0.055301 +386.582 +0.0144878 +0.248145 +0.614401 +0.414901 +0.114551 +38.6301 +70.5226 +-0.181382 +-1386.8 +490.312 +0.410699 +0.0186254 +-58.5567 +0.39541 +-0.0353681 +-0.160836 +0.295374 +0.306412 +-0.00341712 +0.00836761 +0.0549392 +-490.356 +-710.327 +1.00508 +71.418 +0.0141999 +710.379 +0.249666 +0.418613 +-0.0188819 +0.00304816 +0.0389266 +-0.100585 +-1533.01 +-0.0469509 +-0.267855 +0.41147 +0.176759 +-0.053135 +-0.00651007 +-1.13048 +0.0469962 +3060.65 +-1066.01 +0.0504023 +0.264895 +-0.0455285 +-0.184547 +-0.000773718 +0.208374 +0.0994972 +0.360423 +0.0294307 +-0.0920349 +-0.0738641 +0.027968 +-0.0140005 +-0.0100963 +6.56901 +0.0183094 +-0.154083 +47.1606 +0.0052355 +-1.09651 +-0.0226327 +-5.37811 +0.435683 +-0.0828652 +0.0379107 +47.476 +0.0939786 +389.148 +0.363291 +8746.03 +-0.0262199 +0.0136511 +-0.00248795 +0.0811154 +0.117741 +0.000528505 +-0.0504023 +0.0077342 +0.179846 +0.242453 +-1533.01 +0.279248 +-0.00052924 +0.00676233 +-0.234861 +-0.466904 +0.0161033 +-0.00441524 +-0.0404939 +0.190531 +-3897.23 +-0.380074 +0.466904 +0.140512 +-389.148 +0.00300295 +0.00248795 +0.00185284 +-0.460779 +-0.0064657 +-0.074228 +0.526386 +-0.00305095 +0.164121 +-0.0532046 +-0.0154433 +0.128344 +1533.01 +-474.485 +-0.0161033 +0.429603 +-0.0077342 +-0.00441524 +-0.164121 +0.0504023 +-0.0532046 +0.00676233 +0.00305095 +0.263591 +0.00035693 +0.380074 +-474.485 +-0.00505008 +-47.476 +-0.00300295 +0.0154433 +-0.000119449 +0.074228 +0.0262199 +0.368446 +-0.00311767 +-0.00185284 +-1.02514 +0.00200577 +710.389 +-0.0136511 +0.149422 +-710.389 +-0.117741 +-0.0264454 +0.0404939 +0.460779 +0.010514 +0.412208 +0.00311767 +-1.02514 +-0.179964 +-0.146798 +0.126087 +-0.0251003 +-0.0242525 +5.06186 +-0.0787629 +0.649846 +-0.212499 +0.606937 +0.466904 +0.0116852 +-0.0134893 +385.481 +-490.205 +-0.0262199 +0.583363 +-490.288 +0.00931351 +-0.11502 +0.0447455 +0.290222 +0.0108272 +1.7046e-05 +0.0729971 +0.00205195 +0.495495 +-0.07465 +-0.136564 +0.0871747 +-0.0304466 +0.154605 +-0.021597 +-0.0108515 +0.392058 +-0.0143036 +0.42174 +-0.267855 +0.0389695 +-59.4381 +0.0538814 +-0.0116595 +1990.33 +-0.0243121 +0.37963 +0.209762 +0.00188099 +0.640284 +0.0162955 +-1.20473 +0.421646 +-0.0248233 +-0.00346643 +-1386.8 +0.29241 +-0.0754533 +-1.13048 +0.0526655 +-0.0125119 +0.0466086 +0.016102 +-0.00468958 +0.0122115 +0.0292282 +-775.784 +0.0507083 +-0.0201849 +0.0204115 +0.225766 +0.124351 +-38.6059 +0.00488976 +567.912 +-0.0248233 +-0.267855 +0.016102 +-0.0262199 +0.174421 +0.154605 +0.225766 +0.583363 +-0.0134893 +0.00931351 +-0.0304466 +0.392058 +0.0466086 +-0.136564 +-0.00468958 +0.0162955 +-0.179964 +0.42174 +0.0871747 +0.00205195 +385.481 +0.462404 +-0.11502 +0.254358 +0.606937 +0.0538814 +0.438809 +-0.0242525 +0.0389695 +-775.784 +0.0292282 +-0.0201849 +1990.33 +0.640284 +0.0526655 +-490.205 +-1.13048 +567.912 +-0.021597 +0.649846 +0.0476803 +-0.0787629 +0.0108272 +-0.0143036 +0.369009 +-59.4381 +-0.212499 +0.0116852 +0.409164 +-0.0251003 +-0.0125119 +0.00488976 +0.466904 +0.101353 +-1.20473 +-0.00346643 +-38.6059 +0.124351 +-0.146798 +0.0447455 +0.339747 +-0.0243121 +0.0507083 +1.7046e-05 +-0.0108515 +0.37813 +-0.0754533 +-1386.8 +0.0831705 +-490.288 +0.0204115 +0.0729971 +0.750544 +-0.07465 +5.06186 +-0.0116595 +0.00188099 +0.0122115 +0.0251003 +388.557 +0.237089 +0.074426 +-0.020746 +0.027228 +0.053135 +-775.784 +0.403972 +0.237089 +-0.110987 +0.125976 +0.000995693 +0.00304816 +0.352485 +388.557 +0.553346 +0.824757 +0.00553496 +-0.020746 +0.251176 +-0.00126122 +0.337238 +-0.00131965 +-0.037226 +0.053135 +0.00155356 +0.0152097 +-0.0764976 +0.231427 +-1.02514 +0.23765 +0.027228 +0.0024964 +0.0024964 +-0.0308651 +0.00155356 +-0.00131965 +-0.00637744 +-0.0764976 +0.553346 +0.00105151 +-0.32666 +-0.110987 +0.0367747 +0.277669 +0.0251003 +0.133862 +0.302013 +0.0277104 +0.00778484 +-0.00236739 +0.00552773 +0.00103177 +-3897.53 +0.00455579 +-0.0465557 +0.0277104 +6.17619e-05 +0.0152097 +0.448361 +0.228198 +-0.00126122 +7797.07 +6.17619e-05 +-775.784 +0.00553496 +-0.037226 +0.00778484 +-1.02514 +0.188373 +0.00103177 +0.074426 +0.00410436 +-0.00220184 +0.079704 +0.00304816 +-0.00236739 +0.00105151 +0.337238 +0.202538 +0.121793 +-0.196187 +-5.37811 +-0.160889 +660.493 +0.0945193 +6.65338 +710.389 +-0.740773 +0.0911485 +-0.177623 +-1066.01 +0.162896 +-59.4381 +0.461214 +0.475093 +-0.021597 +-0.0439697 +0.298479 +0.129153 +-387.225 +-0.0839861 +0.0540287 +-0.0339266 +0.457969 +-82.1391 +4392.03 +-81.0473 +0.161947 +-560.722 +-47.476 +0.1029 +-0.0740894 +0.00201871 +0.140634 +-0.0747833 +0.0196557 +-57.7288 +-7.00761 +-0.114823 +0.53653 +0.209259 +-388.557 +993.176 +-560.649 +-38.8699 +-0.0865195 +70.5226 +-1062.43 +0.00812452 +-0.0387499 +-62.6346 +-1585.35 +0.237089 +0.0244686 +-0.713025 +-0.337222 +-0.0171316 +-1.15425 +0.236371 +-0.0972213 +0.0547535 +-38.6059 +0.212123 +0.142988 +-0.195686 +0.0475908 +-0.167947 +-1.78233 +-0.00362438 +-0.136564 +71.418 +0.112973 +-0.0779926 +0.00403492 +-816.16 +-0.0387499 +0.461214 +0.1029 +0.475093 +0.53653 +0.00403492 +0.0540287 +-5.37811 +-0.196187 +0.0945193 +4392.03 +0.429603 +-0.0740894 +0.0600066 +-0.00362438 +0.0547535 +0.115869 +-0.0339266 +-0.0171316 +-1.78233 +0.344064 +0.108702 +-1062.43 +0.333412 +-0.0865195 +0.209259 +-38.8699 +-0.160889 +-38.6059 +-0.713025 +-0.0972213 +-1585.35 +0.250464 +-7.00761 +0.271461 +70.5226 +-387.225 +-388.557 +0.349431 +-57.7288 +6.65338 +-47.476 +710.389 +0.00812452 +0.140634 +-0.337222 +-560.722 +-816.16 +-0.0779926 +-0.167947 +-0.021597 +660.493 +0.248216 +0.466706 +-0.0747833 +-1066.01 +-81.0473 +0.142988 +-0.195686 +71.418 +-0.177623 +0.45571 +0.0831713 +-62.6346 +-1.15425 +-0.740773 +993.176 +-0.114823 +0.162896 +-0.136564 +-0.0839861 +-59.4381 +0.0244686 +0.237089 +-82.1391 +-0.0439697 +-560.649 +0.112973 +0.0475908 +-1.53545 +-0.0573311 +0.0165473 +0.00139059 +0.0360689 +0.0747833 +0.0844287 +0.295305 +-0.0727184 +-0.268728 +-629.339 +0.0360689 +-3897.53 +0.00266288 +0.0146399 +0.409516 +0.0487708 +-0.0335171 +-0.00568056 +-47.1606 +10005.4 +-0.190581 +0.146932 +0.0503289 +-0.248471 +-0.076313 +-629.339 +-0.248471 +-0.0302927 +-385.481 +0.368446 +0.00554188 +-0.076313 +0.225766 +0.0844287 +0.14123 +710.379 +710.379 +-3896.92 +0.126087 +-1.53545 +0.0146399 +-0.0330982 +-0.498551 +0.0303773 +0.00205525 +-816.667 +-0.190581 +-389.959 +0.380001 +-0.498551 +-474.485 +-389.959 +-474.485 +0.0747833 +-0.0283692 +0.225766 +-816.667 +993.176 +-0.000503376 +0.425486 +993.176 +-0.000503376 +-63.0733 +-0.0283692 +-0.0330982 +-63.0733 +-47.1606 +0.483819 +0.344064 +-385.481 +0.0503289 +-0.0465557 +0.00554188 +0.0165473 +0.00139059 +-0.0573311 +0.0155029 +-0.192594 +0.68789 +-0.101597 +-0.0262496 +0.269511 +-0.17412 +-0.00845262 +0.475093 +-0.122696 +560.313 +0.0421317 +0.0158984 +-0.0247343 +-0.07465 +0.254632 +-0.0244629 +-0.740773 +-0.0388056 +-0.0573311 +2253.17 +4.76759 +0.154605 +0.0570756 +0.0342053 +0.0175985 +0.726097 +-560.361 +0.251296 +0.173959 +0.102477 +-0.553346 +0.0938044 +-1.78233 +0.358646 +0.0466086 +0.0627483 +0.027228 +0.17083 +0.12819 +-0.0278594 +389.148 +-58.5567 +0.647462 +-0.0731863 +38.6301 +-0.0274214 +0.0034759 +-0.0503289 +0.00227585 +-1585.35 +-0.808359 +0.164371 +0.457969 +0.123827 +0.0301724 +-0.00139241 +0.0853305 +0.412208 +-638.199 +-0.0319406 +-58.2814 +0.0447455 +38.6878 +0.0532159 +0.249666 +-0.00293026 +0.123809 +385.877 +-776.518 +0.314416 +0.414901 +0.624486 +0.0121186 +-0.164121 +-0.0544554 +-0.0158984 +0.40486 +-0.0938044 +-0.726097 +-0.101597 +-0.0544554 +0.17083 +-0.0388056 +0.0247343 +-1.78233 +-58.5567 +0.0503289 +0.450026 +0.228198 +2253.17 +-1585.35 +0.154605 +-385.877 +0.553346 +0.475093 +0.0244629 +-0.00139241 +0.282392 +-0.027228 +0.123809 +-0.00845262 +0.0570756 +-638.199 +0.0342053 +38.6878 +-0.12819 +0.249666 +-389.148 +0.247902 +0.333412 +0.163459 +0.102477 +-0.0262496 +0.624486 +-0.123827 +0.0573311 +0.0459686 +-0.808359 +0.68789 +-0.0034759 +-0.0274214 +-58.2814 +-0.07465 +0.0175985 +0.254632 +-0.0278594 +0.0121186 +0.122696 +776.518 +-560.361 +-0.740773 +0.164121 +0.0469089 +-0.00293026 +-0.00227585 +560.313 +0.0301724 +0.210711 +0.428488 +-0.0319406 +0.0378071 +0.0447455 +4.76759 +0.173959 +0.425486 +-0.647462 +0.0421317 +38.6301 +-0.0532159 +0.0466086 +0.192594 +-0.269511 +-0.17412 +-0.0731863 +-1.53545 +0.038754 +-0.261059 +-0.649846 +0.0143036 +-3897.23 +-0.360423 +0.133462 +0.287196 +0.0547535 +-0.00505008 +0.00189813 +0.0442692 +7798.07 +776.518 +-388.987 +-0.0231839 +-0.0102927 +-0.0270483 +0.078835 +-0.038754 +0.0102405 +0.229911 +-0.00020328 +0.0102927 +0.0158796 +-0.00215333 +-0.052545 +0.0231839 +0.360423 +-0.0158984 +0.648808 +-0.648808 +0.0017499 +-0.0143036 +0.0748703 +-0.437385 +0.32913 +-0.0220231 +0.00215333 +-0.052545 +-776.518 +0.292424 +-1.53545 +-0.0547535 +-0.0863819 +0.327617 +0.0158984 +0.428712 +0.0121846 +-0.0339266 +0.414273 +386.582 +-0.020746 +0.0270483 +0.00568033 +-0.0442692 +-0.00189813 +-0.00020328 +-0.32913 +0.486843 +388.987 +-386.582 +0.078835 +-0.020746 +0.649846 +0.790862 +-0.027308 +-0.0017499 +-0.133462 +-0.00568033 +0.394964 +0.173842 +-0.00798257 +0.332129 +-3897.43 +0.261059 +0.0339266 +-638.199 +-0.726097 +0.0244629 +-58.2814 +-0.123827 +-0.0274214 +2253.17 +-0.12819 +0.0301724 +0.17083 +-1585.35 +-0.027228 +0.173959 +0.123809 +0.308979 +-385.877 +-0.17412 +0.224992 +-0.07465 +776.518 +0.475093 +0.055301 +0.249666 +560.313 +0.553346 +38.6301 +-0.0544554 +-0.0158984 +-58.5567 +-0.00139241 +0.0570756 +-0.0262496 +0.0421317 +-0.0731863 +-0.101597 +-0.0034759 +-0.00227585 +-0.00845262 +-0.0388056 +0.321173 +0.0573311 +0.0466086 +-560.361 +-0.808359 +-0.647462 +-0.0278594 +38.6878 +0.0121186 +0.0503289 +0.192594 +0.208424 +0.117342 +-0.0319406 +-389.148 +0.0447455 +0.0686423 +-0.00293026 +0.072212 +-0.0532159 +0.624486 +-0.269511 +0.68789 +0.0342053 +4.76759 +0.164121 +0.0247343 +0.190361 +-0.0938044 +0.254632 +0.102477 +-1.78233 +0.0771985 +-0.740773 +0.154605 +0.122696 +0.0175985 +38.6301 +-0.0247343 +0.406473 +-0.0544554 +0.0421317 +-1.78233 +0.0301724 +0.173959 +0.0158984 +-0.0244629 +-0.0573311 +-0.17412 +-776.518 +0.12819 +389.148 +-0.101597 +0.00227585 +0.123827 +-0.00845262 +-0.00293026 +0.027228 +-0.07465 +-0.192594 +0.0532159 +0.355883 +-58.2814 +0.0121186 +-0.0278594 +0.0034759 +0.647462 +-0.0731863 +0.0447455 +0.0570756 +0.0466086 +-0.0388056 +-0.164121 +0.254632 +-0.808359 +0.178313 +-0.0503289 +-0.553346 +-0.00139241 +-560.361 +0.468472 +0.102477 +-0.740773 +385.877 +0.0508306 +0.0063654 +0.17083 +0.0175985 +-638.199 +38.6878 +0.242453 +0.269511 +-0.122696 +-58.5567 +-0.0319406 +0.68789 +2253.17 +0.154605 +0.429692 +0.624486 +0.726097 +0.236371 +0.188373 +4.76759 +0.476369 +-0.0274214 +-1585.35 +0.123809 +-0.0262496 +560.313 +0.45571 +0.0938044 +0.475093 +0.22612 +0.249666 +0.179964 +0.0342053 +-0.0143036 +-0.360423 +0.0158984 +0.0553696 +-0.038754 +-0.648808 +-0.00020328 +-0.0863819 +-0.00215333 +-0.020746 +-0.0547535 +0.0143036 +0.149422 +0.078835 +-0.0270483 +0.133462 +0.462998 +-3897.23 +-386.582 +-0.0158984 +-0.649846 +-0.0017499 +0.261059 +-3897.43 +0.429927 +-0.052545 +0.0270483 +-0.00505008 +-0.020746 +0.109518 +0.0158796 +0.0102927 +-0.027308 +0.271461 +0.00568033 +-0.052545 +-0.0442692 +0.0231839 +0.0547535 +-0.0339266 +-0.00020328 +0.0063654 +0.0442692 +-0.0220231 +388.987 +-0.437385 +-0.133462 +0.0017499 +-1.53545 +776.518 +-0.32913 +0.0748703 +0.0102405 +-0.00798257 +-388.987 +0.0339266 +-0.00568033 +-0.00189813 +0.153932 +-1.53545 +386.582 +7798.07 +0.00189813 +0.078835 +0.456385 +0.360423 +0.141661 +-776.518 +0.32913 +-0.261059 +0.038754 +0.417864 +0.649846 +0.648808 +-0.0231839 +-0.0102927 +0.00215333 +-0.209259 +-0.112973 +-0.0547535 +0.0475908 +0.232282 +0.408476 +0.0747833 +660.493 +-993.176 +0.251296 +0.222991 +47.476 +-0.136564 +-1585.35 +0.0839861 +0.1029 +-0.114823 +-560.649 +0.0779926 +-38.6059 +-0.021597 +-0.0540287 +-0.337222 +0.452248 +4392.03 +62.6346 +0.324337 +0.196187 +-38.8699 +-0.0740894 +-7.00761 +0.279248 +0.474632 +-0.0387499 +0.53653 +-0.167947 +0.177623 +-0.195686 +-81.0473 +0.224992 +-0.142988 +-57.7288 +-0.0865195 +-0.00362438 +-560.722 +71.418 +-0.0439697 +-0.740773 +-5.37811 +-0.713025 +0.140634 +0.461214 +1.15425 +-0.0171316 +-0.0972213 +-0.00812452 +-1066.01 +0.0459686 +6.65338 +0.0244686 +70.5226 +0.331174 +0.00403492 +0.475093 +-1062.43 +0.0945193 +-0.160889 +0.450949 +-1.78233 +0.13479 +-59.4381 +-82.1391 +-0.237089 +388.557 +-710.389 +816.16 +-0.162896 +387.225 +0.0339266 +388.557 +0.35173 +-0.0740894 +1.15425 +-7.00761 +0.140634 +-0.167947 +0.349431 +0.475093 +0.0254577 +0.309991 +71.418 +-0.00362438 +-0.00812452 +-0.021597 +-57.7288 +-0.0972213 +0.0945193 +0.0747833 +0.0244686 +-0.195686 +6.65338 +-710.389 +-5.37811 +-0.0439697 +-0.237089 +-81.0473 +-0.0387499 +4392.03 +-0.136564 +-38.8699 +0.177623 +-0.112973 +-0.740773 +0.0839861 +-0.0540287 +0.00403492 +0.196187 +-0.337222 +0.53653 +0.0339266 +0.0475908 +-0.162896 +-0.0865195 +-59.4381 +-993.176 +0.0894851 +-1585.35 +-0.160889 +816.16 +-1.78233 +660.493 +-1062.43 +-0.142988 +-560.722 +-0.713025 +0.461214 +0.281392 +0.300643 +62.6346 +0.0779926 +-1066.01 +0.0775577 +47.476 +0.1029 +-82.1391 +387.225 +-560.649 +0.211373 +-38.6059 +-0.0171316 +-0.114823 +0.477351 +-0.0547535 +70.5226 +-0.209259 +0.354338 +-0.0747833 +-0.0747833 +-710.379 +0.00205525 +0.0283692 +-474.485 +0.190581 +0.0165473 +-0.0503289 +-0.0465557 +385.481 +0.387217 +0.00266288 +-0.0844287 +-0.0360689 +-0.00139059 +-629.339 +-3896.92 +-474.485 +0.248471 +816.667 +-0.00554188 +-710.379 +-0.00139059 +-0.0302927 +0.339694 +-993.176 +0.190581 +10005.4 +0.000503376 +816.667 +0.000503376 +-0.0360689 +-0.0844287 +389.959 +0.202756 +-0.00554188 +389.959 +-0.0335171 +-0.076313 +-0.268728 +0.480201 +0.0155029 +0.0165473 +0.0968143 +-0.00568056 +-0.076313 +47.1606 +0.498551 +0.392275 +-0.0503289 +0.334925 +-0.0727184 +63.0733 +0.0573311 +47.1606 +-1.53545 +-0.225766 +-1.53545 +0.0330982 +-0.0146399 +0.248471 +0.0573311 +-3897.53 +-993.176 +0.0330982 +0.498551 +-629.339 +-0.225766 +0.0283692 +-0.0146399 +385.481 +63.0733 +0.314077 +-57.6025 +0.35708 +-0.100585 +0.380001 +0.0678189 +0.0301724 +-0.0306797 +0.190581 +776.404 +-0.462379 +-391.559 +-1108.36 +-391.5 +0.248145 +0.0425194 +0.0214094 +-0.183225 +0.00205195 +-0.57432 +-0.195686 +-38.8699 +0.0676204 +0.121913 +0.0944766 +-385.371 +0.685305 +-0.337238 +-0.0919603 +-0.00866082 +-0.871894 +0.0645324 +-0.0252203 +-0.0778239 +0.254632 +-0.037226 +0.0421279 +0.0839516 +0.487793 +0.41147 +0.566816 +0.348596 +0.0175985 +-0.11502 +-0.000773718 +0.157706 +0.456385 +-0.0667222 +-389.959 +0.18314 +-0.0270483 +0.116439 +2.89767 +-0.0404939 +0.421527 +-38.6618 +0.0627483 +0.218125 +-0.0164578 +1607.4 +-1.70748 +5.06186 +-0.215989 +0.451009 +469.247 +0.0234001 +-0.406433 +0.0348205 +-0.20399 +-57.7288 +0.648808 +0.102477 +-0.0141539 +0.460779 +-0.00362438 +-0.0304466 +0.277406 +0.282392 +-389.959 +0.0918258 +-0.337238 +0.0678189 +469.247 +-0.0919603 +-0.0404939 +0.190581 +0.057522 +-0.57432 +-0.462379 +-391.559 +776.404 +-0.0252203 +0.450072 +-0.0141539 +0.348596 +0.320337 +-57.7288 +-1.70748 +0.0944766 +-0.000773718 +0.254632 +-0.11502 +-385.371 +0.128344 +-0.0778239 +0.566816 +0.248145 +-0.871894 +0.250324 +0.648808 +0.0645324 +2.89767 +-38.6618 +1607.4 +0.3416 +5.06186 +-1108.36 +-0.215989 +0.0301724 +0.685305 +0.406473 +-0.20399 +-0.100585 +0.451009 +-38.8699 +-0.0304466 +-0.037226 +-0.406433 +0.30809 +0.102477 +0.00205195 +0.0214094 +-0.00362438 +0.0831713 +-0.0270483 +0.0303773 +-0.183225 +0.460779 +-0.0164578 +0.0348205 +0.0711856 +0.337179 +0.0839516 +0.0421279 +0.162088 +0.18314 +-0.195686 +-0.0306797 +0.121913 +-391.5 +-57.6025 +0.208424 +0.41147 +0.314077 +0.0711145 +0.0175985 +0.0425194 +0.0234001 +0.421527 +-0.00866082 +0.490538 +-0.0667222 +-0.878158 +0.0697438 +0.447265 +-0.0132897 +0.0697438 +-388.46 +0.0352938 +-0.052545 +-0.0034759 +0.079704 +0.00866082 +-0.878158 +-0.0732764 +-0.0532046 +0.183044 +0.208338 +-0.0920349 +0.269511 +-0.223009 +-0.0243121 +-0.0532046 +0.290222 +0.00527268 +0.0111965 +0.0930565 +0.288978 +0.0793758 +-0.606937 +-0.296703 +0.117342 +-0.0415334 +0.000271006 +-387.225 +0.269511 +-0.0335171 +0.292424 +-0.052545 +-0.0243121 +776.404 +0.468524 +-3897.62 +-3896.92 +-388.46 +0.41415 +0.00552773 +0.0352938 +-0.223009 +-0.182641 +-0.0597699 +-0.606937 +-0.0136747 +0.196187 +-0.182641 +0.112376 +-0.0132897 +0.128488 +-0.0227143 +0.11179 +776.404 +0.37813 +0.00866082 +0.00527268 +-0.0415334 +0.289221 +0.196187 +0.107049 +0.331053 +-0.0549392 +7796.54 +-0.0227143 +0.320337 +-0.0034759 +-387.225 +0.0793758 +0.0930565 +-0.325255 +-0.0920349 +0.0111965 +-0.0136747 +-0.0549392 +-0.325255 +0.0138805 +63.0733 +0.0793758 +0.0793485 +0.306412 +-0.183225 +0.289745 +83.888 +0.42174 +-7.00761 +-82.1391 +0.566816 +0.0277104 +4.4773 +0.232665 +-0.0738641 +0.0584443 +-816.667 +0.56814 +-0.0077342 +-1062.43 +0.249522 +3704.86 +0.11888 +0.413315 +-0.383596 +-0.154137 +-1108.36 +0.583363 +0.155346 +-58.2814 +0.380074 +0.162958 +0.173959 +-0.32913 +-0.361101 +93.1075 +0.221032 +386.539 +-1033.72 +-0.0278594 +0.308185 +0.0835317 +0.110987 +-391.91 +1.21083 +0.477955 +-0.271408 +-0.137338 +0.435705 +0.559866 +-1.70748 +926.149 +-0.146798 +91.7568 +0.11179 +0.264895 +391.885 +-9.20235 +-1020.42 +0.310543 +-0.0930565 +0.250645 +-0.0526068 +0.849592 +-0.0787629 +-56.913 +388.987 +-492.682 +-0.00589175 +38.6878 +-81.0473 +0.212446 +0.279587 +-0.0277623 +0.409516 +38.8 +0.168613 +6.56901 +0.0277623 +-492.682 +0.394284 +0.383596 +0.0835317 +91.7568 +-1062.43 +-83.888 +0.32913 +0.219142 +0.168613 +-0.110987 +0.0793485 +-58.2814 +391.885 +0.232665 +-1108.36 +-82.1391 +-0.0793758 +-0.0277104 +0.376735 +3704.86 +0.0930565 +-0.0526068 +-0.162958 +0.56814 +-0.380074 +-0.849592 +0.559866 +0.413315 +0.173959 +-926.149 +-0.0278594 +93.1075 +1033.72 +-7.00761 +0.263036 +-1.70748 +0.0077342 +0.394564 +0.264895 +38.8 +-391.91 +0.489823 +-0.00589175 +-1.21083 +0.368168 +-388.987 +0.361101 +-0.0584443 +0.221032 +-0.271408 +-0.154137 +816.667 +4.4773 +0.0939786 +6.56901 +-0.146798 +0.39027 +38.6878 +-1020.42 +0.452248 +-386.539 +0.42174 +-81.0473 +-0.212446 +-0.183225 +0.583363 +-56.913 +0.566816 +-9.20235 +0.515715 +0.306412 +-0.137338 +-63.0733 +0.418613 +-0.0787629 +-0.0738641 +-0.0064657 +-3897.08 +62.6346 +-84.5177 +0.0317089 +-843.805 +-3897.43 +0.720309 +385.877 +0.0803713 +1033.72 +-0.110541 +-0.00516548 +-0.0909791 +-0.125467 +0.253096 +-0.0317089 +0.114551 +-0.201006 +0.495264 +-0.114551 +-629.339 +0.1858 +0.0771985 +-1033.72 +0.216071 +-389.812 +0.255761 +0.39541 +-0.0115568 +-0.123827 +-0.0863819 +0.0183012 +0.110541 +84.5177 +0.0252203 +0.332129 +0.0584443 +-0.0308923 +-0.878158 +0.640284 +-0.878158 +-0.411145 +0.448458 +0.121913 +0.103225 +0.00516548 +816.16 +-385.877 +0.368963 +0.0871747 +-926.189 +-0.121913 +-0.0252203 +0.0556577 +0.411145 +-816.16 +0.107049 +10743.1 +0.479698 +-0.640284 +0.179226 +0.123827 +-843.805 +0.429692 +-629.339 +-0.125467 +-0.0183012 +-0.0427843 +0.035592 +0.0711145 +0.010514 +-62.6346 +926.189 +0.074426 +0.480116 +0.277669 +-0.0584443 +0.179846 +1.00508 +0.478469 +-0.103225 +-1.00508 +389.812 +-0.0871747 +0.074426 +-0.216071 +0.395085 +93.1075 +-63.0733 +-0.00589175 +0.232665 +-1062.43 +0.0930565 +0.0676204 +-0.154137 +38.8 +0.173959 +0.244056 +-7.00761 +-386.539 +0.361101 +-0.146798 +0.0999725 +-56.913 +-9.20235 +0.413315 +0.281392 +0.306412 +0.221032 +0.32913 +-1108.36 +0.468524 +-926.149 +-0.110987 +0.0793485 +0.0835317 +0.133862 +-0.212446 +0.229911 +-0.0787629 +-81.0473 +-1020.42 +4.4773 +-492.682 +0.232462 +0.566816 +-0.849592 +-0.0584443 +0.264895 +0.583363 +0.0107437 +0.232282 +-0.0793758 +0.0277623 +-0.162958 +-0.0738641 +-83.888 +-0.380074 +91.7568 +3704.86 +1033.72 +6.56901 +0.418529 +0.168613 +-0.0277104 +0.383596 +391.885 +-0.0526068 +0.132127 +0.559866 +38.6878 +0.164035 +-388.987 +-1.21083 +-0.137338 +0.0077342 +0.56814 +-82.1391 +-0.271408 +0.0390101 +0.42174 +0.376735 +-58.2814 +0.295305 +-0.183225 +0.411123 +-1.70748 +-391.91 +0.720309 +-0.0278594 +816.667 +-0.0278594 +0.307602 +3704.86 +-0.383596 +-56.913 +0.566816 +-1033.72 +0.427368 +0.380074 +391.885 +0.0835317 +-81.0473 +93.1075 +91.7568 +-0.0077342 +0.0793485 +-1020.42 +0.287196 +0.306412 +0.559866 +0.0775577 +388.987 +0.42174 +38.8 +0.583363 +-0.361101 +0.162958 +-0.0277623 +0.0277104 +0.153932 +-492.682 +926.149 +-0.0930565 +0.39027 +4.4773 +-816.667 +-0.0787629 +-0.271408 +0.849592 +0.173959 +0.413315 +-0.154137 +0.56814 +0.0173523 +386.539 +-1062.43 +-0.00589175 +0.261401 +-0.183225 +-0.32913 +0.0584443 +-0.137338 +0.0793758 +0.232665 +6.56901 +-58.2814 +-1.70748 +0.224966 +63.0733 +-1108.36 +1.21083 +0.110987 +-9.20235 +-0.0526068 +38.6878 +0.287869 +0.264895 +0.408476 +-0.0738641 +0.221032 +-391.91 +0.212446 +-82.1391 +-0.146798 +-7.00761 +0.168613 +83.888 +-0.0115568 +-0.201006 +-629.339 +0.010514 +-0.121913 +0.216071 +0.074426 +-0.0183012 +0.269971 +-843.805 +-0.00516548 +-385.877 +-0.878158 +-843.805 +0.103225 +-0.123827 +385.877 +-0.0871747 +-3897.08 +-0.0317089 +-629.339 +816.16 +-0.114551 +0.0556577 +0.0871747 +-0.878158 +-0.0064657 +0.313659 +-0.640284 +-0.0427843 +0.0181363 +0.157706 +-389.812 +-0.216071 +926.189 +-0.0308923 +1033.72 +0.121913 +-0.411145 +62.6346 +0.109518 +0.163459 +0.0711856 +0.0334143 +-1.00508 +-1033.72 +0.00516548 +0.387547 +10743.1 +0.339813 +0.074426 +-0.0863819 +389.812 +1.00508 +-926.189 +84.5177 +0.411145 +0.114551 +0.0183012 +0.302013 +-62.6346 +0.448495 +0.640284 +-0.125467 +-0.103225 +0.263036 +0.0252203 +-0.125467 +-3897.43 +-0.110541 +0.0911485 +-816.16 +0.212001 +0.485022 +0.123827 +0.0317089 +0.0584443 +-0.0584443 +-84.5177 +-0.0252203 +-0.0909791 +0.110541 +-0.0645324 +0.248145 +0.0425194 +0.102477 +0.0944766 +-0.0778239 +469.247 +0.57432 +-0.195686 +0.0348205 +1607.4 +-1.70748 +0.0301724 +-0.100585 +0.421527 +-57.7288 +0.0252203 +0.0404939 +-0.183225 +0.871894 +0.0839516 +0.477955 +2.89767 +-0.215989 +0.462379 +0.331053 +-391.5 +0.254632 +-0.0421279 +0.0175985 +0.467753 +0.0270483 +-0.0667222 +-0.0919603 +-0.00362438 +-0.648808 +0.462404 +-0.11502 +0.484358 +385.371 +0.00205195 +-0.460779 +0.41147 +0.0214094 +0.566816 +0.20399 +0.337238 +0.18314 +0.327433 +0.455083 +-1108.36 +-38.8699 +-0.190581 +0.901432 +0.354338 +0.406433 +0.0678189 +0.685305 +-0.000773718 +0.00866082 +-391.559 +0.037226 +-0.0306797 +0.250464 +-776.404 +0.454294 +5.06186 +0.207596 +389.959 +-0.0141539 +-38.6618 +0.311233 +0.250792 +0.435713 +-0.0304466 +0.451009 +-0.314077 +0.0234001 +-57.6025 +0.0164578 +-0.121913 +-0.0667222 +-0.195686 +0.41147 +-0.0919603 +0.406433 +385.371 +0.308368 +-1108.36 +-0.0421279 +-57.6025 +0.148907 +-0.460779 +0.0301724 +0.685305 +-0.0304466 +0.0252203 +0.0348205 +-0.11502 +-38.8699 +0.21045 +0.871894 +-0.648808 +-391.5 +0.337238 +-0.00362438 +0.254632 +0.00866082 +-0.000773718 +-391.559 +0.0404939 +-0.190581 +0.0607212 +-0.183225 +5.06186 +469.247 +389.959 +0.438809 +0.261401 +0.566816 +0.0164578 +0.421527 +0.0425194 +-57.7288 +0.395085 +-0.314077 +0.18314 +0.57432 +0.0234001 +-1.70748 +0.462379 +0.037226 +-0.121913 +-0.0306797 +-0.0645324 +0.00205195 +0.248145 +-0.0141539 +0.451009 +-38.6618 +-0.100585 +1607.4 +0.0175985 +-0.215989 +0.0270483 +2.89767 +0.0944766 +0.0678189 +0.102477 +-0.0778239 +0.0214094 +0.20399 +-776.404 +0.0839516 +0.303138 +-776.404 +0.223009 +-0.00866082 +0.0415334 +0.312212 +0.0243121 +-0.052545 +0.173842 +0.00552773 +-0.0132897 +0.0415334 +-3896.92 +-0.0597699 +387.225 +-3897.62 +-0.0335171 +0.0243121 +-0.0930565 +-0.0111965 +-0.196187 +-0.0352938 +0.182641 +0.247902 +0.0062741 +0.325255 +0.0697438 +0.299749 +0.310543 +-0.269511 +-0.0532046 +-0.296703 +388.46 +-0.0132897 +0.0034759 +0.0227143 +0.0853305 +0.0920349 +-0.0111965 +0.606937 +0.128488 +-776.404 +-0.00866082 +0.325255 +-0.878158 +-0.0930565 +7796.54 +0.25875 +-0.00527268 +0.0379107 +0.0136747 +0.330058 +387.225 +0.0136747 +0.223009 +0.0920349 +-0.878158 +0.320088 +0.079704 +-0.269511 +0.112376 +0.606937 +0.182641 +0.464554 +0.0138805 +0.0549392 +0.0982647 +-0.052545 +-0.00527268 +-0.196187 +-0.0793758 +-0.0732764 +-0.0352938 +0.0697438 +-0.0793758 +0.750544 +388.46 +0.0549392 +0.0227143 +0.14843 +-0.0532046 +0.389811 +0.0034759 +0.216323 +0.146815 +-38.6618 +93.1075 +0.0375201 +0.0803713 +0.182641 +-2.30787 +0.0729971 +-112.779 +0.490538 +-0.521198 +-0.117741 +926.189 +-101.139 +0.140512 +0.17083 +6.65338 +4334.65 +-1021.61 +0.624486 +-938.113 +-0.184547 +0.68789 +0.324337 +-38.8124 +0.476369 +-0.0125119 +0.123809 +-0.0481398 +0.164371 +-84.5177 +-941.584 +0.0214094 +0.392275 +91.7568 +-1.81114 +0.160817 +0.483819 +0.0764976 +-0.0828652 +-1.54 +0.0161033 +0.901432 +-102.357 +0.824757 +-47.2244 +0.0100031 +-9.20235 +-388.46 +0.355977 +0.0111675 +0.0960574 +-0.248471 +0.110102 +-0.197646 +0.0697775 +-1020.42 +-385.388 +1.25534 +1069.1 +-0.181382 +-1.20473 +0.0409264 +0.447265 +0.0507083 +-0.133462 +1037.52 +-1.5288 +0.0152097 +0.450026 +-0.181416 +-0.00548262 +-1.33531 +-11.8759 +0.0330982 +-0.337222 +-0.0439697 +0.470657 +-1330.96 +-57.6025 +-0.0306797 +-0.0972213 +-0.0231839 +-919.993 +1.25534 +0.0507083 +0.0375201 +0.495264 +-941.584 +-0.0125119 +-1.20473 +-938.113 +0.441725 +-9.20235 +0.0330982 +-0.521198 +0.214227 +-38.6618 +0.254358 +-0.181416 +-2.30787 +-0.0306797 +0.68789 +-1020.42 +-1.5288 +-0.197646 +926.189 +0.110102 +0.480201 +-0.133462 +-0.337222 +0.0960574 +-84.5177 +-1.54 +0.0764976 +-0.117741 +1069.1 +-385.388 +-0.0828652 +91.7568 +-1.81114 +-388.46 +0.411123 +0.17083 +6.65338 +0.0111675 +-0.181382 +0.0729971 +93.1075 +0.0214094 +0.0100031 +0.35708 +-0.0439697 +-102.357 +-1.33531 +-0.0481398 +-0.00548262 +0.487612 +-57.6025 +-47.2244 +-101.139 +0.182641 +-11.8759 +4334.65 +-0.184547 +0.123809 +-38.8124 +0.258363 +1037.52 +-1330.96 +-112.779 +-1021.61 +-0.248471 +-919.993 +0.0161033 +0.624486 +0.358069 +0.0152097 +-0.0972213 +-0.0231839 +0.166804 +-0.154083 +0.40851 +0.078835 +0.530108 +-385.371 +0.281379 +11761.3 +-0.0645324 +0.0353681 +1069.1 +0.40851 +0.197646 +0.441725 +1069.1 +0.179964 +0.530108 +0.177623 +-0.0242525 +0.647462 +-843.805 +-0.471714 +-390.383 +-0.12819 +-0.154083 +-3896.99 +0.078835 +0.177773 +-1.15425 +0.177773 +0.647462 +0.418529 +0.226929 +0.374645 +-0.391224 +-0.0645324 +-4.19182 +-3897.62 +1.00606 +-0.00637744 +-1136.29 +-385.371 +0.0143161 +-83.888 +0.474632 +0.00676233 +-0.0727184 +0.0372216 +-0.471714 +926.149 +0.490299 +-843.805 +926.149 +0.0372216 +0.160817 +-0.12819 +-1022.1 +-1022.1 +0.179964 +-113.893 +0.00266288 +-0.0765286 +-1136.29 +0.0270346 +-0.0308651 +0.177623 +-1.15425 +-390.383 +-113.893 +-83.888 +-1.43166 +0.0469089 +0.249522 +0.41606 +0.14123 +0.197646 +0.0811154 +-1.43166 +0.0353681 +0.00676233 +-0.0242525 +-0.0732764 +1.08711 +-56.913 +0.08285 +1.25534 +0.0442692 +0.387137 +-0.0141539 +0.0283692 +-0.0754533 +2374.33 +-0.00236739 +0.53653 +-1.33531 +-1.81114 +0.421646 +-0.0455285 +-0.00346643 +-0.0667222 +0.159235 +0.261059 +-48.6372 +38.8 +-0.158027 +0.0593587 +-941.473 +1.62894 +0.232665 +0.250324 +-0.403487 +-0.00553496 +0.140634 +-0.144843 +-0.177773 +-0.0140005 +0.0781599 +-0.0248233 +0.955785 +384.764 +-0.0526068 +-0.00139241 +0.526386 +-0.103225 +0.227299 +937.916 +4.76759 +0.613513 +0.0227143 +38.1621 +0.698114 +0.0341797 +-0.498551 +0.211373 +-0.074228 +-1.09651 +-0.123433 +-0.0890923 +0.0143161 +-0.0731863 +0.18314 +-0.00311767 +-1016.59 +-0.17162 +-1330.96 +0.0945193 +0.482601 +-0.325255 +0.081092 +-0.0469509 +0.451009 +0.530108 +389.812 +0.244056 +-776.648 +0.143585 +0.0121186 +0.072212 +-0.212499 +0.461214 +0.18314 +0.0121186 +-0.0469509 +-1.33531 +-0.0593587 +0.113175 +-0.0141539 +-0.0455285 +-48.6372 +4.76759 +0.288978 +-0.0442692 +776.648 +-1.81114 +0.23765 +0.0781599 +0.359395 +0.461214 +-0.261059 +0.488867 +0.367349 +-0.0283692 +0.22612 +-56.913 +0.177773 +0.103225 +-1330.96 +0.451009 +-0.0667222 +0.00553496 +0.158027 +-1.09651 +38.1621 +38.8 +0.368963 +0.17162 +0.325255 +-384.764 +937.916 +-0.144843 +-941.473 +-0.123433 +-0.0227143 +-0.0248233 +0.00311767 +-0.0140005 +0.955785 +-389.812 +0.0945193 +0.128722 +-0.403487 +0.613513 +0.232665 +0.074228 +0.143585 +-0.00346643 +-0.530108 +-0.00139241 +-1.08711 +2374.33 +0.159235 +-0.0754533 +0.218125 +0.484358 +-0.0731863 +1.25534 +0.140634 +0.498551 +0.53653 +0.0890923 +-0.0526068 +-1.62894 +0.482601 +-1016.59 +-0.212499 +0.0341797 +0.428354 +0.00236739 +6.17619e-05 +-0.00052924 +0.726097 +0.162896 +776.648 +-0.0960574 +0.478469 +-0.00227585 +-0.0481398 +0.0481398 +0.3416 +0.160836 +6.17619e-05 +7800.77 +-0.076313 +-1.43166 +0.0839861 +-0.260267 +-0.0421279 +-0.0132897 +0.0526655 +0.343451 +0.308417 +-0.0333222 +-776.648 +-0.0277623 +0.0567782 +0.0108515 +0.314416 +389.721 +0.406433 +0.328101 +0.190361 +0.410233 +-3897.08 +-3897.27 +0.0748703 +0.260267 +386.539 +0.0593587 +0.00227585 +0.010797 +0.397309 +-0.0296088 +0.304008 +-1.43166 +-0.0593587 +0.086255 +0.00201871 +0.0277623 +-0.0296088 +-0.00651007 +0.0421279 +0.0333222 +0.00651007 +0.044391 +-0.406433 +0.123996 +-0.142526 +-0.0132897 +-0.162896 +-386.539 +-0.076313 +-389.721 +-4.55593 +0.513225 +0.0158796 +1.10347 +-0.010797 +-0.160836 +-0.308417 +0.0960574 +0.141661 +-0.397309 +-0.0264454 +-0.0839861 +-0.726097 +0.217768 +-0.0526655 +-0.0108515 +-0.0115568 +-0.144843 +0.18314 +0.074228 +776.648 +-0.0667222 +0.00236739 +0.955785 +0.358646 +-1.08711 +0.232665 +-0.00139241 +-0.0455285 +0.00311767 +-0.0140005 +0.123091 +0.613513 +0.169042 +0.461214 +0.158027 +-941.473 +38.8 +0.482601 +-0.212499 +-0.0227143 +0.327433 +0.17162 +-0.0141539 +0.306128 +0.448361 +0.149588 +0.192857 +1.25534 +0.452281 +-0.0442692 +0.159235 +-0.0593587 +-0.0526068 +4.76759 +-1.81114 +-0.0754533 +0.00553496 +38.1621 +-0.123433 +-0.00346643 +-389.812 +-0.0731863 +0.0890923 +-1016.59 +-1330.96 +0.140634 +0.394564 +0.451009 +0.498551 +0.337179 +937.916 +-1.62894 +2374.33 +-0.0283692 +0.177773 +-1.33531 +-56.913 +0.53653 +0.103225 +-0.0248233 +-1.09651 +0.0531398 +0.143585 +0.0945193 +0.325255 +0.0341797 +-0.530108 +-48.6372 +-0.403487 +-384.764 +-0.261059 +0.379937 +0.281268 +0.0781599 +0.0121186 +-0.0469509 +0.467753 +-0.0754533 +0.53653 +-0.177773 +0.143585 +-0.158027 +-0.0140005 +-1.33531 +937.916 +-0.0248233 +-0.498551 +-48.6372 +-0.144843 +0.0283692 +0.0341797 +0.232665 +0.339865 +0.461214 +384.764 +-0.0731863 +-0.0469509 +0.101339 +-1.81114 +0.161792 +0.0227143 +-0.0526068 +-0.212499 +4.76759 +38.1621 +0.0781599 +0.0442692 +-1.09651 +-0.0667222 +0.0121186 +1.08711 +0.261059 +-0.0141539 +-0.403487 +-0.325255 +0.123996 +0.159235 +-1016.59 +-56.913 +-776.648 +0.0945193 +0.166954 +0.202538 +0.530108 +0.199285 +0.255761 +-0.00346643 +-0.103225 +-0.00139241 +-941.473 +-0.00236739 +0.179964 +0.451009 +0.312212 +0.115869 +0.140634 +0.450949 +-0.123433 +38.8 +0.482601 +-0.074228 +0.166804 +0.613513 +1.62894 +-0.0890923 +-0.17162 +0.289221 +0.955785 +389.812 +1.25534 +0.0367747 +2374.33 +-1330.96 +0.0593587 +-0.00553496 +0.226397 +0.18314 +-0.0455285 +-0.00311767 +-0.0960574 +-0.0277623 +0.00651007 +0.0277623 +-3897.27 +0.0421279 +0.359395 +0.0108515 +-0.160836 +-0.0296088 +0.308417 +0.123091 +-0.726097 +776.648 +0.281183 +-0.010797 +-0.0296088 +-0.162896 +0.160836 +0.00227585 +-0.0481398 +386.539 +0.726097 +-0.076313 +0.260267 +0.100262 +0.397309 +0.0158796 +0.0333222 +-0.0108515 +-0.260267 +0.0444507 +0.217768 +0.0839861 +0.162896 +-0.0839861 +-386.539 +0.409164 +-0.00227585 +0.0526655 +-0.0526655 +-0.0421279 +-389.721 +0.010797 +0.49366 +-3897.08 +-0.00052924 +0.424533 +-4.55593 +-0.0593587 +-0.406433 +0.0748703 +6.17619e-05 +-0.0132897 +-1.43166 +1.10347 +0.406433 +-0.397309 +0.0593587 +-0.0333222 +-776.648 +0.0270346 +-0.0132897 +-0.0264454 +-0.142526 +-1.43166 +7800.77 +0.033936 +389.721 +-0.0115568 +0.0481398 +-0.00651007 +0.0960574 +6.17619e-05 +-0.076313 +-0.308417 +-1330.96 +0.488808 +0.363613 +-0.110102 +-0.0161033 +-0.0330982 +112.779 +0.0389464 +93.1075 +-101.139 +-9.20235 +-0.181382 +0.0507083 +0.299749 +-0.0439697 +-1.33531 +-0.521198 +0.624486 +0.248471 +0.0100031 +0.133462 +-0.181416 +-926.189 +1037.52 +0.0985512 +-0.0125119 +2.30787 +-1020.42 +0.68789 +-0.0375201 +-102.357 +0.208338 +4334.65 +0.129153 +-0.0306797 +385.388 +0.447022 +-941.584 +0.462998 +0.117741 +-1.54 +0.0111675 +-1069.1 +0.0231839 +-1.20473 +0.0487708 +1021.61 +1.25534 +-38.8124 +-0.0764976 +0.0107437 +-1.81114 +-57.6025 +0.497461 +-938.113 +0.334925 +0.0481398 +0.435705 +0.197646 +-38.6618 +-1.5288 +-47.2244 +-0.337222 +-0.0828652 +-919.993 +6.65338 +0.0214094 +388.46 +91.7568 +-0.0960574 +0.17083 +-0.0152097 +0.253096 +-0.00548262 +0.123809 +0.174421 +-0.0972213 +-11.8759 +0.0729971 +-0.184547 +-0.182641 +84.5177 +-941.584 +-0.521198 +-1069.1 +6.65338 +-1.20473 +-38.8124 +0.17083 +-0.00548262 +1037.52 +-0.181382 +0.0214094 +-102.357 +0.464554 +0.133462 +-1020.42 +-101.139 +0.624486 +0.347194 +0.248471 +-0.0306797 +0.254133 +0.311233 +0.0231839 +112.779 +0.0729971 +-38.6618 +0.0481398 +-919.993 +-0.182641 +-0.0972213 +-938.113 +-0.0375201 +2.30787 +-0.0828652 +388.46 +0.123809 +-0.0330982 +-57.6025 +-0.0152097 +0.197646 +-1.81114 +4334.65 +-926.189 +0.057522 +-9.20235 +-0.184547 +0.0507083 +91.7568 +-47.2244 +-0.0960574 +1021.61 +-1.54 +0.470657 +-0.0125119 +0.0111675 +0.0100031 +93.1075 +-0.0161033 +-1.33531 +0.199285 +-11.8759 +385.388 +-0.0439697 +0.117741 +0.495986 +84.5177 +0.223545 +0.295374 +0.086255 +-1330.96 +-0.0764976 +-0.337222 +0.68789 +-0.181416 +-1.5288 +1.25534 +-0.110102 +0.232462 +-0.0732764 +0.0645324 +0.078835 +-0.0308651 +-1.43166 +83.888 +-1136.29 +0.154083 +-843.805 +0.309991 +-0.0372216 +-0.0727184 +-0.40851 +11761.3 +0.00676233 +-0.647462 +-1069.1 +0.0551165 +-0.179964 +0.471714 +-0.0765286 +-1069.1 +113.893 +-1136.29 +-0.00637744 +-0.530108 +0.12819 +1022.1 +0.0334143 +0.154083 +-1.43166 +1.15425 +-0.391224 +1022.1 +0.300527 +0.12819 +-0.197646 +-0.197646 +0.183044 +-843.805 +-4.19182 +113.893 +0.0242525 +-926.149 +0.279752 +-0.177773 +0.224966 +-3896.99 +0.078835 +0.471714 +1.15425 +-0.647462 +-0.40851 +-0.530108 +-0.179964 +1.00606 +0.00266288 +390.383 +-0.177773 +-0.177623 +-3897.62 +-0.177623 +385.371 +0.321173 +0.281379 +83.888 +390.383 +385.371 +0.0317682 +0.263591 +-0.0353681 +-0.0372216 +0.00676233 +0.0242525 +-0.0353681 +0.0645324 +-926.149 +0.027968 +0.0342053 +-938.113 +-0.484504 +0.464981 +0.027968 +0.397309 +0.00527268 +937.916 +-0.0100963 +0.379937 +0.0342053 +-938.113 +-6.32833e-16 +-0.40851 +0.00516548 +-0.37335 +-941.584 +-941.584 +0.016102 +-0.0778239 +0.0678189 +0.365771 +937.916 +-0.00589175 +0.446446 +0.959843 +0.00155356 +-0.0319406 +0.583477 +-0.0133142 +0.0457523 +0.0982632 +-0.0740894 +0.446446 +-0.0133142 +0.00554188 +-0.28458 +-0.0100963 +0.0398147 +0.413315 +0.0162955 +8.41514e-16 +-0.397309 +-0.114823 +-0.00554188 +0.350393 +0.016102 +-941.473 +-0.0778239 +-941.473 +0.49366 +-0.00155356 +0.484504 +-1.73201 +-0.00516548 +-0.00189813 +3767.74 +0.0678189 +-0.00527268 +-0.28458 +-0.00589175 +0.00189813 +-0.00154004 +0.40851 +-0.00185284 +-0.0319406 +0.0162955 +-0.583477 +0.0398147 +0.00185284 +-0.114823 +-0.0740894 +0.413315 +937.916 +0.435683 +-938.113 +0.0342053 +0.00527268 +0.429927 +0.0162955 +-0.0133142 +0.40851 +0.433662 +-0.0740894 +0.0342053 +2.02581e-15 +0.00189813 +3767.74 +-1.73201 +-0.397309 +-0.00589175 +0.027968 +-0.114823 +-0.40851 +-941.473 +-0.0133142 +2.37769e-15 +-0.0319406 +0.413315 +-0.0740894 +0.277406 +-941.584 +-0.0319406 +-0.00154004 +0.016102 +-0.00527268 +0.397309 +0.413315 +0.00554188 +0.00185284 +-0.583477 +0.446446 +-0.00589175 +0.435713 +0.331174 +-941.473 +-0.28458 +0.583477 +0.027968 +-0.0778239 +0.484504 +-0.28458 +0.0162955 +-0.00516548 +0.352335 +-0.114823 +0.446446 +-0.00185284 +-0.37335 +-0.00554188 +-938.113 +-0.00189813 +-0.00155356 +0.387217 +0.0389464 +0.0678189 +0.0398147 +0.308979 +0.00155356 +-0.484504 +937.916 +0.00516548 +0.279752 +0.216323 +0.149588 +-0.0778239 +-0.0100963 +0.0398147 +0.0678189 +0.016102 +-0.0100963 +-941.584 +-8.73228e-16 +-0.0375201 +0.112376 +-0.585219 +-0.168908 +0.0375201 +0.346281 +0.142988 +-4.55593 +0.250645 +-0.122696 +-0.849592 +8.41514e-16 +-0.346281 +0.0294307 +-0.518555 +0.112376 +-0.57432 +0.346281 +0.849592 +0.0890923 +0.41415 +2.37769e-15 +-0.0220231 +0.0204115 +-0.0204115 +0.0204115 +-0.0890923 +-0.57432 +0.0890923 +0.849592 +-0.0220231 +-1328.29 +-0.0375201 +-0.0909791 +0.00410436 +0.00686361 +0.57432 +0.142988 +-0.0890923 +-0.122696 +0.0375201 +1347.13 +0.585219 +-0.0294307 +-0.518555 +0.0155029 +-0.0294307 +-4.19182 +-0.0204115 +0.57432 +-0.142988 +0.0155029 +-0.142988 +0.122696 +-0.000119449 +-0.168908 +-4.55593 +0.585219 +0.00410436 +0.223545 +-8.90424e-17 +0.122696 +0.394964 +-0.0909791 +-0.585219 +0.0294307 +-0.849592 +-4.19182 +-0.346281 +-0.000119449 +-0.154137 +-38.8124 +2.09744 +-0.0449153 +-0.00139059 +-0.824388 +0.0781599 +0.0108272 +0.0121846 +0.0348205 +-0.403487 +1.7046e-05 +0.559866 +-0.17412 +0.0100031 +-0.181416 +-0.223009 +0.0421317 +0.0475908 +0.411145 +-0.137338 +0.29241 +-0.00778484 +2.89767 +0.0360689 +-0.00126122 +-0.0372216 +0.0017499 +-0.00341712 +-47.2244 +-0.0169269 +-0.713025 +-0.00305095 +-1492.65 +0.226929 +-1177.74 +0.101353 +0.0244686 +0.254133 +0.0234001 +0.260267 +-0.243475 +0.227299 +2714.38 +-0.0134893 +-0.358846 +0.466903 +-0.0387499 +0.0154433 +-0.28458 +-0.0111965 +-0.123433 +0.0398147 +386.24 +-0.647139 +0.479698 +0.231427 +1211.09 +-0.00293026 +0.803843 +0.143585 +0.0425194 +0.346281 +-1171.15 +-0.101597 +-390.383 +-0.0333222 +0.124351 +0.21045 +0.0389266 +0.56814 +0.0469962 +0.00568033 +-0.0317089 +0.0960277 +1.91922 +0.0425194 +0.143585 +-0.647139 +-0.0372216 +-0.154137 +2.89767 +-0.28458 +0.0607212 +0.35173 +1211.09 +0.346281 +0.261719 +0.320816 +1.7046e-05 +0.00568033 +-0.137338 +0.0348205 +0.260267 +0.497461 +0.0469962 +0.0154433 +-1171.15 +-47.2244 +-0.0333222 +1.91922 +-0.0449153 +-0.0111965 +0.0244686 +0.0421317 +-0.824388 +0.124351 +-1177.74 +-0.181416 +-0.00293026 +-0.00341712 +0.320088 +0.0360689 +0.0017499 +-0.713025 +-38.8124 +0.116439 +-0.123433 +-390.383 +0.0398147 +-0.00139059 +-0.243475 +-0.00305095 +0.56814 +-0.0317089 +386.24 +-0.101597 +-0.0387499 +-0.358846 +0.0234001 +0.326135 +-0.0134893 +0.466903 +0.0389266 +0.464981 +0.559866 +0.411145 +0.448495 +0.0475908 +2714.38 +0.0108272 +-1492.65 +2.09744 +0.803843 +0.0100031 +-0.403487 +-0.17412 +-0.223009 +-0.00126122 +-0.0169269 +-0.00778484 +0.0781599 +0.318191 +-0.00441524 +-0.871894 +0.358846 +-0.361101 +1.08711 +-0.125467 +-0.125467 +-0.361101 +0.121793 +-0.00441524 +-0.0226327 +-0.0302927 +-0.00812452 +-0.168908 +0.365771 +0.358846 +-0.0316826 +-2.40273 +-8.72164 +-0.162958 +0.0278642 +0.000995693 +0.00188099 +386.24 +-0.110102 +-0.00020328 +0.0164578 +0.00188099 +0.0244629 +0.00455579 +0.081092 +-0.00836761 +-1.22162 +0.158027 +-0.0765286 +-385.388 +-0.463774 +-3896.99 +0.433662 +0.155346 +2.18802 +0.209259 +-0.110102 +0.335053 +0.0938044 +-0.871894 +0.0138805 +-1.22162 +0.128488 +-0.00812452 +0.0164578 +0.158027 +-0.0296088 +0.0938044 +-0.0296088 +3908.78 +-0.0226327 +-0.463774 +-0.0316826 +0.37963 +0.286048 +-0.0389695 +-0.162958 +-0.00836761 +0.0244629 +0.249794 +-0.00020328 +0.209259 +-2.40273 +386.24 +0.287869 +-0.0389695 +1.08711 +-385.388 +0.00205525 +0.484504 +0.38065 +0.484504 +0.0144878 +-1006.75 +-0.585219 +0.413395 +0.0793485 +-919.993 +-11.8759 +0.371591 +0.0183094 +0.216071 +-1178.34 +0.296378 +0.00105151 +0.0770916 +-0.144843 +0.0844287 +4.4773 +-1492.65 +-0.0146399 +521.724 +0.044391 +-1022.1 +-0.0449153 +0.0317682 +-0.0544554 +-0.010797 +-0.0102927 +-0.160889 +0.00131965 +0.0136511 +0.181698 +-0.167947 +-0.00845262 +38.1621 +-0.0919603 +0.161792 +-0.824388 +0.0835317 +0.00403492 +0.0415334 +0.0352938 +0.0985512 +0.198036 +-1.96468 +-0.215989 +0.1029 +0.0341797 +-0.110541 +-101.139 +-0.00468958 +-0.00300295 +-0.038754 +0.0292282 +0.0538814 +0.0662045 +-48.6372 +0.488867 +0.0052355 +0.685305 +-0.808359 +1170.79 +3646.59 +-1.22162 +-0.0388056 +0.0316826 +0.803843 +-102.357 +-0.0201849 +0.25875 +0.421527 +0.033936 +0.176759 +0.831819 +0.168613 +0.450072 +-0.0133142 +389.721 +0.446446 +113.893 +0.272957 +0.00300295 +-0.0449153 +-0.824388 +0.0146399 +-0.0388056 +-0.0919603 +0.308185 +0.0686423 +38.1621 +-0.0133142 +0.176759 +0.331345 +0.0341797 +-0.296378 +0.46413 +-0.215989 +0.0052355 +-0.808359 +0.477351 +0.585219 +0.148907 +-0.0544554 +0.038754 +0.0835317 +0.168613 +0.803843 +-1178.34 +-102.357 +4.4773 +-0.0352938 +-0.0844287 +-101.139 +0.010797 +-0.0316826 +-0.0415334 +0.00403492 +0.421527 +3646.59 +-919.993 +0.0538814 +0.0968143 +-521.724 +1.96468 +-11.8759 +0.831819 +0.27579 +0.485244 +0.0600066 +-0.160889 +-0.144843 +-1492.65 +-0.00845262 +0.140058 +-389.721 +0.0183094 +-0.00468958 +-0.167947 +-113.893 +0.419852 +0.685305 +0.1029 +0.413395 +-0.00131965 +1170.79 +1.22162 +0.0793485 +-48.6372 +0.0292282 +0.446446 +-0.216071 +0.0831705 +-0.00105151 +0.110541 +0.0102927 +1022.1 +-1006.75 +0.318191 +-0.0136511 +0.0952533 +0.298479 +-0.0201849 +0.261719 +0.0144878 +0.0247343 +2.0673 +-0.0247343 +-0.00931351 +0.0141999 +-521.724 +-0.0116852 +-0.00798257 +0.358928 +0.243475 +-0.243475 +-0.20399 +0.0165473 +-1.91922 +-0.296378 +-0.142526 +0.296378 +-0.212446 +-0.027308 +-384.764 +0.00035693 +0.242306 +-0.242306 +0.00931351 +0.0540287 +-2.40273 +-1136.29 +0.0116852 +-2.40273 +0.212446 +0.198036 +-0.518555 +0.0697438 +-0.462379 +-0.112973 +-0.192594 +0.146932 +-1021.61 +0.389811 +0.20399 +-0.583477 +-0.0540287 +-112.779 +0.462379 +6181.68 +1.21083 +0.583477 +-0.0372451 +0.00200577 +-0.17162 +0.419852 +1.91922 +0.447022 +0.0592611 +0.0531398 +521.724 +0.112973 +-1136.29 +0.0697438 +-3897.27 +0.0024964 +0.17162 +384.764 +-0.0141999 +112.779 +-1.21083 +-8.49839 +1021.61 +0.300527 +0.0024964 +0.192594 +-0.0427843 +-0.0308923 +0.0165473 +0.0372451 +0.446446 +-101.139 +1170.79 +-0.0136511 +-0.0352938 +-0.144843 +-0.00845262 +-0.0844287 +0.452281 +-0.0316826 +0.803843 +0.0386458 +0.0146399 +-0.160889 +38.1621 +0.038754 +-0.0201849 +-1178.34 +-521.724 +0.0052355 +-0.0449153 +0.362853 +0.0793485 +0.00403492 +-113.893 +0.421527 +-389.721 +-1492.65 +0.424533 +0.0463613 +0.0102927 +0.0292282 +0.168613 +0.0341797 +0.413395 +3646.59 +0.585219 +4.4773 +-0.167947 +-0.0415334 +0.00300295 +1.22162 +-102.357 +-11.8759 +0.0538814 +-0.0544554 +-0.00105151 +0.327617 +0.352485 +-0.296378 +-0.808359 +-0.0919603 +-1006.75 +1022.1 +-48.6372 +-0.824388 +0.179226 +-0.00468958 +-0.216071 +0.0835317 +0.1029 +0.209762 +0.831819 +0.010797 +-0.00131965 +-0.0388056 +0.0183094 +1.96468 +0.0144878 +0.110541 +0.176759 +-0.0133142 +-0.215989 +-919.993 +0.685305 +0.363291 +0.339813 +-0.0201849 +0.00131965 +0.831819 +-0.160889 +0.00105151 +-1022.1 +0.100262 +0.0292282 +-0.0133142 +0.137856 +0.803843 +0.1858 +0.27579 +-0.00300295 +-0.010797 +0.0415334 +0.413395 +-0.808359 +-0.144843 +-11.8759 +113.893 +-0.00468958 +-101.139 +0.446446 +0.0960277 +-0.167947 +-102.357 +-0.0449153 +0.0538814 +-919.993 +0.339747 +0.176759 +0.0352938 +0.0136511 +-0.824388 +-1178.34 +-48.6372 +0.0196557 +-1492.65 +-0.0919603 +0.296378 +4.4773 +-1.22162 +-0.0388056 +0.455083 +-0.00845262 +-1.96468 +0.421527 +-1006.75 +0.0844287 +389.721 +0.0316826 +-0.038754 +-0.0544554 +3646.59 +-0.585219 +0.190531 +0.0052355 +-0.110541 +0.0183094 +1170.79 +0.0341797 +521.724 +0.202756 +38.1621 +0.00403492 +-0.215989 +0.0835317 +0.216071 +0.1029 +0.0144878 +0.168613 +-0.0146399 +0.0793485 +-0.0102927 +0.685305 +-0.462379 +0.212446 +-0.112973 +0.289745 +384.764 +1.91922 +0.0165473 +0.00200577 +-0.0116852 +0.17162 +6181.68 +0.192594 +0.417864 +0.0372451 +-0.027308 +112.779 +0.488808 +0.0894851 +0.0540287 +-2.40273 +1021.61 +0.000271006 +-0.192594 +-0.242306 +-1021.61 +-0.243475 +-0.212446 +-0.518555 +0.0697438 +-0.142526 +-0.20399 +0.403972 +0.0116852 +0.462379 +0.0555941 +0.112973 +0.339865 +-0.583477 +-1.91922 +-8.49839 +0.0999725 +-0.0308923 +0.178313 +0.296378 +0.0024964 +-112.779 +0.00931351 +2.0673 +-0.00798257 +521.724 +-0.0372451 +0.0165473 +-3897.27 +0.0247343 +-0.00931351 +0.0024964 +0.20399 +1.21083 +0.0592611 +-0.17162 +0.0141999 +0.374645 +0.0697438 +-521.724 +-0.0141999 +0.242306 +-0.296378 +-1.21083 +-2.40273 +-384.764 +0.243475 +-1136.29 +0.583477 +0.05414 +0.371591 +-0.0247343 +-1136.29 +-0.0427843 +0.00035693 +-0.0540287 +0.13479 +0.219142 +-0.00293026 +-0.101597 +-38.8124 +-0.346281 +0.698114 +-1492.65 +-0.0360689 +-0.17412 +-386.24 +-0.0449153 +0.0425194 +0.307602 +0.803843 +0.466903 +390.383 +0.226397 +-0.137338 +0.41606 +-0.0387499 +0.0508306 +-0.00341712 +-0.0154433 +0.0372216 +0.124351 +0.0523879 +-0.647139 +0.559866 +0.00139059 +0.00305095 +-2.09744 +0.113175 +-0.411145 +-0.181416 +1.7046e-05 +-0.824388 +-0.260267 +0.143585 +0.358846 +0.303138 +0.0108272 +-0.713025 +-0.154137 +0.0398147 +0.414273 +0.495495 +0.0475908 +-0.0134893 +0.0317089 +0.56814 +0.223009 +0.0333222 +-1171.15 +2.89767 +0.0234001 +0.428488 +0.0244686 +-0.28458 +0.243475 +0.00126122 +2714.38 +-1.91922 +0.0469962 +0.0348205 +-47.2244 +0.0100031 +0.0389266 +0.300643 +1211.09 +0.0781599 +-0.00568033 +0.00778484 +-0.0017499 +-0.0169269 +-0.403487 +0.381262 +0.0421317 +0.0111965 +-1177.74 +-0.123433 +0.0475908 +-0.0017499 +-0.346281 +0.00305095 +0.0244686 +0.0333222 +0.197094 +-0.647139 +-0.411145 +1.7046e-05 +-0.713025 +0.614401 +0.143585 +-2.09744 +0.0781599 +-0.824388 +-0.0154433 +-0.137338 +0.466903 +-0.17412 +-0.0134893 +-47.2244 +2714.38 +-0.00341712 +2.89767 +-38.8124 +-0.00293026 +0.0469962 +-1492.65 +-0.260267 +-1171.15 +0.210711 +-386.24 +0.0421317 +0.0555941 +0.0425194 +0.803843 +0.358846 +0.00778484 +0.515715 +-1177.74 +0.223009 +0.355883 +0.164035 +0.0463613 +-0.0449153 +390.383 +0.0100031 +0.0662045 +-0.0387499 +0.56814 +0.0111965 +-0.154137 +-0.123433 +0.355977 +-0.181416 +-0.28458 +-0.101597 +-0.00568033 +1211.09 +0.0108272 +0.559866 +-1.91922 +0.350393 +0.0348205 +0.0234001 +0.0398147 +0.00126122 +-0.0169269 +-0.403487 +0.0389266 +0.243475 +0.124351 +0.30809 +0.0317089 +0.00139059 +0.0372216 +-0.0360689 +0.110102 +0.380577 +-0.168908 +-0.00020328 +0.162958 +-0.00441524 +-0.0938044 +0.110102 +-0.0244629 +-0.00188099 +0.00836761 +-0.00188099 +-0.209259 +-0.125467 +0.463774 +3908.78 +-0.358846 +0.0226327 +0.358069 +-3896.99 +-0.00020328 +-0.484504 +0.463774 +0.128722 +-0.0296088 +385.388 +0.00836761 +0.361101 +0.0316826 +-0.158027 +0.0316826 +0.871894 +-2.40273 +-0.358846 +-386.24 +1.22162 +-1.08711 +0.998046 +-0.158027 +2.18802 +-0.0765286 +-1.08711 +0.162958 +0.128488 +-0.0296088 +1.22162 +0.000995693 +0.00455579 +-386.24 +0.0389695 +0.0138805 +385.388 +-0.0938044 +-0.125467 +-0.0302927 +-0.484504 +-0.0164578 +0.0389695 +0.486843 +0.00812452 +-8.72164 +-0.0244629 +0.00205525 +0.14843 +-0.209259 +0.871894 +0.0226327 +0.361101 +-0.00441524 +-2.40273 +-0.0164578 +0.00812452 +0.308417 +-0.00154004 +-1171.15 +0.00488976 +0.281183 +0.000503376 +0.495986 +-1177.74 +0.0570756 +0.0839516 +-1178.34 +-0.271408 +-1171.15 +-0.242306 +0.331345 +0.955785 +-0.0262496 +0.410233 +0.387547 +-0.0262496 +0.221032 +0.00248795 +0.0111675 +0.0173523 +0.0186254 +-0.00215333 +0.0570756 +0.0944766 +4713.21 +0.251176 +-0.0171316 +0.339694 +-1.5288 +-0.0188819 +0.955785 +0.0839516 +0.221032 +-1.73201 +0.0183012 +-0.0865195 +0.448458 +-0.463774 +-0.0865195 +0.482601 +0.428712 +0.0122115 +-0.271408 +-1177.74 +-1178.34 +0.352335 +-0.471714 +0.0186254 +1170.79 +-0.0136747 +-8.90424e-17 +0.00488976 +-0.0188819 +0.0944766 +-1.5288 +1170.79 +0.471714 +-0.0171316 +0.463774 +-0.00103177 +-1.45664e-15 +0.482601 +0.28082 +0.00215333 +0.00103177 +0.242306 +1.40761 +-0.00248795 +0.0111675 +-0.308417 +-0.000503376 +-0.0183012 +0.0122115 +0.0136747 +0.161947 +0.0186254 +0.482601 +0.482601 +0.0567782 +-0.0183012 +0.0062741 +1170.79 +0.471714 +-0.00154004 +0.242306 +-1.5288 +0.955785 +-0.00215333 +-0.0188819 +0.00488976 +0.00215333 +0.0570756 +-0.0136747 +-1171.15 +-8.73228e-16 +0.125976 +-1171.15 +0.221032 +0.0457523 +0.166954 +4713.21 +-1.73201 +0.0476803 +0.00248795 +-1177.74 +0.955785 +-1178.34 +0.403491 +1.40761 +-0.308417 +0.0122115 +0.00103177 +0.000503376 +-0.242306 +0.0944766 +-0.0865195 +-0.271408 +0.0839516 +0.0122115 +1170.79 +0.00488976 +0.0111675 +0.0111675 +-0.471714 +0.0136747 +0.40486 +0.487793 +0.0570756 +-0.463774 +-3.14819e-15 +-0.00248795 +0.463774 +-0.000503376 +-1.5288 +-0.0262496 +-0.0865195 +0.0183012 +-1177.74 +-0.0171316 +0.0186254 +0.308417 +0.0944766 +-0.271408 +0.0839516 +0.38065 +0.221032 +-1178.34 +-0.0171316 +-0.0262496 +-0.0188819 +-0.00103177 +-0.0779926 +0.000528505 +0.0116595 +0.0409264 +-1.62894 +1.62894 +-1.96468 +-0.00220184 +-0.0116595 +2.09744 +0.383596 +0.0128916 +-2.09744 +0.000528505 +-2.30787 +-3.14819e-15 +0.217768 +0.035592 +0.314077 +-2.30787 +-0.0128916 +0.281268 +-0.00220184 +-0.00568056 +0.0556577 +1.96468 +0.0390101 +-1328.29 +-0.00568056 +-0.0128916 +2.02581e-15 +0.0532159 +-0.0532159 +-0.0597699 +-8.49839 +-0.0532159 +1363.08 +0.383596 +0.428354 +0.279587 +0.0102405 +2.09744 +0.214227 +1.62894 +-0.0779926 +-0.383596 +-0.0116595 +-2.09744 +-0.391224 +0.197094 +-0.314077 +-8.49839 +-8.72164 +-1.45664e-15 +0.0116595 +-0.391224 +0.0779926 +-8.72164 +0.0128916 +0.0444507 +0.140058 +1.96468 +0.00686361 +0.0556577 +0.0102405 +0.314077 +-0.314077 +-1.62894 +-0.383596 +-1.96468 +0.217768 +0.0779926 +-6.32833e-16 +0.0532159 +2.30787 +2.30787 +-0.0597699 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 diff --git a/external/ldl/Matrix/A23 b/external/ldl/Matrix/A23 new file mode 100644 index 00000000..741d99b7 --- /dev/null +++ b/external/ldl/Matrix/A23 @@ -0,0 +1,267 @@ +name: HB/bcsstm02 n: 66 entries: 66 +66 0 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +0.0921386 +0.0921386 +0.0921386 +0.137996 +0.137996 +0.137996 +0.137996 +0.137996 +0.137996 +0.0921386 +0.0921386 +0.0921386 +0.172829 +0.172829 +0.172829 +0.0852384 +0.0852384 +0.0852384 +0.0852384 +0.0852384 +0.0852384 +0.172829 +0.172829 +0.172829 +0.0617332 +0.0617332 +0.0617332 +0.141308 +0.141308 +0.141308 +0.141308 +0.141308 +0.141308 +0.0617332 +0.0617332 +0.0617332 +0.125427 +0.125427 +0.125427 +0.0533209 +0.0533209 +0.0533209 +0.0533209 +0.0533209 +0.0533209 +0.125427 +0.125427 +0.125427 +0.0231706 +0.0231706 +0.0231706 +0.0305932 +0.0305932 +0.0305932 +0.0648569 +0.0648569 +0.0648569 +0.0648569 +0.0648569 +0.0648569 +0.0305932 +0.0305932 +0.0305932 +0.0197469 +0.0197469 +0.0197469 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 diff --git a/external/ldl/Matrix/A24 b/external/ldl/Matrix/A24 new file mode 100644 index 00000000..8912d957 --- /dev/null +++ b/external/ldl/Matrix/A24 @@ -0,0 +1,279 @@ +name: HB/bcsstm02 n: 66 entries: 72 (jumbled version) +66 1 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +13 +14 +15 +17 +18 +19 +20 +21 +22 +23 +24 +25 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +42 +43 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +66 +67 +68 +69 +70 +71 +72 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +11 +12 +13 +14 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +37 +38 +39 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +59 +60 +61 +62 +63 +64 +65 +0.0921386 +0.0921386 +0.0921386 +0.137996 +0.137996 +0.137996 +0.137996 +0.137996 +0.137996 +0.0921386 +0.0921386 +0.0921386 +0.164449 +0.172829 +0.172829 +0.172829 +0.0039726 +0.0852384 +0.0852384 +0.0852384 +0.0852384 +0.0852384 +0.0852384 +0.172829 +0.172829 +0.0606723 +0.172829 +0.0617332 +0.0617332 +0.0617332 +0.141308 +0.141308 +0.141308 +0.141308 +0.141308 +0.141308 +0.0617332 +0.0617332 +0.0617332 +0.125427 +0.125427 +0.13326 +0.125427 +0.160695 +0.0533209 +0.0533209 +0.0533209 +0.0533209 +0.0533209 +0.0533209 +0.125427 +0.125427 +0.125427 +0.0231706 +0.0231706 +0.0231706 +0.0305932 +0.0305932 +0.0305932 +0.0648569 +0.0648569 +0.0648569 +0.0648569 +0.0648569 +0.15651 +0.0648569 +0.0305932 +0.0305932 +0.0305932 +0.0197469 +0.0197469 +0.0197469 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 diff --git a/external/ldl/Matrix/A25 b/external/ldl/Matrix/A25 new file mode 100644 index 00000000..ed2cc0ca --- /dev/null +++ b/external/ldl/Matrix/A25 @@ -0,0 +1,5 @@ +name: Dense/0 n: 0 entries: 0 (invalid matrix, Ap [0] = 1) +0 0 +1 +0 +0 diff --git a/external/ldl/Matrix/A26 b/external/ldl/Matrix/A26 new file mode 100644 index 00000000..dd14c8e8 --- /dev/null +++ b/external/ldl/Matrix/A26 @@ -0,0 +1,15 @@ +name: Dense/2 n: 2 entries: 4 (invalid perm, P[1]=99) +2 0 +0 +2 +4 +0 +1 +0 +1 +1.78915 +0.389047 +0.389047 +1.67505 +0 +99 diff --git a/external/ldl/Matrix/A27 b/external/ldl/Matrix/A27 new file mode 100644 index 00000000..9803cf75 --- /dev/null +++ b/external/ldl/Matrix/A27 @@ -0,0 +1,27 @@ +name: Dense/3 n: 3 entries: 9 (invalid perm) +3 0 +0 +3 +6 +9 +0 +1 +2 +0 +1 +2 +0 +1 +2 +1.92648 +0.776267 +0.405764 +0.776267 +1.68063 +0.250703 +0.405764 +0.250703 +1.44517 +0 +1 +1 diff --git a/external/ldl/Matrix/A28 b/external/ldl/Matrix/A28 new file mode 100644 index 00000000..0bf505ef --- /dev/null +++ b/external/ldl/Matrix/A28 @@ -0,0 +1,27 @@ +name: Dense/3 n: 3 entries: 9 (invalid Ap) +3 0 +0 +3 +2 +9 +0 +1 +2 +0 +1 +2 +0 +1 +2 +1.92648 +0.776267 +0.405764 +0.776267 +1.68063 +0.250703 +0.405764 +0.250703 +1.44517 +0 +1 +2 diff --git a/external/ldl/Matrix/A29 b/external/ldl/Matrix/A29 new file mode 100644 index 00000000..4dcf64d3 --- /dev/null +++ b/external/ldl/Matrix/A29 @@ -0,0 +1,27 @@ +name: Dense/3 n: 3 entries: 9 (invalid Ai) +3 0 +0 +3 +6 +9 +0 +1 +3 +0 +1 +2 +0 +1 +2 +1.92648 +0.776267 +0.405764 +0.776267 +1.68063 +0.250703 +0.405764 +0.250703 +1.44517 +0 +1 +2 diff --git a/external/ldl/Matrix/A30 b/external/ldl/Matrix/A30 new file mode 100644 index 00000000..a0b9f0ad --- /dev/null +++ b/external/ldl/Matrix/A30 @@ -0,0 +1,27 @@ +name: Dense/3 n: 3 entries: 9 (invalid Ai) +3 0 +0 +3 +6 +9 +0 +-1 +2 +0 +1 +2 +0 +1 +2 +1.92648 +0.776267 +0.405764 +0.776267 +1.68063 +0.250703 +0.405764 +0.250703 +1.44517 +0 +1 +2 diff --git a/external/ldl/src/ldl.c b/external/ldl/Source/ldl.c similarity index 100% rename from external/ldl/src/ldl.c rename to external/ldl/Source/ldl.c diff --git a/external/ldl/include/ldl.h b/external/ldl/include/ldl.h deleted file mode 100644 index df36abb2..00000000 --- a/external/ldl/include/ldl.h +++ /dev/null @@ -1,123 +0,0 @@ -/* ========================================================================== */ -/* === ldl.h: include file for the LDL package ============================= */ -/* ========================================================================== */ - -/* Copyright (c) Timothy A Davis, http://www.suitesparse.com. - * All Rights Reserved. See LDL/Doc/License.txt for the License. - * - * Stripped down by Alexander Domahidi, 2012. - */ - -#include "../../include/glblopts.h" -#include "../../include/ecos.h" - -#include "SuiteSparse_config.h" - -#ifdef LDL_LONG -#define LDL_int SuiteSparse_long -#define LDL_ID SuiteSparse_long_id - -#define LDL_symbolic2 ldl_l_symbolic2 -#define LDL_numeric2 ldl_l_numeric2 -#define LDL_lsolve ldl_l_lsolve -#define LDL_lsolve2 ldl_l_lsolve2 -#define LDL_dsolve ldl_l_dsolve -#define LDL_ltsolve ldl_l_ltsolve -#define LDL_perm ldl_l_perm -#define LDL_permt ldl_l_permt -#define LDL_valid_perm ldl_l_valid_perm -#define LDL_valid_matrix ldl_l_valid_matrix - -#else -#define LDL_int int -#define LDL_ID "%d" - -#define LDL_symbolic2 ldl_symbolic2 -#define LDL_numeric2 ldl_numeric2 -#define LDL_lsolve ldl_lsolve -#define LDL_lsolve2 ldl_lsolve2 -#define LDL_dsolve ldl_dsolve -#define LDL_ltsolve ldl_ltsolve -#define LDL_perm ldl_perm -#define LDL_permt ldl_permt -#define LDL_valid_perm ldl_valid_perm -#define LDL_valid_matrix ldl_valid_matrix - -#endif - -/* ========================================================================== */ -/* === int version ========================================================== */ -/* ========================================================================== */ - -void ldl_symbolic2 (int n, int Ap [ ], int Ai [ ], int Lp [ ], int Parent [ ], int Lnz [ ], int Flag [ ]) ; - -int ldl_numeric2 (int n, int Ap [ ], int Ai [ ], double Ax [ ], - int Lp [ ], int Parent [ ], int Sign[], double eps, double delta, int Lnz [ ], int Li [ ], double Lx [ ], - double D [ ], double Y [ ], int Pattern [ ], int Flag [ ] -#if PROFILING > 1 - ,double *t1, double *t2 -#endif - ) ; - -void ldl_lsolve (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ]) ; -void ldl_lsolve2 (int n, double B [], int Lp [ ], int Li [ ], double Lx [ ], double X [ ]) ; - -void ldl_dsolve (int n, double X [ ], double D [ ]) ; - -void ldl_ltsolve (int n, double X [ ], int Lp [ ], int Li [ ], - double Lx [ ]) ; - -void ldl_perm (int n, double X [ ], double B [ ], int P [ ]) ; -void ldl_permt (int n, double X [ ], double B [ ], int P [ ]) ; - -int ldl_valid_perm (int n, int P [ ], int Flag [ ]) ; -int ldl_valid_matrix ( int n, int Ap [ ], int Ai [ ]) ; - -/* ========================================================================== */ -/* === long version ========================================================= */ -/* ========================================================================== */ - -void ldl_l_symbolic2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], - SuiteSparse_long Ai [ ], SuiteSparse_long Lp [ ], - SuiteSparse_long Parent [ ], SuiteSparse_long Lnz [ ], - SuiteSparse_long Flag [ ]); - -SuiteSparse_long ldl_l_numeric2 (SuiteSparse_long n, SuiteSparse_long Ap [ ], - SuiteSparse_long Ai [ ], double Ax [ ], SuiteSparse_long Lp [ ], - SuiteSparse_long Parent [ ], SuiteSparse_long Sign [ ], double eps, double delta, SuiteSparse_long Lnz [ ], - SuiteSparse_long Li [ ], double Lx [ ], double D [ ], double Y [ ], - SuiteSparse_long Pattern [ ], SuiteSparse_long Flag [ ] -#if PROFILING > 1 - ,double *t1, double *t2 -#endif - ) ; - -void ldl_l_lsolve (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ]) ; -void ldl_l_lsolve2 (SuiteSparse_long n, double B [ ], SuiteSparse_long Lp [ ], SuiteSparse_long Li [ ], double Lx [ ], double X [ ]) ; - -void ldl_l_dsolve (SuiteSparse_long n, double X [ ], double D [ ]) ; - -void ldl_l_ltsolve (SuiteSparse_long n, double X [ ], SuiteSparse_long Lp [ ], - SuiteSparse_long Li [ ], double Lx [ ]) ; - -void ldl_l_perm (SuiteSparse_long n, double X [ ], double B [ ], - SuiteSparse_long P [ ]) ; -void ldl_l_permt (SuiteSparse_long n, double X [ ], double B [ ], - SuiteSparse_long P [ ]) ; - -SuiteSparse_long ldl_l_valid_perm (SuiteSparse_long n, SuiteSparse_long P [ ], - SuiteSparse_long Flag [ ]) ; -SuiteSparse_long ldl_l_valid_matrix ( SuiteSparse_long n, - SuiteSparse_long Ap [ ], SuiteSparse_long Ai [ ]) ; - -/* ========================================================================== */ -/* === LDL version ========================================================== */ -/* ========================================================================== */ - -#define LDL_DATE "May 4, 2016, with dynamic regularization by A. Domahidi" -#define LDL_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define LDL_MAIN_VERSION 2 -#define LDL_SUB_VERSION 2 -#define LDL_SUBSUB_VERSION 6 -#define LDL_VERSION LDL_VERSION_CODE(LDL_MAIN_VERSION,LDL_SUB_VERSION) -